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

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

Правила"

Разработка программного обеспечения — это искусство, а искусство не знает границ, но вот несколько рекомендаций, которые современная разработка приложений считает передовой практикой:

Разделение задач

Разбейте свой проект на несколько разделов, каждый из которых посвящен отдельной проблеме.

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

Независимость модели данных

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

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

Единый источник истины

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

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

Однонаправленный поток данных (UDF)

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

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

Рекомендуемая архитектура

Как и в случае со всеми рекомендациями, посмотрите, что вам нравится, и при необходимости адаптируйте это к проектам.

Вам понадобятся два основных уровня: UI и Данные. Если вы хотите повторно использовать взаимодействие между первыми двумя уровнями, есть один бонусный уровень, который называется Домен.

Подробную информацию можно найти на странице рекомендаций по архитектуре Google.

Уровень пользовательского интерфейса

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

Две вещи составляют уровень пользовательского интерфейса:

  1. Элементы пользовательского интерфейса: отдельные представления или составные элементы, доступные пользователю.
  2. Держатели состояний (ViewModel): обрабатывают взаимодействия, хранят данные и обновляют состояния пользовательского интерфейса.

Уровень данных

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

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

Каждый репозиторий предназначен для разных типов данных в нашем приложении. Например, приложение Medium может иметь класс StoriesRepository для данных, связанных с публикациями, или класс ListsRepository для данных, связанных со списками чтения.

Каждый класс источника данных отвечает за работу только с одним источником данных, обычно с сетевым источником или локальной базой данных. Например, приложение Medium может иметь класс StoriesLocalDataSource для операций с базой данных и класс StoriesNetworkDataSource для сетевых запросов.

Уровень домена (необязательно)

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

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

Внедрение зависимостей (DI)

Спагетти-код – это термин, используемый для описания исходного кода, который трудно понять без структуры. Представьте себе, что каждая лапша в миске со спагетти представляет отдельный класс вашего проекта. Это запутанно и беспорядочно, но обычно мы не возражаем, потому что программирование — это вкусно.

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

Представьте себе, что вы заказываете пиццу с доставкой в ​​коробке, а не готовите ее дома с нуля. Это внедрение зависимостей в реальной жизни.

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

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

  • Ремонтопригодность, качество и надежность
  • Масштабируемость с меньшим количеством конфликтов кода
  • Тестируемость благодаря управлению зависимостями
  • Отладка посредством четко определенных процессов

Заключение

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

Если вам понравился этот контент, подписывайтесь на меня, чтобы в будущем исследовать каждый уровень с техническими примерами. И если у вас есть какие-нибудь истории об архитектурных войнах, я хотел бы их услышать.

Надеюсь, у вас отличный день!

Альдо