15. DDependency inversion principle
(принцип инверсии
зависимостей)
DIP определяет отношение этих трех сущностей так:
a) Клиент ничего не должен знать о реализации модуля.
Он имеет дело только с интерфейсом;
b) Реализация модуля не должна знать о клиенте. Она
предоставляет функциональность и реализует
определенный интерфейс;
c) Интерфейс не должен зависеть от реализации. Он
вообще не должен знать о ней;
d) Реализация должна зависеть от интерфейса;
20. Проблема доступа к модулям:
При вызове конструктора получится, что
модуль зависит от конкретного места его
применения.
Если в коде используются
многочисленные конкретные классы, его
придется изменять с добавлением новых
конкретных классов.
23. 1. Service Locator
• Неясный контракт класса
Сервис-локатор многие считают анти-паттерном:
• Неопределенная сложность класса
24. 2. Использовать механизм Dependency injection
Три пути, которыми мы можем доставить классу
нужные параметры:
1) Constructor Injection (инъекция в конструктор)
25. 2. Использовать механизм dependency injection
Три пути, которыми мы можем доставить классу
нужные параметры:
2) Field Injection (инъекция в поле)
26. 2. Использовать механизм dependency injection
Три пути, которыми мы можем доставить классу
нужные параметры:
3) Method Injection (инъекция в метод)
39. • Runtime валидация графа зависимостей
• reflection
Dagger 2:
• Никакого reflection
• Compiletime валидация графа зависимостей.
• Классная кодогенерация.
Guice, RoboGuice, Spring, PicoContainer …
Dagger 1:
• Compile-time валидация графа зависимостей
• Избавлен от кучи reflection, но по прежнему
использует ее для загрузки сгенерированных классов
42. Dagger API
@Component
@Subcomponent — мост
между модулями и
клиентами зависимостей.
Определяет какие модули
будут предоставлять
зависимости. Указываем
куда хотим инжектить
и/или геттер, который
вернет зависимость.
44. Dagger API
@MapKey — определить коллекцию
зависимостей
@Qualifier — тегируем зависимости,
которые имеют один и тот же
интерфейс.
@Lazy — ленивая инициализация
зависимости.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55. Итого:
• Не забывайте про SOLID принципы
• Пишите модульный код
• Не переабстрагируйтесь
• Предпочитайте DI сервис локатору
• DI framework в android – Dagger 2