Введение и цели модульности 0:00 Владимир, разработчик Яндекс Карт, рассказывает о модульности и Dagger. Цели модульности: повышение скорости сборки и уменьшение зацепления кода. Модули должны быть обособленными и использоваться вне приложения.
Недостатки модульности 1:58 Замедление скорости сборки в начале процесса разделения на модули. Сложность разделения модулей и добавления новых. Увеличение сложности проекта из-за увеличения количества абстракций.
Проблемы с зависимостями 3:54 Обсуждение проблем с зависимостями между модулями. Пример с Core модулем, который вызывает пересборку всех зависимых модулей.
Новый подход с Dagger 5:53 Введение ключевого слова implementation для указания зависимостей. Преимущества использования implementation: минимизация пересборок при изменениях в Core модуле.
Оптимизация Core модуля 7:47 Вынесение интерфейсов API и их реализаций в отдельные модули. Создание модуля с фабриками для предоставления реализаций интерфейсов. Возможность создания отдельного корневого модуля для одной фичи для быстрой итеративной разработки.
Типы модулей 9:45 Common модуль: должен быть лёгким и содержать функционал, используемый всей командой. Фича модуль: содержит функционал для одной конкретной функции. Корневой модуль: используется для сборки одной фичи, что позволяет быстро разрабатывать итеративно.
Standalone модули 10:42 Standalone модули содержат конкретные функции, экраны или сценарии. Они должны быть независимыми и разрабатываться в сэмпл-проектах. Сэмпл-проекты важны на начальном этапе разбиения проекта.
Celebrity модули 11:41 Celebrity модули широко используются и зависят от многих других. Для избежания частых перестроек можно вынести API модуля в common, а реализацию оставить в нём. Фабрика, предоставляющая реализацию API, появляется в главном модуле.
Использование Dagger 12:35 В проекте используется Dagger для управления зависимостями. Цель — создать независимые модули с корневым компонентом. Необходимо минимизировать влияние сгенерированного кода на главный модуль.
Проблемы с Dagger-компонентами 13:35 Dagger-компоненты сложно понять и использовать. Зависимости вытягиваются в главный модуль, что замедляет сборку. Вложенные классы компонентов увеличивают размер проекта.
Решение с интерфейсами 15:30 Использование интерфейсов для указания зависимостей. Проvision методы позволяют компоненту получать зависимости при создании. Пример кода из документации Dagger показывает, как указывать зависимости.
Реализация фича-модулей 16:28 Фича-модуль имеет явный пакет и API. Клиент обязан предоставить необходимые зависимости. Корневой Dagger-компонент использует метод `faintComponentDependencies`.
Использование клиентами 18:26 Клиент предоставляет реализацию интерфейса dependency. Компонент наследует интерфейс и получает provision методы. Dagger требует предоставления зависимостей для компиляции.
Результаты 19:24 Время сборки значительно сокращается при использовании сэмпл-проектов. Выделение фича-модуля уменьшает время сборки почти в два раза. Выделение кода, не требующего перестройки, также ускоряет сборку главного модуля.
Доставка модулей другим проектам 21:18 Разработка модулей внутри проекта, но возможность публикации в артефакты. Критически важный функционал публикуется для всех пользователей.
Различие между core и common 23:15 Core может зависеть от множества других модулей. Common не может зависеть от других модулей. Core может быть переименован в network для ясности.
Взаимодействие модулей 25:12 Корневой модуль организует взаимодействие между фичами. Фичи могут быть экранами или бизнес-логикой.
Использование интерфейсов 26:11 Для зависимости от небольшой части модуля можно использовать интерфейс. Пример: интерфейс для получения пользовательского ID.
Интеграционное тестирование 27:07 Основной процесс разработки ведётся с использованием сэмплов. Интеграционное тестирование проводится в конце разработки.
Хранение сетевого слоя 28:06 Сетевой слой может быть общим для всех фичей или отдельным для каждой. Логично хранить сетевой слой в модуле фичи, если он специфичен для неё.
Навигация между фичами 29:05 Фичи указывают зависимости через deep-сыновья. Корневой компонент реализует навигацию и делегирует выполнение задач другим модулям.