devpro-2014: Кроссплатформенное приложение за 15 минут или...
TRANSCRIPT
![Page 1: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/1.jpg)
Беды и победы кроссплатформенной мобильной разработки на C#
Артур Дробинский, архитектор DPLabs
![Page 3: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/3.jpg)
![Page 4: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/4.jpg)
Количество PC/смартфонов в мире
![Page 5: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/5.jpg)
C# везде!
![Page 6: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/6.jpg)
2.5 миллиарда устройств
![Page 7: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/7.jpg)
Write once run anywhere
![Page 8: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/8.jpg)
Нативный UI на каждой платформе
![Page 9: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/9.jpg)
Новые возможности - 2013
![Page 10: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/10.jpg)
• Portable Class Library - Один общий проект с бизнес-логикой – используется на всех платформах!
• Раньше: по проекту на платформу (общие файлы линкуются) – проблемы с рефакторингом
![Page 11: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/11.jpg)
Portable Class Libraries• Раньше: • Сейчас:
![Page 12: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/12.jpg)
Множество существующих наработок
• За последний год количество кросплатформенных библиотек выросло в разы.– JSON.Net– Autofac/Ninject.Portable/etc– MetroLog– Stampsy.Social (авторизация через соц. сети)– WebSockets (SignalR, xSockets)– Геопозиционирование (встроенные средства
MVVMCross)– etc.
![Page 13: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/13.jpg)
Архитектурные подходы
• Кроссплатформенная разработка – это ваш шанс грамотно и уместно применить многие известные шаблоны проектирования– Inversion Of Control, DI-контейнеры (сходные API
на разных платформах реализованы по разному– MVVM – повторное использование ViewModel
для разных View– Асинхронные взаимодействия и параллелизация
вычислений – Нет блокировкам UI потока.
![Page 14: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/14.jpg)
Практические проблемы реальных приложений
![Page 15: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/15.jpg)
![Page 16: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/16.jpg)
![Page 17: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/17.jpg)
Memory leak• iOS - Circular References public class CustomView : UIView { UIViewController parent; public CustomView(UIViewController parent) { this.parent = parent; } } public class PuzzleController : UIViewController { public override void ViewDidLoad() { View.Add(new CustomView(this)); } }
![Page 18: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/18.jpg)
Memory leak• iOS - Circular References
public class PuzzleController : UIViewController { public override void ViewDidLoad() { var button = new CustomButton(); View.Add(button); button.TouchUpInside += (sender, e) => this.RemoveFromParentViewController(); } }
![Page 19: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/19.jpg)
Memory leak• iOS – HeapShot to the rescue!
![Page 20: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/20.jpg)
Memory leak• Android – работа с изображениями
C# ImageView32 bytes
Native Drawable
3Mb
![Page 21: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/21.jpg)
Производительность Garbage Collector
• Мнение: языки со сборкой мусора априори в 30 раз медленнее «нативных» (о динамических языках: JavaScript, Ruby, etc.)
http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/
![Page 22: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/22.jpg)
GC и «тяжелые» деревья объектов
• «Тяжелые» объекты лучше делать статическими
public class DownloadCache { private Dictionary<Uri, string> _commitCache;
string GetUri(Uri uri) { return _commitCache[uri]; } }
public class DownloadCache { private static Dictionary<Uri, string> _commitCache;
string GetUri(Uri uri) { return _commitCache[uri]; } }
![Page 23: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/23.jpg)
Приложение за 15 минут!
![Page 24: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/24.jpg)
Приложение за 15 минут!
• MvvmCross• Ninja Coder for MvvmCross• UserInteraction plugin for MvvmCross• SignalR
• Genymotion (Android x86)
![Page 27: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/27.jpg)
Workflow разработки
![Page 28: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/28.jpg)
Модульное тестирование• NUnitLite.Portable– аналог Nunit– Runner’ы на всех платформах + UI для iOS.– Moq на iOS не работает
![Page 29: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки](https://reader035.vdocuments.pub/reader035/viewer/2022081516/556fdaedd8b42af8088b4ce6/html5/thumbnails/29.jpg)
Модульное тестирование
• FluentAssertions.Portable
string actual = "AABCDEFGHI"; actual.Should().StartWith("AB") .And.EndWith("HI") .And.Contain("EF") .And.HaveLength(9);
string actual = "AABCDEFGHI";
Assert.IsTrue(actual.StartsWith("AB")); Assert.IsTrue(actual.EndsWith("HI")); Assert.IsTrue(actual.Contains("EF")); Assert.AreEqual(9, actual.Length);