Ориентация / разработка для нескольких мобильных платформ с одним языком программирования (C #)? Затрат и выгод?

Сегодня можно использовать программирование на C # для нескольких мобильных платформ, таких как:

  • WindowPhone7
  • Android – Монодроид
  • IPhone – Monotouch

(Не стесняйтесь редактировать, если я пропустил некоторые). Конечно, это все еще усилия по программированию для пользовательского интерфейса, но основные библиотеки приложения могут использоваться совместно.

Мы все можем поблагодарить команду, собравшуюся над проектом Mono и супергероем Мигелем де Иказой, чья работа бесценна.

Что меня беспокоит, каковы преимущества этих вариантов? Стоит ли поддерживать одно приложение на нескольких мобильных платформах меньше препятствий, а затем заказывать каждую библиотеку отдельно для повышения производительности. Кривая обучения каждого языка? Быть Джеком всех профессий против .NET Ninja

Или зная, что двоичные файлы приложения, запрограммированные в родной среде, имеют меньший размер, возможно, даже оптимизированы лучше и не забывают, что вам нужно ждать поддержки новых обновлений os платформы.

ОБНОВЛЕНИЕ : Очевидно, есть еще одна вещь, которую следует учитывать, и это поддержка. Поскольку Novell приобретается компанией Attachmate Group, вся команда Mono уволена. Однако основной член команды, возглавляемый Мигелем Де Икасой, основал новую компанию Xamarin, которая будет изобретать инструменты разработки Mono Mobile с нуля.

На мой взгляд, большой профессионал в использовании одной единственной среды (например, C # /. NET) – это переносимость кода. И классные вещи, такие как LINQ, когда вы привыкнете к этому, вы не можете жить без него. Тем не менее, несколько мобильных ОС (iOS, Android, WP7) сильно отличаются от UI.

И, если я не ошибаюсь в отношении вашей заявки, у нее есть доля взаимодействия с пользовательским интерфейсом, если она предназначена для работы на мобильном устройстве. Большинство мобильных приложений похожи на 80% UI-код.

Таким образом, вы в конечном итоге напишите отдельный набор кода пользовательского интерфейса для каждой платформы в любом случае – например, вы будете писать в Silverlight WP7 (и во всей полноте WPF), вы будете писать совершенно другой набор кода Для iOS в Cocoa (IB, Views, контроллеры и т. Д.) Вы будете писать совершенно другой набор кода для Android.

Мой опыт всегда заключался в том, что для написания хорошего кода пользовательского интерфейса на любой платформе требуется большой опыт – например, обучение WPF / SL – это уже кошмар, который бросает Cocoa Touch и весь беспорядок в Android. Конечно, вы можете написать три набора пользовательских интерфейсов, которые выглядят и чувствуют достаточно похожими, но, скорее всего, вы будете так стараться повторно использовать код и иметь общие структуры данных, которые ваш пользовательский интерфейс в конечном итоге окажется под-пар по сравнению с выделенными приложениями – – и в этом мире мобильных приложений сегодня не-супер (не говоря уже о подпараллельном) опыте пользовательского интерфейса означает смерть для вашего приложения.

Кроме того, все три мобильные среды имеют разные парадигмы связности, а также мультимедийные парадигмы. Вы в конечном итоге пишете три версии и изучаете три среды, хотя и пишете на одном языке, с которым вы знакомы.

Большинство из них будут использоваться повторно. Механизмы принятия решений, процедуры поиска, управление данными и т. Д. И даже это будет проблематично, потому что вы будете вынуждены идти на компромиссы в своих структурах данных, чтобы упростить интеграцию с тремя различными наборами кода пользовательского интерфейса, работающими на трех разных парадигмах интерфейса. , Например, вы используете DependencyObjects для использования для привязки к представлениям Silverlight в модели MVVM? Если вы это сделаете, это не сработает с MVC-моделью Cocoa, и вам придется закодировать эти привязки отдельно.

И поскольку не все мобильные среды позволяют вам использовать полный набор функций, например, MonoTouch для iOS не содержит общих конструкций, которые не могут быть определены во время компиляции. По сути, вы используете очень небольшое подмножество .NET (и должны постоянно напоминать себе, какую функциональность можно использовать там), чтобы вы могли запускать их на трех разных платформах без существенных изменений.

Теперь изображение имеет все эти ограничения при написании для платформы WP7, которая поддерживает все функции .NET. Я не знаю о вас, но сойду с ума. И ваше приложение WP7 никогда не будет даже близко к тому, чтобы быть конкурентоспособным с другими приложениями там.

На мой взгляд, боль и компромиссы не стоят того. В итоге у вас появятся три приложения so-so, которым не понравятся ни на одной из платформ.

Если все добро не лежит в логике вашего приложения, и это настолько хорошо, что люди будут игнорировать проблемы пользовательского интерфейса, чтобы получить доступ к функциональным возможностям вашего приложения. По моему опыту, этого почти никогда не бывает.

Самое большое преимущество для меня – возможность использовать повторное использование бизнес-логики и кода связи между мобильными платформами. Да, я должен писать UI снова и снова, и для того, чтобы обдумать это, нужно время, но по крайней мере моя базовая платформа многократно используется.

По моему опыту при переходе на новую платформу мне требуется намного больше времени, чтобы изучить интерфейс пользовательского интерфейса, чем изучать новый язык.

Поскольку принятый ответ был написан в 2011 году, появилось несколько различных рамок, которые привносят модели MVC и MVVM в Mono для Android и MonoTouch, что очень помогает при разработке приложений для этих целей.

Для MVC проверьте проект MonoCross

Для MVVM просмотрите MvvmCross от Stuart Lodge

Последний содержит много кода для открытия изображений на трех платформах, составления электронных писем, открытия веб-браузеров, воспроизведения звуков и многое другое. Он также обрабатывает навигацию между ViewModels.

Большим преимуществом, безусловно, является повторное использование библиотек классов / классов на всех платформах. Имея это в виду, вы сможете быстрее и быстрее переносить / разрабатывать приложения, что, в свою очередь, снижает затраты.

Кроме того, из-за многократного использования кода это сократит расходы на обслуживание.

Существуют определенные недостатки в библиотеках Monotouch / Droid. Существует небольшое снижение скорости (около 5%, поэтому в большинстве случаев они не учитываются).

По моему опыту, размер не сильно отличается. Большая часть размера находится в ресурсах ( ресурсы данных, упакованные изображения и так же – не использование процессора), и большинство приложений не несут в себе столько ресурсов (из-за времени загрузки и наличия большого количества элементов управления по умолчанию на мобильных платформах) ,

Я не думаю, что вы должны использовать рамки в играх. У меня нет большого опыта в разработке мобильных игр, но довольно разные структуры, которые вы используете в разработке игр (XNA, Android NDK ..) и потребность в системных ресурсах (использование процессора, память и т. Д.) Делают их довольно бесполезными ИМХО.

Преимущества:

  • Код на одном языке и (в основном) на каждой платформе
  • Сокращение времени разработки
  • Более дешевый

Недостатки:

  • Включение необходимых библиотек значительно увеличивает минимальный размер приложения – если приложение будет большим, разница не столь значительна
  • Накладные расходы

Если у вас есть деньги и люди, всегда лучше, чтобы некоторые люди сосредоточились на iPhone и Objective-C, на некоторых Android и Java и т. Д. Таким образом, ваши программисты будут иметь глубокое знание платформы, на которую вы нацеливаетесь, и сможете Убедитесь, что ваше приложение полностью использует возможности платформы – приложение не должно быть точно таким же (кроме, возможно, игр) на всех платформах, вам нужно играть в свои сильные и слабые стороны: приложение для iPhone должно выглядеть и функционировать как iPhone Приложение и т.д.

Тем не менее, если у вас нет людей или денег, использование одного языка вместе с несколькими фреймами, безусловно, дешевле и быстрее и может дать вам лучшие результаты, чем результат напряженной попытки разработать для каждой платформы по отдельности.

Еще один способ взглянуть на это – вы можете легко переносить существующее приложение .NET / C # на множество мобильных клиентов (как родных, так и не родных) относительно легко с помощью сервера интеграции WebORB . На стороне клиента вам нужно будет закодировать либо на родном языке, либо вы можете создать приложение Adobe AIR, которое достаточно переносится в разных мобильных ОС, таких как iOS, Android и BlackBerry PlayBook.

Кросс-платформенное решение работает только в том случае, если ваше приложение прост и прост. Если вам требуются сложные функции, такие как локальное хранилище данных со сложными графами объектов, пойдите на родном или ожидайте потратить месяцы для отладки проблем