Повторное использование кода Monotouch в приложении Monodroid

В настоящее время я реализую приложение Monotouch, которое в конечном итоге будет перенесено в Monodroid. Приложение является просто клиентом веб-службы OData. Ничего слишком необычного или важного для производительности.

Задача состоит в том, чтобы использовать как можно больше кода. Я знаю, что API интерфейса для Monotouch и Monodroid совершенно разные, но я надеюсь повторить использование абстракции данных и бизнес-слоев.

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

Теперь мои вопросы:

  • Что вы думаете об этом подходе? Это хорошая идея, или это просто приведет к посредственному приложению из-за различий в концепции пользовательского интерфейса между IPhone и Android?

  • Можете ли вы предложить какие-либо подсказки о том, как структурировать приложение для максимизации повторного использования кода?

Спасибо,

Адриан

Ответ 1

Что вы думаете об этом подходе? Это хорошая идея, или это просто приведет к посредственному приложению из-за различий в концепции пользовательского интерфейса между IPhone и Android?

Я бы сказал последнее, но вы можете определенно повторно использовать большую часть своих бизнес-объектов и объектов домена. Тот же Mono Sqlite используется в Monodroid, поэтому часть сохранения данных вашего приложения (если он его использует) повторно используется.

Я бы не стал создавать пользовательский интерфейс среднего уровня - они совершенно разные. Например, в Android-приложениях есть нижнее меню, которое может содержать 6 кнопок на экране. На iPhone у вас, скорее всего, не будет 6 кнопок в панели вкладок или панели инструментов. Сделать общий шаблон для этого вам не поможет.

Другим примером является ListViews (UITableViews). Они совершенно разные. Как и следовало ожидать, реализация Monodroid верна своей уродливой сестре Java. На Android вам не нужно использовать огромную путаницу косвенности, которую Apple навязывает вам, а просто простой ArrayAdapter в качестве источника данных - подклассифицирован для более сложных макетов.

Еще одна важная вещь - Android не имеет одного размера экрана. Вы создаете изображения для 3 различных плотности экрана. Размер шрифта не является абсолютным.

Android предоставляет вам механизмы компоновки, похожие на XAML и в Интернете, на iPhone вам не так повезло (или повезло больше, в зависимости от того, как вы его просматриваете), поскольку все, как правило, абсолютно позиционируется (они могут делать это, как всегда 320х480).

Можете ли вы предложить какие-либо подсказки о том, как структурировать приложение для максимизации повторного использования кода?

Я думаю, что у вас есть большая часть покрытых отдельными слоями для данных и прилипания к контроллерам. Не видя приложения, трудно сказать, насколько легко будет повторно использовать контроллеры (независимо от того, используете ли вы UITableView или пользовательский uis), но Android гораздо быстрее развивается, и я думаю, что это должна быть непростая задача.

(Я нахожусь в предварительном просмотре Monodroid и также имею MT-приложения)

Ответ 2

Похоже, у вас там довольно солидная концепция. На самом деле есть проект с открытым исходным кодом под названием MonoCross (http://code.google.com/p/monocross/), использующий шаблон MVC, чтобы сделать что-то подобное.

Мигель де Икаса разветкил то, что выглядит как довольно классный MVVM-проект, который может вам помочь. https://github.com/migueldeicaza/MonoTouch.MVVM

Ответ 3

Я успешно реализовал шаблон MVC для моего уровня представления, модель домена, слой услуг, репозиторий и общий язык являются агностиками платформы. Там, где мне нужен код конкретной платформы, такой как NetworkConnectionManager (мое имя), я использую #if #endif для обертывания объектов или где мне нужно выполнить Unit Testing. Я использую консольное приложение для всех своих модульных тестов, проект как проекты Android, iPhone и Windows Phone, за исключением того, что я не использую слой пользовательского интерфейса, который является всей специфичной для платформы пользовательского интерфейса. Я также отмечаю мою консоль с определением CONSOLE, и мои Android-проекты с ANDROID определяют так, что я могу сделать #if #endif

Я должен сказать, что он отлично работает, если я могу разместить весь мой MVC-слой под unit test в консоли и работать под управлением Android, но я уверен, что он будет работать под iPhone и Windows Phone, потому что Console doesn ' t даже имеет интерфейс. Это идеальный способ проверить общий уровень моего представления. Хотя этот подход, который я принимаю, может быть чрезмерным, я планирую долгое время поддерживать это приложение, и я также планирую перенести его на Android-планшеты, iPad и Windows 8, поэтому IMO необходимо взять дополнительное время, чтобы получить это право.

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

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

Ответ 4

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

Тем не менее, я вернулся к тому, что слой модели был "общим" - и сделал слой пользовательского интерфейса (контроллеры и представления) на Mac (то есть в MonoDevelop). Прилагаемое усилие было чрезмерным для относительно небольшого приложения, над которым я работал, и только я был единственным, кто работал над ним.

Кроме того, если вы новичок в iPhone и/или Android, попытка сделать что-то относительно сложное затруднит поиск образцов или ответы на вопросы. Я обнаружил, что я делал жизнь тяжелее для себя (конечно, в первые дни работы с iPhone).

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

Ответ 5

Может быть, немного поздно, но это кросс-платформенная мобильная разработка видео весьма полезна. Я также пишу приложение MT, которое будет перенесено на Android и WP. Для хранения данных я серьезно рассматриваю Vici CoolStorage, который должен сделать модель данных полностью переработанной, годный к употреблению. Кроме того, я перемещаю любой программно-агностический код в утилиты и общие проекты внутри решения. Я также надеюсь, что смогу повторно использовать код связи веб-сервиса в MD и WP. Остальное - это iOS, специфичный в данный момент.

Будет очень интересно узнать, как идет ваш проект. Является ли повторное использование кода действительно окупаемым?