Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Беды и победы
кроссплатформенной мобильной
разработки на 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 минут или Беды и победы мобильной разработки
Prochain SlideShare
Chargement dans…5
×

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

4 747 vues

Publié le

Publié dans : Logiciels
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

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

×