Пользователь
0,0
рейтинг
27 октября 2011 в 22:33

Разработка → Шаблоны проектирования при разработке под Android. Часть 1 — Введение из песочницы

Писать программки для смартфонов — мое хобби. Все началось с того, что я купил свой первый смартфон Nokia E51 на Symbian и мне очень нравилось что его функционал можно было расширить через установку дополнительных программ.
Но однажды я не нашел необходимой программы и решил написать ее сам. Так и началось мое увлечение программами для смартфонов.

После того как глава Nokia заявил, что дни Symbian сочтены, я решил изучить платформу Android.

Для лучшего усвоения материала я решил написать полезную, хотя бы для себя, программку. Но написать ее не по детски, когда куски примитивного кода копируются из документации, а по взрослому с разработкой архитектуры, и использованием современных технологий программирования TDD, MVP и IoС.


Постановка задачи


Мое первое приложение для Android — T-Alarm. Найти его можно на Android Market по названию. На данный момент в программе нет дизайна и она выглядит немного некузяво, но вскоре дизайн появится.

Это просто программа будильник, но с одной функцией, которой нет в других программах.

Обычно я встаю в 6:45 утра, но пару раз в неделю мне надо встать в другое время, например для утренней пробежки. Для этого надо изменить время в будильнике на завтра, а так же не забыть вернуть потом расписание в исходное. Все остальные будильники на Android не позволяют быстро поменять время на завтра, для этого надо долго ходить по настройкам, а так же никто из них сам не возвращает время в исходное состояние после срабатывания по измененному.
Поэтому я решил, что основной фишкой моей программы будет возможность однократного изменения времени следующего срабатывания, а также общий принцип, что для внесения изменений в расписание надо как можно меньше времени тратить на блуждание по настройкам.

Более того, будильник является отличной задачей, чтобы по глубже изучить платформу Andorid. Здесь затрагиваются такие части как:
— Пользовательский интерфейс. Надо сделать несколько окон для задания настроек.
— воспроизведение музыкальных файлов. Можно изучить возможности встроенного медиа-проигрывателя
— Сохранение расписания в БД. Теперь я знаю как пользоваться базой данных SQLIte на Android
— Реализация сервисов для отработки будильника. При наступлении часа Х надо запрограммировать следующий момент срабатывания, с учетом нескольких дреманий (snooze), и сыграть побудку. Прекрасный повод разобраться в том какие сервисы есть в Android и какой надо использовать.
— Получение различных сигналов от ОС. Сервис будильника должен срабатывать по системному будильнику и при загрузке смартфона.

Этой статей я открываю ряд статей, где хочу поделиться своим опытом разработки. Причем я хочу сосредоточиться на использовании MVP и TDD при разработке моего приложения. В интернете я нашел все это по кускам и смог собрать во едино. Это позволило мне сделать приложение в котором все основные алгоритмы протестированы с помощью UnitTest-ов, а так же я обраружл несколько других вкусностей, которые будут интересны Andorid разработчикам.

Общая архитектуры проектов и приложения


С самого начала я хотел разобраться как можно использовать современные подходы и шаблоны проектирования при разработке приложений для Android и поэтому много времени у меня ушло на изучения различных Framework-ов. Вроде бы в Android SDK уже встроен JUnit для организации тестов и есть много статей в интернете как им пользоваться, но как дело доходит реального проекта сразу появляются подводные камни. О том как их преодолеть я и расскажу в этом цикле статей.

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

Организация проектов


Мои исходники разделены на два проекта — основной проект с исходниками и тестовй проект с тестами.

Проект с исходниками состоит из нескольких пакетов. Как правило один пакет это одно архитектурное звено, то есть одна форма или сервис.

Каждое звено состоит из презентера (Presenter), представления (View) и, порой, из вспомогательных классов как правило для организации нескольких потоков. Хочу отметить, что представление это не всегда пользовательский интерфейс порой это классы для работы с системными сервисам, но для того, чтобы иметь возможность имитировать эти системные сервисы я выносил их во View, у которого есть интерфейс, а этот интерфейс легко имитировать в тестах.

Проект с тестами тоже разбит на пакеты. Каждый пакет содержит несколько тестов для соответствующего звена приложения.

Архитектура приложения


Поскольку мое приложение маленькое, то в нем нет слоев, а есть только несколько звеньев:

1. Главное окно
2. Окно редактирования будильника
3. Окно выбора мелодии
4. Окно при звонке
5. Модель данных, в моем случае это список будильников, и репозиторий для сохранения модели в БД.
6. Сервис для обработки системных сообщений: наступление часа Х и загрузка смартфона.

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

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

В данной архитектуре непротестированными остаются только представления. Но код в них как правило предельно прост. Это просто маппинг параметров метода в контролы формы. Как правило этот код тестируется методом «пристального взгляда». А ошибки легко обнаруживаются когда вы видите что на форме не заполнен какой-то контрол.

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

Читайте в других статьях


— Введение
MVP и Unit tests. Путь Джедая
Пользовательский интерфейс, тестирование, AndroidMock
Сохранение данных. Domain Model, Repository, Singleton и BDD
— Реализация серверной части, RoboGuice, тестирование
— Небольшие задачи, настройки, логирование, ProGuard
Andrey @AndreyFedorov
карма
16,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (8)

  • +6
    Маловато подробностей даже для первой статьи из серии.

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

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

    А иерархию классов я добавлю.
  • +1
    Быстрее пишите продолжение! А то во введении слишком мало подробностей. Быстрее хочется почитать об успешном опыте применения MVP в Android-проекте
  • 0
    Следующая статья уже на треть готова, в выходные я ее допишу и опубликую.
  • 0
    Очень интересная тема, я пока только MVP использую, все никак не могу начать мое любимое TDD :)

    Если планируете открыть исходный код то можно это сделать сейчас?
    Посмотреть, подготовится к следующим частям.
    • 0
      Все исходники открывать не планирую, но в следующих частях будет много кода из исходников, чтобы детально показать все приемы.

      Эти примеры можно будет использовать как основу при написании своего кода
  • 0
    маловато информации, но тема крайне интересная. буду ждать следующих статей
  • +1
    Выпустил следующую статью, где подробно написал про MVP и модульные тесты.
    MVP и Unit tests. Путь Джедая

    Про использование этого в Android расскажу потом.

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