Повторное использование кода Monotouch в приложении Monodroid - PullRequest
10 голосов
/ 08 сентября 2010

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

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

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

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

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

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

Спасибо

Адриан

Ответы [ 5 ]

15 голосов
/ 21 сентября 2010

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

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

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

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

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

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

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

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

(я на предпросмотре Monodroid, но у меня также есть приложения MT)

7 голосов
/ 01 сентября 2011

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

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

3 голосов
/ 31 августа 2011

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

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

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

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

2 голосов
/ 09 сентября 2010

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

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

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

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

0 голосов
/ 24 октября 2012

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

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

...