29
Беды и победы кроссплатформенной мобильной разработки на C# Артур Дробинский, архитектор DPLabs

DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Embed Size (px)

Citation preview

Page 1: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Беды и победы кроссплатформенной мобильной разработки на C#

Артур Дробинский, архитектор DPLabs

Page 2: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

http://arturdr.ru

Page 3: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки
Page 4: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Количество PC/смартфонов в мире

Page 5: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

C# везде!

Page 6: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

2.5 миллиарда устройств

Page 7: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Write once run anywhere

Page 8: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Нативный UI на каждой платформе

Page 9: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Новые возможности - 2013

Page 10: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

• Portable Class Library - Один общий проект с бизнес-логикой – используется на всех платформах!

• Раньше: по проекту на платформу (общие файлы линкуются) – проблемы с рефакторингом

Page 11: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Portable Class Libraries• Раньше: • Сейчас:

Page 12: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Множество существующих наработок

• За последний год количество кросплатформенных библиотек выросло в разы.– JSON.Net– Autofac/Ninject.Portable/etc– MetroLog– Stampsy.Social (авторизация через соц. сети)– WebSockets (SignalR, xSockets)– Геопозиционирование (встроенные средства

MVVMCross)– etc.

Page 13: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Архитектурные подходы

• Кроссплатформенная разработка – это ваш шанс грамотно и уместно применить многие известные шаблоны проектирования– Inversion Of Control, DI-контейнеры (сходные API

на разных платформах реализованы по разному– MVVM – повторное использование ViewModel

для разных View– Асинхронные взаимодействия и параллелизация

вычислений – Нет блокировкам UI потока.

Page 14: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Практические проблемы реальных приложений

Page 15: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки
Page 16: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки
Page 17: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

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 минут или Беды и победы мобильной разработки

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 минут или Беды и победы мобильной разработки

Memory leak• iOS – HeapShot to the rescue!

Page 20: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Memory leak• Android – работа с изображениями

C# ImageView32 bytes

Native Drawable

3Mb

Page 21: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Производительность Garbage Collector

• Мнение: языки со сборкой мусора априори в 30 раз медленнее «нативных» (о динамических языках: JavaScript, Ruby, etc.)

http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/

Page 22: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

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 минут или Беды и победы мобильной разработки

Приложение за 15 минут!

Page 24: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Приложение за 15 минут!

• MvvmCross• Ninja Coder for MvvmCross• UserInteraction plugin for MvvmCross• SignalR

• Genymotion (Android x86)

Page 25: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Спасибо!Вопросы?

Артур Дробинский, http://[email protected]

Page 26: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Run a C# app, get a C# shirt

http://xamarin.com/sharp-shirt

Page 27: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Workflow разработки

Page 28: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Модульное тестирование• NUnitLite.Portable– аналог Nunit– Runner’ы на всех платформах + UI для iOS.– Moq на iOS не работает

Page 29: DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки

Модульное тестирование

• 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);