011. Многомодульность и Dagger 2 – Владимир Тагаков

YOUTUBE · 24.11.2025 03:18

Ключевые темы и таймкоды

Введение и цели модульности

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-сыновья.
  • Корневой компонент реализует навигацию и делегирует выполнение задач другим модулям.