aop and inversion of conrol

19
Broslavsky Oleg TSU ISCD Inversion of Control «Когда программист своему коду не хозяин» Tomsk - 2016

Upload: yalegko

Post on 13-Apr-2017

102 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: AOP and Inversion of Conrol

Broslavsky OlegTSU ISCD

Inversion of Control«Когда программист своему коду не хозяин»

Tomsk - 2016

Page 2: AOP and Inversion of Conrol

2

Inversion of Control —паттерн, используемый для уменьшения связанности кода и базирующийся на следующих принципах: Модули верхнего уровня не

должны зависеть от модулей нижнего уровня.

И те, и другие должны зависеть от абстракции.

Абстракции не должны зависеть от деталей.

Детали должны зависеть от абстракций.

Что это такое?

Page 3: AOP and Inversion of Conrol

3

Другими словами: все зависимости модулей должны строиться на абстракциях этих модулей, а не на их конкретных реализациях.

Page 4: AOP and Inversion of Conrol

4

При игре в CTF мы добываем флаги

Флаги нужно сдать жюриЕсли каждый будет сам

сдавать украденные флаги, то каждому придётся писать общение с системой жюри

Выход: тулза для централизованной сдачи флагов Poster 2.0

Пример

Page 5: AOP and Inversion of Conrol

5

Плюсы:Сырые сокеты –

быстроНе нужно заботиться

о протоколе общения – постер знает как это делать

Поддерживает подключение при сдаче флагов

Минусы?

Обычная реализация:

Page 6: AOP and Inversion of Conrol

6

Например нет возможности поменять протокол общения с жюри.

Возможные ситуации:Общение по HTTP

«Пфф, вставьте HTTP запрос в формат флага и всё»

Использование фреймворка для сдачи«Ээ, ну давайте я перепишу

быстренько»

Высокая связность кода

Page 7: AOP and Inversion of Conrol

7

Решение: уменьшить связность кода. В том числе это можно сделать и с помощью IoC

Связность кода это плохо. Пнятненько?

Page 8: AOP and Inversion of Conrol

8

Использование паттернов Factory pattern Template method pattern Strategy design pattern

Получаем объект, который: Обладает известным

интерфейсом Выполняет действия

прозрачно для пользователя

Способ 1: «фабричные» паттерны

Page 9: AOP and Inversion of Conrol

9

Способ 1: «фабричные» паттерны

• Теперь способ отправки флагов можно достаточно просто поменять в одном месте в коде постера

• Код стал более модульным

• Для добавления нового

способа отправки нужно менять не только постер, но и код фабрики

Page 10: AOP and Inversion of Conrol

10

SL - объект, который знает, как получить все сервисы, которые, возможно, потребуются.

Главное отличие: Service Locator не создаёт объекты, а знает как получить тот или иной объект.

Способ 2: паттерн Service Locator

Page 11: AOP and Inversion of Conrol

11

Способ 2: паттерн Service Locator

• Изменения только в конфигурации и инициализации локатора

• Легко заменить метод на заглушку для тестирования

• Как и у любых

глобальных переменных и синглтонов

Page 12: AOP and Inversion of Conrol

12

Dependency Injection — это предоставление внешнего сервиса какому-то классу путём его внедрения.Через метод класса Через конструктор Через интерфейс

Способ 3: Dependency Injection

Code

Page 13: AOP and Inversion of Conrol

13

Во внедряемом классе создаётся метод, устанавливающий данную зависимость

Способ 3.1: Setter Injection

МЫ СДЕЛАЛИ ТЕБЕ МЕТОД

ЧТОБЫ ТЫ МОГ УСТАНАВЛИТЬ МЕТОДЫ МЕТОДОМ

Page 14: AOP and Inversion of Conrol

14

В конструктор внедряемого класса добавляется аргумент, устанавливающий реализацию зависимости

Способ 3.2: Constructor Injection

Page 15: AOP and Inversion of Conrol

15

Зависимость внедряется через интерфейс, который обязует класс реализовать нужный нам метод.

Способ 3.2: Interface Injection

Page 16: AOP and Inversion of Conrol

16

Способ 3: Dependency Injection

• Код зависит только от интерфейсов, не абстракций

• Реализация уточняется на этапе выполнения

• очень легки в тестировании

• Паттерны, паттерны,

нужно больше паттернов!!11 (можно слишком увлечься абстрагированием кода и уйти от проблемы)

Page 17: AOP and Inversion of Conrol

17

Связь с АОП

ДАВАЙТЕ ПОМОЖЕМ ДАШЕ НАЙТИ АОП!

Page 18: AOP and Inversion of Conrol

18

Связь с АОП

Схожие стороны:• Уменьшает связность кода• Облегчает тестирование• Позволяет достаточно просто

подстраивать код под свои нужды

Отличия• Требует конкретной

реализации, а потому не позволяет осуществлять «инъекции» в произвольный код

Page 19: AOP and Inversion of Conrol

19

Oleg [email protected]

@yalegko