Заработанный опыт программирования на Android

Этот пост, как говорит Кент Бек в своей книге «Шаблоны реализации», «… основан на довольно хрупкой предпосылке, что хороший код имеет значение…». Но мы все знаем, что чистый код имеет значение, так как нам пришлось так долго иметь дело с его отсутствием. И Кент тоже.

Кент Бек

Общая стоимость владения беспорядок

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

Спринт за спринтом, хак за хаком, функции были построены в безумном порыве. Сложение. Мера. Учить. Время выхода на рынок было важно и каждый день имел значение. Время шло, мы росли со скоростью 1 члена команды каждые 6 месяцев, и приложение достигло отметки в миллион загрузок.

Загрузки и рейтинг магазина Google Play нашего приложения.

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

Android-головоломка

Код выглядел уродливо, Деятельности удалось все:

  • Резьбонарезной
  • I / O
  • вычисление
  • Макеты
  • Изменения конфигурации
  • Что не

В конце концов, деятельность - это контроллеры, верно? Или это пейзажи? Я не знал больше.

MVC

Гранд Редизайн в небе

Нам нужно было спроектировать приложение таким образом, чтобы изменение строки кода где-то не нарушало что-то еще. Приложение должно было быть, как говорит дядя Боб, «надежным, но не жестким, гибким, но не хрупким».

Роберт «Дядя Боб» Мартин

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

  • Мы добавили слой «сервис» и переместили в них весь код, не относящийся к пользовательскому интерфейсу, по одному сервису за раз.
  • Мы бросили AsyncTasks и перешли на ListenableFutures, используя Guava.
  • Мы сбросили AsyncHttpClient для OkHttp.
  • Но что еще более важно, мы начали много читать: чистый код, чистая архитектура, SOLID, DRY, прагматичный программист, практический параллелизм Java, доменный дизайн и т. Д.

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

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

Искусство чистого кода

Посмотрев несколько раз видео дяди Боба о чистой архитектуре и много прочитав об архитектуре приложений Android, я решил поэкспериментировать с шаблоном проектирования MVP и RxJava.

Через несколько дней после эксперимента мы решили перейти на RxJava и внедрить MVP с использованием чистой архитектуры. Мы убедились, что инкапсулировали все уровни за интерфейсами и хорошо разделяли проблемы.

  • Представление, обычно реализуемое фрагментом, содержит ссылку на докладчика. Единственное, что будет делать представление, - это вызывать метод из Presenter каждый раз, когда происходит действие интерфейса.
  • Ведущий отвечает за роль посредника между View и Model. Он извлекает данные из модели и возвращает их отформатированные в представление. Но в отличие от типичного MVC, он также решает, что происходит, когда вы взаимодействуете с View.
  • Модель является только шлюзом для уровня домена или бизнес-логики.
  • Interactor имеет дело с вводом / выводом и является поставщиком данных для отображения в представлении.

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

Бойскаут Правило

Недостаточно хорошо писать код, со временем он должен быть чистым. Факт жизни заключается в том, что программное обеспечение имеет тенденцию к энтропии. Мы все видели, как код гниет и ухудшается со временем, поэтому мы заимствовали простое правило бойскаутов: «Оставь лагерь чище, чем ты его нашел».

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

Заключение

Наш способ построения масштабируемого приложения может быть «неправильным», и вы можете не согласиться с этим постом. В конце концов, не все мастера единоборств согласны с лучшим боевым искусством или лучшей техникой в ​​пределах одного;)

Существует множество различных подходов к MVP и множество интересных решений для его адаптации к Android. Единственный факт, который мы не можем отрицать, это то, что Чистый код имеет значение, и вы просто не можете сунуть его под ковер.

Этот пост в значительной степени заимствован из «Чистого кода» дяди Боба и украл название из выступления Кашифа о Droidcon 2011 года.

Если чистый код важен для вас, давайте поговорим :) Twitter: @_arunsasi LinkedIn: https://www.linkedin.com/in/arunsasidharan

Если вам понравился этот пост, пожалуйста, поразите маленькое сердце! ❤