20
Практическое применение принципа инверсии зависимостей на примере Ruby Руслан Гатиятов // Дроид Лабс http://droidlabs.pro // https://planiro.com

Практическое применение принципа инверсии зависимостей на примере Ruby

Embed Size (px)

Citation preview

Page 1: Практическое применение принципа инверсии зависимостей на примере Ruby

Практическое применениепринципа инверсии зависимостей

на примере Ruby

Руслан Гатиятов // Дроид Лабсhttp://droidlabs.pro // https://planiro.com

Page 2: Практическое применение принципа инверсии зависимостей на примере Ruby

Проблемы- сильная связанность кода (god object)- неявность кода- сложно тестировать, медленные тесты- непонятные тесты (mocks and stubs)- не применяется практика TDD- convention over configuration sucks- хуки в коде- кто должен быть тоньше? controller VS model- неудобно работать с модулями в Ruby: A::B::C::D::E.new

- не видно всех зависимостей класса (software readers, not software

writers)

Page 3: Практическое применение принципа инверсии зависимостей на примере Ruby

SOLIDПринцип инверсии зависимостейРоберт Мартин

A. Модули высшего порядка не должны напрямую зависеть от модулей нижнего порядка. И и те и другие должны зависеть от абстракций.B. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Page 4: Практическое применение принципа инверсии зависимостей на примере Ruby

Пример без DI

Page 5: Практическое применение принципа инверсии зависимостей на примере Ruby

Типы инъеций- инъекция через конструктор

- call-time инъекция

- инъекция через сеттеры

- Ioc Container

Page 6: Практическое применение принципа инверсии зависимостей на примере Ruby

Инъекция через конструктор

Проблемы:

1. Добавление новых

зависимостей2. Переопределение

конструктора3. Как подменить

зависимость?

4. Цикличные зависимости5. Много зависимостей ->

много аргументов

коструктора

Page 7: Практическое применение принципа инверсии зависимостей на примере Ruby

Call-time инъекцияПроблемы:

1. Добавление новых

зависимостей2. Переопределение

конструктора3. Как подменить зависимость?

4. Цикличные зависимости5. Много зависимостей -> много

аргументов коструктора6. Подстановка зависимостей по

умолчанию

Page 8: Практическое применение принципа инверсии зависимостей на примере Ruby

Инъекция через сеттерыПроблемы:

1. Зависимости проставляются

вручную2. Путаница с другими

сеттерами3. Можно забыть удалить сеттер,

когда зависимость больше не

используется

Page 9: Практическое применение принципа инверсии зависимостей на примере Ruby

Ioc Container

Проблемы:

1. Нужен агент для

инстанциирования

зависимостей2. Необходим DSL

3. Зависимости добавлять очень

просто -> God object

4. Нужно придерживаться

определенных правил

Page 10: Практическое применение принципа инверсии зависимостей на примере Ruby

Overhead

Page 11: Практическое применение принципа инверсии зависимостей на примере Ruby

Преимущества- видны зависимости модуля

- возможность использования различных

реализаций интерфейса

- различные конфигурации системы

- легкое тестирование

Page 12: Практическое применение принципа инверсии зависимостей на примере Ruby

Не стоит использовать если- У всех классов всего одна реализация- Нет зависимости от конфигурации приложения- Нет опыта использования ООП

Page 13: Практическое применение принципа инверсии зависимостей на примере Ruby

Общие рекомендации- stateless классы

- следить за числом зависимостей модуля

- value objects не должны попадать под DI

- не использовать глобальный Ioc Container

- оборачивать внешние библиотеки

- на CI только исходные реализации

Page 14: Практическое применение принципа инверсии зависимостей на примере Ruby

Тестовая релизация

Page 15: Практическое применение принципа инверсии зависимостей на примере Ruby

Автоматизация

Page 16: Практическое применение принципа инверсии зависимостей на примере Ruby

Что и как тестировать?

Page 17: Практическое применение принципа инверсии зависимостей на примере Ruby

Остановка времени

Page 18: Практическое применение принципа инверсии зависимостей на примере Ruby

Слои приложения

Page 19: Практическое применение принципа инверсии зависимостей на примере Ruby

DSL для тестов

Page 20: Практическое применение принципа инверсии зависимостей на примере Ruby

Спасибо за внимание!