Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Беды и победы
кроссплатформенной мобильной
разработки на C#
Артур Дробинский,
архитектор DPLabs
http://arturdr.ru
Количество PC/смартфонов в мире
C# везде!
2.5 миллиарда устройств
Write once run anywhere
Нативный UI на каждой платформе
Новые возможности - 2013
• Portable Class Library -
Один общий проект с
бизнес-логикой –
используется на всех
платформах!
• Раньше: по проекту на
п...
Portable Class Libraries
• Раньше: • Сейчас:
Множество существующих
наработок
• За последний год количество
кросплатформенных библиотек выросло в
разы.
– JSON.Net
– Au...
Архитектурные подходы
• Кроссплатформенная разработка – это
ваш шанс грамотно и уместно применить
многие известные шаблоны...
Практические проблемы
реальных приложений
Memory leak
• iOS - Circular References
public class CustomView : UIView
{
UIViewController parent;
public CustomView(UIVi...
Memory leak
• iOS - Circular References
public class PuzzleController : UIViewController
{
public override void ViewDidLoa...
Memory leak
• iOS – HeapShot to the rescue!
Memory leak
• Android – работа с изображениями
C# ImageView
32 bytes
Native Drawable
3Mb
Производительность Garbage
Collector
• Мнение: языки со сборкой мусора априори
в 30 раз медленнее «нативных» (о
динамическ...
GC и «тяжелые» деревья объектов
• «Тяжелые» объекты лучше делать
статическими
public class DownloadCache
{
private Diction...
Приложение за 15 минут!
Приложение за 15 минут!
• MvvmCross
• Ninja Coder for MvvmCross
• UserInteraction plugin for MvvmCross
• SignalR
• Genymot...
Спасибо!
Вопросы?
Артур Дробинский,
http://arturdr.ru
info@arturdr.ru
Run a C# app, get a C# shirt
http://xamarin.com/sharp-shirt
Workflow разработки
Модульное тестирование
• NUnitLite.Portable
– аналог Nunit
– Runner’ы на всех платформах + UI для iOS.
– Moq на iOS
не раб...
Модульное тестирование
• FluentAssertions.Portable
string actual = "AABCDEFGHI";
actual.Should().StartWith("AB")
.And.EndW...
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки
DevPro-2014: Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки
Upcoming SlideShare
Loading in …5
×

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

4,718 views

Published on

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Беды и победы кроссплатформенной мобильной разработки на C# Артур Дробинский, архитектор DPLabs
  2. 2. http://arturdr.ru
  3. 3. Количество PC/смартфонов в мире
  4. 4. C# везде!
  5. 5. 2.5 миллиарда устройств
  6. 6. Write once run anywhere
  7. 7. Нативный UI на каждой платформе
  8. 8. Новые возможности - 2013
  9. 9. • Portable Class Library - Один общий проект с бизнес-логикой – используется на всех платформах! • Раньше: по проекту на платформу (общие файлы линкуются) – проблемы с рефакторингом
  10. 10. Portable Class Libraries • Раньше: • Сейчас:
  11. 11. Множество существующих наработок • За последний год количество кросплатформенных библиотек выросло в разы. – JSON.Net – Autofac/Ninject.Portable/etc – MetroLog – Stampsy.Social (авторизация через соц. сети) – WebSockets (SignalR, xSockets) – Геопозиционирование (встроенные средства MVVMCross) – etc.
  12. 12. Архитектурные подходы • Кроссплатформенная разработка – это ваш шанс грамотно и уместно применить многие известные шаблоны проектирования – Inversion Of Control, DI-контейнеры (сходные API на разных платформах реализованы по разному – MVVM – повторное использование ViewModel для разных View – Асинхронные взаимодействия и параллелизация вычислений – Нет блокировкам UI потока.
  13. 13. Практические проблемы реальных приложений
  14. 14. 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)); } }
  15. 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(); } }
  16. 16. Memory leak • iOS – HeapShot to the rescue!
  17. 17. Memory leak • Android – работа с изображениями C# ImageView 32 bytes Native Drawable 3Mb
  18. 18. Производительность Garbage Collector • Мнение: языки со сборкой мусора априори в 30 раз медленнее «нативных» (о динамических языках: JavaScript, Ruby, etc.) http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/
  19. 19. 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]; } }
  20. 20. Приложение за 15 минут!
  21. 21. Приложение за 15 минут! • MvvmCross • Ninja Coder for MvvmCross • UserInteraction plugin for MvvmCross • SignalR • Genymotion (Android x86)
  22. 22. Спасибо! Вопросы? Артур Дробинский, http://arturdr.ru info@arturdr.ru
  23. 23. Run a C# app, get a C# shirt http://xamarin.com/sharp-shirt
  24. 24. Workflow разработки
  25. 25. Модульное тестирование • NUnitLite.Portable – аналог Nunit – Runner’ы на всех платформах + UI для iOS. – Moq на iOS не работает 
  26. 26. Модульное тестирование • 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);

×