Top Banner
ВАМ ПРИВЕТ
58

Проблемы точечной застройки в больших городах или зачем нужен Dagger

Apr 12, 2017

Download

Mobile

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Проблемы точечной застройки в больших городах или зачем нужен Dagger

ВАМ ПРИВЕТ

Page 2: Проблемы точечной застройки в больших городах или зачем нужен Dagger

ЗАЧЕМ НАМ DAGGERили проблемы с точечной застройкой в больших городах

Олег Долгих,Improve Digital

Page 3: Проблемы точечной застройки в больших городах или зачем нужен Dagger

О чем:

1экран

1запрос

• Немного SOLID• Модульность и уровни абстракции• Dependency Injection• Dagger 2

Page 4: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Хотелки

1экран

1запрос

Page 5: Проблемы точечной застройки в больших городах или зачем нужен Dagger

SOLID

Page 6: Проблемы точечной застройки в больших городах или зачем нужен Dagger

S Single responsibility principle (принцип единственной обязанности)

У класса должна быть всего одна причина изменяться

Page 7: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 8: Проблемы точечной застройки в больших городах или зачем нужен Dagger

OOpen/closed principle(принцип открытости/закрытости)

Классы должны быть открыты для раширения, но закрыты для изменения

Page 9: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 10: Проблемы точечной застройки в больших городах или зачем нужен Dagger

L Liskov substitution principle (принцип подстановки Барбары Лисков)

Наследующий класс должен дополнять, а не замещать поведение базового класса

Page 11: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 12: Проблемы точечной застройки в больших городах или зачем нужен Dagger

I Interface segregation principle (принцип разделения интерфейса)

Клиенты не должны зависеть от методов, которые они не используют

Page 13: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 14: Проблемы точечной застройки в больших городах или зачем нужен Dagger

D Dependency inversion principle (принцип инверсии зависимостей)

Код должен зависеть от абстракций, а не от конкретных классов

Page 15: Проблемы точечной застройки в больших городах или зачем нужен Dagger

D Dependency inversion principle (принцип инверсии зависимостей)

DIP определяет отношение этих трех сущностей так:a) Клиент ничего не должен знать о реализации модуля.

Он имеет дело только с интерфейсом;b) Реализация модуля не должна знать о клиенте. Она

предоставляет функциональность и реализует определенный интерфейс;

c) Интерфейс не должен зависеть от реализации. Он вообще не должен знать о ней;

d) Реализация должна зависеть от интерфейса;

Page 16: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 17: Проблемы точечной застройки в больших городах или зачем нужен Dagger

ДУЛЬМО

НОСТЬ

Page 18: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 19: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Как хотели: Как получилось:

Page 20: Проблемы точечной застройки в больших городах или зачем нужен Dagger

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

Если в коде используются многочисленные конкретные классы, его придется изменять с добавлением новых конкретных классов.

Page 21: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Dependency Injection

Service Locator

Page 22: Проблемы точечной застройки в больших городах или зачем нужен Dagger

1. Service Locator

Page 23: Проблемы точечной застройки в больших городах или зачем нужен Dagger

1. Service Locator

• Неясный контракт класса

Сервис-локатор многие считают анти-паттерном:

• Неопределенная сложность класса

Page 24: Проблемы точечной застройки в больших городах или зачем нужен Dagger

2. Использовать механизм Dependency injectionТри пути, которыми мы можем доставить классу нужные параметры:1) Constructor Injection (инъекция в конструктор)

Page 25: Проблемы точечной застройки в больших городах или зачем нужен Dagger

2. Использовать механизм dependency injectionТри пути, которыми мы можем доставить классу нужные параметры:2) Field Injection (инъекция в поле)

Page 26: Проблемы точечной застройки в больших городах или зачем нужен Dagger

2. Использовать механизм dependency injectionТри пути, которыми мы можем доставить классу нужные параметры:3) Method Injection (инъекция в метод)

Page 27: Проблемы точечной застройки в больших городах или зачем нужен Dagger

ПРИЧЕМ ЗДЕСЬ

ТОЧЕЧНАЯ ЗАСТРОЙКА

Page 28: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Как хотели: Как получилось:

Page 29: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Хочу здесь детский садик!

Page 30: Проблемы точечной застройки в больших городах или зачем нужен Dagger

UserManager

UserStore ApiService

Page 31: Проблемы точечной застройки в больших городах или зачем нужен Dagger

UserManager

UserStore ApiService

Page 32: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Модуль с детским садиком перемещаем по любому адресу

Page 33: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Меняем код с использованием паттерна Constructor Injection, и передадим зависимости в UserManager в качестве параметров

Page 34: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Меняем код с использованием паттерна Constructor Injection, и передадим зависимости в UserManager в качестве параметров

Page 35: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Наш UserManager больше не зависит от реализаций ApiService и UserStore

UserManager

UserStore ApiService

Page 36: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Мы просто можем «замокать» реализации ApiService и UserStore. UserStore теперь полностью независим.

Page 37: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 38: Проблемы точечной застройки в больших городах или зачем нужен Dagger

DI ФРЕЙМВОРКИ

Page 39: Проблемы точечной застройки в больших городах или зачем нужен Dagger

• Runtime валидация графа зависимостей• reflection

Dagger 2:• Никакого reflection• Compiletime валидация графа зависимостей.• Классная кодогенерация.

Guice, RoboGuice, Spring, PicoContainer …

Dagger 1:• Compile-time валидация графа зависимостей• Избавлен от кучи reflection, но по прежнему

использует ее для загрузки сгенерированных классов

Page 40: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Новый взгляд на LoginActivity

Page 41: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Dagger API

@Module@Provides@ScopeОпределяем методы которые будут предоставлять зависимости в классе с аннотацией @Module и аннотируем их @Provides. Если хотим ограничить область видимости – помечаем аннотацией @Scope

Page 42: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Dagger API

@Component@Subcomponent — мост между модулями и клиентами зависимостей. Определяет какие модули будут предоставлять зависимости. Указываем куда хотим инжектить и/или геттер, который вернет зависимость.

Page 43: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Dagger API

@Inject — пометить Конструктор, Поле, Метод для инъекции

Page 44: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Dagger API

@MapKey — определить коллекцию зависимостей@Qualifier — тегируем зависимости, которые имеют один и тот же интерфейс.@Lazy — ленивая инициализация зависимости.

Page 45: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 46: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 47: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 48: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 49: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 50: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 51: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 52: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 53: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 54: Проблемы точечной застройки в больших городах или зачем нужен Dagger
Page 55: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Итого:• Не забывайте про SOLID принципы• Пишите модульный код• Не переабстрагируйтесь• Предпочитайте DI сервис локатору• DI framework в android – Dagger 2

Page 56: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Минусы• Повышается порог вхождения

Page 57: Проблемы точечной застройки в больших городах или зачем нужен Dagger

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

Олег Долгих,Android-разработчик Improve Digital

Page 58: Проблемы точечной застройки в больших городах или зачем нужен Dagger

Ресурсы:• https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/• https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2• http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/• http://sergeyteplyakov.blogspot.ru/2013/03/di-service-locator.html• http://sergeyteplyakov.blogspot.ru/2012/12/di-constructor-injection.html• http://sergeyteplyakov.blogspot.ru/2013/01/di-property-injection.html

• http://sergeyteplyakov.blogspot.ru/2013/02/di-method-injection.html• https://events.yandex.ru/lib/talks/3109/• https://www.youtube.com/watch?v=3Fn4vb1wBIs