Наверное, каждый .NET разработчик, знакомясь с monodroid и monotouch, хочет узнать, что его ждет. Стоит ли тратить свои силы и время на изучение, какой потенциал платформы, не превратится ли разработка в тестирование фреймворка?
Уже больше года моей основной задачей является разработка на C# под Android и IOS, и я постараюсь ответить на основные вопросы, возникающие при выборе monotouch и monodroid. В статье будет много личного мнения и описания костылей, так как ответы по техническим вопросам можно легко найти на официальном сайте Xamarin: docs.xamarin.com
Поскольку Xamarin 3 вышел только недавно, мне не удалось полностью прощупать новые возможности и изменения в платформе. Тем не менее, почти все «особенности» разработки в monotouch и monodroid по-прежнему актуальны.
Разработка
Взаимодействие с платформой Android и IOS реализуется по средствам прокси библиотек Mono.Android и monotouch. Так же, прозрачно реализована мультиплатформенность в System.IO, System.Net, System.Data и т.д.
IOS девелоперам доступны возможности Xcode для генерации представлений. При разработке под Android можно пользоваться возможностями Xamarin Studio и аддона к Visual Studio для генерации Xml разметки.
В силу схожести Java и C# применение стандартных паттернов и фитч языка не приводит к каким либо затруднениям. Разработка под IOS не сложнее – возможности ObjectiveC изящно покрываются в языке C#, несмотря на внешние отличия.
Все это работает так же красиво, как и звучит. Тем не менее, есть несколько замечаний:
- Практически все нативные классы реализуют интерфейс IDisposable. И это не простая формальность: утечки памяти вполне реальны.
- В monotouch Вас, возможно, удивит отсутствие таких объектов, как GSize, CGRect и прочее. Они заменены соответствующими структурами и классами из пространства имен System.Drawing.
- Конечно, исключения, возникающие внутри платформы, вбрасываются как MonoTouch.Foundation.MonoTouchException и Java.Lang.Throwable, но не всегда. Вполне реальна ситуация, когда исключение возбуждается в коде фреймворка. Более того: ошибка переполнения стека часто попросту валит приложение, без возбуждения исключений.
- Некоторые элементы API попросту не работают. Например, события AnimationStart, AnimationEnd в ViewFlipper (Android). Monotouch к тому же обладает интересной особенностью: некоторые методы были переименованы в соответствии с правилами .NET. Например, метод UIApplication. didFinishLaunchingWithOptions превратился UIApplication. FinishedLaunching. Со всем этим вполне можно жить, но StackOverflow programming уже не прокатывает.
- Многие элементы в monodroid и в monotouch представлены как прокси к нативным объектам. И жизненный цикл их слабо связан друг с другом. Поэтому необходимо всегда помнить про Dispose, иначе возможны утечки памяти.
- Отладчик достаточно медленный и не всегда стабильный. Однако, разработчики постоянно улучшают его.
Поддержка
В одном из комментариев я видел жалобу, будто на StackOverflow очень мало постов по monotouch и еще меньше по monodroid. Скажу честно, так и есть. И в этом нет ничего плохого, ведь большинство вопросов по API можно легко найти в темах по конкретной платформе и потом транслировать в C#. По правде говоря, стоит хотя бы почитать про ObjectiveC, так как многие особенности синтаксиса могут быть не понятны «с наскока». При этом именно monotouch сообщество показывает серьёзную активность. При разработке под Android Вы часто будете предоставлены самому себе.
При наличии лицензии Business Edition Вам открывается «доступ к телу» официальной техподдержки. Вполне быстрой и объективной. К сожалению, ни по одному моему обращению они не смогли помочь.
Кину пару камней в сторону обновлений Xamarin: они всегда полны сюрпризов. Например, после перехода стандарта платформы с Silverlight на чистый .NET, проект попросту перестал компилироваться. Так же часто встречаются баги среды разработки, привносимые патчами. Тут совет только один: координировать обновления в команде и не обновляться перед релизом своего приложения.
Вывод
Стоит ли? Однозначного ответа нет. Далее будет исключительно мое лично мнение, не претендующее на полноту и объективность.
Вам стоит попробовать Xamarin если:
- Ваше приложение должно содержать большой объем мультиплатформенного кода. Решение проблемы дублирования логики зачастую важнее потенциальных проблем работы с monotouch и monodroid.
- Вам необходимо разработать в сжатые сроки приложение под несколько платформ. Опять же, повторное использование кода в различных платформах позволяет ощутимо ускорить разработку. Тем не менее, стоит помнить, что решение многих проблем могут съесть десятки человеко-часов.
- Вам нужно разработать небольшое приложение-прототип под IOS, но Вы не знаете ObjectiveC или Swift. При разработке прототипа, счет идет на часы, которые не стоит тратить на изучение нового языка.
- Вы стартапер или инди разработчик. В таком случае, Вы можете не реализовывать проблемные фитчи, а мультплатформенность позволит сэкономить драгоценное время.
Вам не стоит использовать Xamarin если:
- Вы разрабатываете не мультиплатформенное приложение. Никакая экономия времени на изучение нового языка не стоит потенциальных проблем.
- Вы разрабатываете GUI ориентированное приложение. Некоторые интерфейсные паттерны тяжело реализовать на monodroid и очень тяжело на monotouch, так как решения по умолчанию для той или иной фитчи опираются на костыли платформы, которые могут попросту не работать в Xamarin.
- Ваше приложение должно удовлетворять особенным требованиям стабильности. Действительно часто возникают проблемы со стороны платформы mono, monotouch и monodroid. Я бы не советовал рисковать.
Ну и ответ на классический вопрос: если бы можно было вернуться назад и выбрать для нашего проекта что-либо другое, я все равно бы выбрал Xamarin.
Автор: KAW