Download - AOP and Inversion of Conrol
![Page 1: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/1.jpg)
Broslavsky OlegTSU ISCD
Inversion of Control«Когда программист своему коду не хозяин»
Tomsk - 2016
![Page 2: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/2.jpg)
2
Inversion of Control —паттерн, используемый для уменьшения связанности кода и базирующийся на следующих принципах: Модули верхнего уровня не
должны зависеть от модулей нижнего уровня.
И те, и другие должны зависеть от абстракции.
Абстракции не должны зависеть от деталей.
Детали должны зависеть от абстракций.
Что это такое?
![Page 3: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/3.jpg)
3
Другими словами: все зависимости модулей должны строиться на абстракциях этих модулей, а не на их конкретных реализациях.
![Page 4: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/4.jpg)
4
При игре в CTF мы добываем флаги
Флаги нужно сдать жюриЕсли каждый будет сам
сдавать украденные флаги, то каждому придётся писать общение с системой жюри
Выход: тулза для централизованной сдачи флагов Poster 2.0
Пример
![Page 5: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/5.jpg)
5
Плюсы:Сырые сокеты –
быстроНе нужно заботиться
о протоколе общения – постер знает как это делать
Поддерживает подключение при сдаче флагов
Минусы?
Обычная реализация:
![Page 6: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/6.jpg)
6
Например нет возможности поменять протокол общения с жюри.
Возможные ситуации:Общение по HTTP
«Пфф, вставьте HTTP запрос в формат флага и всё»
Использование фреймворка для сдачи«Ээ, ну давайте я перепишу
быстренько»
Высокая связность кода
![Page 7: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/7.jpg)
7
Решение: уменьшить связность кода. В том числе это можно сделать и с помощью IoC
Связность кода это плохо. Пнятненько?
![Page 8: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/8.jpg)
8
Использование паттернов Factory pattern Template method pattern Strategy design pattern
Получаем объект, который: Обладает известным
интерфейсом Выполняет действия
прозрачно для пользователя
Способ 1: «фабричные» паттерны
![Page 9: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/9.jpg)
9
Способ 1: «фабричные» паттерны
• Теперь способ отправки флагов можно достаточно просто поменять в одном месте в коде постера
• Код стал более модульным
• Для добавления нового
способа отправки нужно менять не только постер, но и код фабрики
![Page 10: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/10.jpg)
10
SL - объект, который знает, как получить все сервисы, которые, возможно, потребуются.
Главное отличие: Service Locator не создаёт объекты, а знает как получить тот или иной объект.
Способ 2: паттерн Service Locator
![Page 11: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/11.jpg)
11
Способ 2: паттерн Service Locator
• Изменения только в конфигурации и инициализации локатора
• Легко заменить метод на заглушку для тестирования
• Как и у любых
глобальных переменных и синглтонов
![Page 12: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/12.jpg)
12
Dependency Injection — это предоставление внешнего сервиса какому-то классу путём его внедрения.Через метод класса Через конструктор Через интерфейс
Способ 3: Dependency Injection
Code
![Page 13: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/13.jpg)
13
Во внедряемом классе создаётся метод, устанавливающий данную зависимость
Способ 3.1: Setter Injection
МЫ СДЕЛАЛИ ТЕБЕ МЕТОД
ЧТОБЫ ТЫ МОГ УСТАНАВЛИТЬ МЕТОДЫ МЕТОДОМ
![Page 14: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/14.jpg)
14
В конструктор внедряемого класса добавляется аргумент, устанавливающий реализацию зависимости
Способ 3.2: Constructor Injection
![Page 15: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/15.jpg)
15
Зависимость внедряется через интерфейс, который обязует класс реализовать нужный нам метод.
Способ 3.2: Interface Injection
![Page 16: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/16.jpg)
16
Способ 3: Dependency Injection
• Код зависит только от интерфейсов, не абстракций
• Реализация уточняется на этапе выполнения
• очень легки в тестировании
• Паттерны, паттерны,
нужно больше паттернов!!11 (можно слишком увлечься абстрагированием кода и уйти от проблемы)
![Page 17: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/17.jpg)
17
Связь с АОП
ДАВАЙТЕ ПОМОЖЕМ ДАШЕ НАЙТИ АОП!
![Page 18: AOP and Inversion of Conrol](https://reader036.vdocument.in/reader036/viewer/2022081521/58ef4d541a28ab1d7d8b4665/html5/thumbnails/18.jpg)
18
Связь с АОП
Схожие стороны:• Уменьшает связность кода• Облегчает тестирование• Позволяет достаточно просто
подстраивать код под свои нужды
Отличия• Требует конкретной
реализации, а потому не позволяет осуществлять «инъекции» в произвольный код