SlideShare a Scribd company logo
1 of 23
Вынос сквозной функциональности.
Цели
 Дать определение АОП
 Определить какие проблемы решает АОП
 Построить модульную систему применяя АОП
 Сравнить динамическое и статическое связывание
 Дать рекомендации по использованию АОП
2
Для чего нужно АОП
 Пересекающаяся логика она же сквозная
функциональность – части программы
присутствующие «везде», но не относящиеся к
конкретному классу.
 АОП позволяет вынести сквозную
функциональность в отдельные модули - аспекты.
 Аспекты можно включить или отключить, без
«переписывания» кода.
3
Сквозная функциональность
 Журнал – он же логгер
 Профилирование
 Проверка прав доступа
 Кэш
 INotifyPropertyChanged
 И все что не относится к логике приложения.
4
Проблема сквозной
функциональности
 Ctrl+C -> Ctrl+V – в народе копипаст
 Сомневающийся заказчик – изменяющиеся требования.
 Тяжело разбираться
ЛОГИКА .
5
Проблема сквозной
функциональности
 Чистая функция
public double Up(double value)
{
if (value - (int)value > 0.764131 && value - (int)value < 0.764133)
Thread.Sleep(15000);
return value /= 3;
}
 Спрятанная функция
public double Up(double value)
{
var sw = new Stopwatch();
sw.Start();
if (value - (int)value > 0.764131 && value - (int)value < 0.764133)
Thread.Sleep(15000);
var result = value /= 3;
sw.Stop();
Logger.Info($"Recalc value:{value} elapsed:{sw.Elapsed.Seconds}", result);
return result;
}
6
Истоки АОП
 2001 год компания Xerox – расширение для Java AspectJ.
 Аспект — модуль или класс, реализующий сквозную
функциональность.
 Совет — реализация сквозной функциональности.
 Точка соединения — точка в выполняемой
программе, где следует применить совет.
 Срез — набор точек соединения.
 Связывание (внедрение)— смешивание аспекта с
выполняемым кодом.
7
Как это работает
Два типа связывания в АОП
 Статическое – путем изменения кода приложения.
Пост обработка, влияет на время компиляции.
 Динамическое – на лету. Шаблон Proxy. Dynamic
Proxy генерируются на этапе выполнения.
Проигрывает по производительности и
возможностям, но выигрывает по гибкости
изменений.
8
Статическое Post связывание
Я использую переводчик, чтобы показать
принцип статического связывания в АОП
私はAOPでインタプリタを使用して静的バイン
ディングの原則を示します
Я использую интерпретатор в АОП, чтобы
показать принцип статической привязки
Пост обработка исходного кода
Попытка восстановления исходного кода
9
Interception
 Перехват
10
АОП и .Net
11
 Можно написать, СIL в помощь
 PostSharp
 Fody
 Spring .Net
 Unity IoC
 Ninject
 Autofac
 Castle.Project (Windsor, DynamicProxy)
 И многие другие.
Практика АОП
Пример последовательного приведения
монолитной части программы к модульной
архитектуре основанной на АОП. (см.
AopModules.sln)
 Stage1 – этап на котором возникает проблема
подвисания приложения. Код построен таким
образом, что не возможно протестировать.
Определить в чем проблема не удается.
12
Практика АОП
 Stage2 – было выделено несколько программных
модулей. Модули покрыты тестами, но проблема не
выявлена.
 Stage3 – в код модулей добавлен профайлер. Проблема
исправлена, но код модулей загрязнен и нет
возможности отключить профилирование.
 Stage4 – пересекающаяся логика вынесена в отдельные
Proxy. Внутреннее состояние профилируемых объектов
стало прозрачным. Профилирование легко включать и
выключать. Осталось дублирование кода и при
необходимости профилирования новых модулей нужно
писать новые Proxy.
13
Практика АОП
 Stage5Factory – отказ от отдельных Proxy в пользу
АОП. Код профилирования содержится в аспекте.
Легко повторно пере использовать.
 Stage5IoC – большинство IoC поддерживают
динамическое АОП, не стоит изобретать
велосипед.
 Bonus – демонстрация дополнительных
возможностей АОП. Вынос ввода вывода в аспект.
14
Практика АОП
15
 Post – пример использования АОП в статических
классах с использованием PostSharp. Используются
все те же Interseptor’ы. Заплатив «всего» 500$, вы
получите в подарок наборы аспектов
 http://doc.postsharp.net/conceptual-documentation
Logging
Contracts INotifyPropertyC
hanged
Weak Event
XAML
Parent/Child,
Visitor and
Disposable
Undo/Redo Caching
Multithreading
Aspects
Validating
Architecture
Testing and
Debugging
Практика АОП
 Fody – пример использования INotifyPropertyChanged.
Легко устанавливается через NuGet, открыт и
бесплатен, очень просто использовать.
 Очень много расширений https://github.com/Fody/Fody
 АОП лишь небольшая часть проекта.
16
Что мешает использовать АОП
Утверждение Реальность
АОП это сложно
Как и любая новая технология
требует время на изучение
АОП не решает ни каких новых задач
АОП решает старые задачи новым
способом
АОП затрудняет понимание кода
Любой дополнительный уровень
абстракции усложняет понимание
Шаблоны проектирования и
интерфейсы заменяют АОП
АОП хорошо дополняет модульную
архитектуру
При изменении классов нужно
менять аспекты
Зависит от качества проектирования.
Плохое проектирование не устойчиво
к изменениям
АОП не тестируемо
Аспекты тестируются точно так же
как и обычные объекты
17
Что мешает использовать АОП
Утверждение Реальность
АОП способствует плохому
проектированию
Нужно понимать что АОП – не
золотой молоток
АОП нельзя внедрять в уже
разработанный продукт
АОП можно внедрять на любой
стадии разработки
18
Вывод по внедрению АОП
 Стадия Bonus – хороший пример плохого
проектирования и использования АОП в качестве
Gold Hummer. Ввод вывод не является сквозной
функциональностью.
19
Вывод по внедрению АОП
 Стадия Post - С помощью статического связывания
можно смешать аспект даже со статическими
классами. Такой подход требует минимальных
усилий, но в общем случае является сырым
проектированием.
 Стадия Fody – при внедрении АОП таким образом
нужно соблюдать определенные правила, без
которых система работать не будет.
20
Когда не стоит использовать АОП
 Функциональность не сквозная или используется в
ограниченном числе модулей.
 Необходимо работать с внутренним состоянием
объектов.
 Команда не готова. Нужно ориентироваться на тех
кто это будет сопровождать.
21
Как использовать АОП
 Разделять крупные модули на более мелкие.
 Инвертировать зависимости модулей.
 Делать внутреннее состояние прозрачным.
 Использовать Proxy классы для реализации
сквозной функциональности.
 Заменять Proxy на Аспекты.
 АОП очень хорошо работает вместе с S.O.L.I.D.
 Соблюдать правила диктуемые Аспектом.
 Помнить: АОП, не Золотой Молоток.
22
Заключение
 Используйте АОП в своих проектах.
 Будьте гибкими и не бойтесь новых технологий и
подходов.
Изменения неизбежны.
23

More Related Content

What's hot

Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Mail.ru Group
 
ковалев нестандатное нт
ковалев    нестандатное нтковалев    нестандатное нт
ковалев нестандатное нт
Alexei Lupan
 
SQA Days 11 SAtroschenkov SBerezhnoy
SQA Days 11 SAtroschenkov SBerezhnoySQA Days 11 SAtroschenkov SBerezhnoy
SQA Days 11 SAtroschenkov SBerezhnoy
Sergey Atroschenkov
 

What's hot (19)

TAP
TAPTAP
TAP
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
 
Тестирование REST-сервисов с применением инженерных практик
Тестирование REST-сервисов с применением инженерных практикТестирование REST-сервисов с применением инженерных практик
Тестирование REST-сервисов с применением инженерных практик
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программ
 
UICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестамиUICov - инструмент анализа покрытия UI-тестами
UICov - инструмент анализа покрытия UI-тестами
 
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
Алексей Петров, Mail.Ru Group, "Организация конвейера автоматизации тестирова...
 
Автоматическое тестирование. Моя система
Автоматическое тестирование. Моя системаАвтоматическое тестирование. Моя система
Автоматическое тестирование. Моя система
 
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps DevelopmentMobile Monday Kiev#1 - How to save time in Mobile Apps Development
Mobile Monday Kiev#1 - How to save time in Mobile Apps Development
 
Автоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharpАвтоматизация design patterns и компактный код вместе с PostSharp
Автоматизация design patterns и компактный код вместе с PostSharp
 
Автоматизация тестирования ролей и привилегий
Автоматизация тестирования ролей и привилегийАвтоматизация тестирования ролей и привилегий
Автоматизация тестирования ролей и привилегий
 
Aop
AopAop
Aop
 
Практика тестирования web сервисов
Практика тестирования web сервисовПрактика тестирования web сервисов
Практика тестирования web сервисов
 
матлогика для программистов
матлогика для программистовматлогика для программистов
матлогика для программистов
 
ковалев нестандатное нт
ковалев    нестандатное нтковалев    нестандатное нт
ковалев нестандатное нт
 
Как мы тестируем анализатор кода
Как мы тестируем анализатор кодаКак мы тестируем анализатор кода
Как мы тестируем анализатор кода
 
Как спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важноКак спроектировать хороший API и почему это так важно
Как спроектировать хороший API и почему это так важно
 
зуева татьяна - опыт автоматизации тестирования в Agile проекте
зуева татьяна -  опыт автоматизации тестирования в Agile проектезуева татьяна -  опыт автоматизации тестирования в Agile проекте
зуева татьяна - опыт автоматизации тестирования в Agile проекте
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.
 
SQA Days 11 SAtroschenkov SBerezhnoy
SQA Days 11 SAtroschenkov SBerezhnoySQA Days 11 SAtroschenkov SBerezhnoy
SQA Days 11 SAtroschenkov SBerezhnoy
 

Similar to Андрей Кирпичев "Гибкая модульность инструментами АОП"

Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controll
Mykyta Hopkalo
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
Iosif Itkin
 
Юрий Ковалев -- Нагрузочное тестирование без границ
Юрий Ковалев -- Нагрузочное тестирование без границЮрий Ковалев -- Нагрузочное тестирование без границ
Юрий Ковалев -- Нагрузочное тестирование без границ
sqadays8
 

Similar to Андрей Кирпичев "Гибкая модульность инструментами АОП" (20)

Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
Java 2 - Java Intro
Java 2 - Java IntroJava 2 - Java Intro
Java 2 - Java Intro
 
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOSРоман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
Benefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controllBenefits of unit-testing and inversion of controll
Benefits of unit-testing and inversion of controll
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!DESIGN PATTERNS? EASY!
DESIGN PATTERNS? EASY!
 
Spring in java
Spring in javaSpring in java
Spring in java
 
DevOps guide for awesome quality assurance
DevOps guide for awesome quality assuranceDevOps guide for awesome quality assurance
DevOps guide for awesome quality assurance
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
Step 1
Step 1Step 1
Step 1
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1JavaTalks.Unit Testing.Part 1
JavaTalks.Unit Testing.Part 1
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва  Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
Как сейчас тесты в Android пишут, Денис Неклюдов, Google Dev Expert, Москва
 
По ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocolsПо ту сторону ООП: PEAK-Rules и PyProtocols
По ту сторону ООП: PEAK-Rules и PyProtocols
 
Юрий Ковалев -- Нагрузочное тестирование без границ
Юрий Ковалев -- Нагрузочное тестирование без границЮрий Ковалев -- Нагрузочное тестирование без границ
Юрий Ковалев -- Нагрузочное тестирование без границ
 

More from MskDotNet Community

Николай Гусев «Функциональное программирование для C# разработчиков»
 Николай Гусев «Функциональное программирование для C# разработчиков» Николай Гусев «Функциональное программирование для C# разработчиков»
Николай Гусев «Функциональное программирование для C# разработчиков»
MskDotNet Community
 

More from MskDotNet Community (19)

Антон Сысоев «IIoT: на границе HW и .NET»
Антон Сысоев «IIoT: на границе HW и .NET»Антон Сысоев «IIoT: на границе HW и .NET»
Антон Сысоев «IIoT: на границе HW и .NET»
 
Николай Гусев «Функциональное программирование для C# разработчиков»
 Николай Гусев «Функциональное программирование для C# разработчиков» Николай Гусев «Функциональное программирование для C# разработчиков»
Николай Гусев «Функциональное программирование для C# разработчиков»
 
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
Кирилл Ветчинкин Практика использования .NET Core на ОС Linux с применением а...
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
Владимир Кочетков "OWASP TOP 10 для.NET"
Владимир Кочетков  "OWASP TOP 10 для.NET"Владимир Кочетков  "OWASP TOP 10 для.NET"
Владимир Кочетков "OWASP TOP 10 для.NET"
 
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиковДмитрий Сошников    Искусственный интеллект и нейросети для .NET-разработчиков
Дмитрий Сошников Искусственный интеллект и нейросети для .NET-разработчиков
 
Викторина MskDotNet Субботник
Викторина MskDotNet СубботникВикторина MskDotNet Субботник
Викторина MskDotNet Субботник
 
Елизавета Голенок Переходим на mono или как это было
Елизавета Голенок  Переходим на mono или как это былоЕлизавета Голенок  Переходим на mono или как это было
Елизавета Голенок Переходим на mono или как это было
 
Иван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языковИван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языков
 
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
Дмитрий Тежельников  «Разработка вэб-решений с использованием Asp.NET.Core и ...Дмитрий Тежельников  «Разработка вэб-решений с использованием Asp.NET.Core и ...
Дмитрий Тежельников «Разработка вэб-решений с использованием Asp.NET.Core и ...
 
Павел Притчин "Конфигурации в.NET"
Павел Притчин  "Конфигурации в.NET"Павел Притчин  "Конфигурации в.NET"
Павел Притчин "Конфигурации в.NET"
 
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере" Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
Даниил Соколюк "ReactJS.NET — опыт рендеринга на сервере"
 
Андрей Матвеев "Основные принципы микросервисов и их реализации"
Андрей Матвеев "Основные принципы микросервисов и их реализации"Андрей Матвеев "Основные принципы микросервисов и их реализации"
Андрей Матвеев "Основные принципы микросервисов и их реализации"
 
Александр Сурков «Вещи» в «Интернете вещей»
Александр Сурков «Вещи» в «Интернете вещей»Александр Сурков «Вещи» в «Интернете вещей»
Александр Сурков «Вещи» в «Интернете вещей»
 
Петр Тимошевский «Industrial IoT на практике»
Петр Тимошевский «Industrial IoT на практике»Петр Тимошевский «Industrial IoT на практике»
Петр Тимошевский «Industrial IoT на практике»
 
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
Стас Павлов «Построение безопасной архитектуры IoT решений на примере Azure I...
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»Кирилл Маурин «Проектирование и разработка модульных приложений»
Кирилл Маурин «Проектирование и разработка модульных приложений»
 
Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»Владимир Кошелев «Автоматический поиск ошибок»
Владимир Кошелев «Автоматический поиск ошибок»
 

Андрей Кирпичев "Гибкая модульность инструментами АОП"

  • 2. Цели  Дать определение АОП  Определить какие проблемы решает АОП  Построить модульную систему применяя АОП  Сравнить динамическое и статическое связывание  Дать рекомендации по использованию АОП 2
  • 3. Для чего нужно АОП  Пересекающаяся логика она же сквозная функциональность – части программы присутствующие «везде», но не относящиеся к конкретному классу.  АОП позволяет вынести сквозную функциональность в отдельные модули - аспекты.  Аспекты можно включить или отключить, без «переписывания» кода. 3
  • 4. Сквозная функциональность  Журнал – он же логгер  Профилирование  Проверка прав доступа  Кэш  INotifyPropertyChanged  И все что не относится к логике приложения. 4
  • 5. Проблема сквозной функциональности  Ctrl+C -> Ctrl+V – в народе копипаст  Сомневающийся заказчик – изменяющиеся требования.  Тяжело разбираться ЛОГИКА . 5
  • 6. Проблема сквозной функциональности  Чистая функция public double Up(double value) { if (value - (int)value > 0.764131 && value - (int)value < 0.764133) Thread.Sleep(15000); return value /= 3; }  Спрятанная функция public double Up(double value) { var sw = new Stopwatch(); sw.Start(); if (value - (int)value > 0.764131 && value - (int)value < 0.764133) Thread.Sleep(15000); var result = value /= 3; sw.Stop(); Logger.Info($"Recalc value:{value} elapsed:{sw.Elapsed.Seconds}", result); return result; } 6
  • 7. Истоки АОП  2001 год компания Xerox – расширение для Java AspectJ.  Аспект — модуль или класс, реализующий сквозную функциональность.  Совет — реализация сквозной функциональности.  Точка соединения — точка в выполняемой программе, где следует применить совет.  Срез — набор точек соединения.  Связывание (внедрение)— смешивание аспекта с выполняемым кодом. 7
  • 8. Как это работает Два типа связывания в АОП  Статическое – путем изменения кода приложения. Пост обработка, влияет на время компиляции.  Динамическое – на лету. Шаблон Proxy. Dynamic Proxy генерируются на этапе выполнения. Проигрывает по производительности и возможностям, но выигрывает по гибкости изменений. 8
  • 9. Статическое Post связывание Я использую переводчик, чтобы показать принцип статического связывания в АОП 私はAOPでインタプリタを使用して静的バイン ディングの原則を示します Я использую интерпретатор в АОП, чтобы показать принцип статической привязки Пост обработка исходного кода Попытка восстановления исходного кода 9
  • 11. АОП и .Net 11  Можно написать, СIL в помощь  PostSharp  Fody  Spring .Net  Unity IoC  Ninject  Autofac  Castle.Project (Windsor, DynamicProxy)  И многие другие.
  • 12. Практика АОП Пример последовательного приведения монолитной части программы к модульной архитектуре основанной на АОП. (см. AopModules.sln)  Stage1 – этап на котором возникает проблема подвисания приложения. Код построен таким образом, что не возможно протестировать. Определить в чем проблема не удается. 12
  • 13. Практика АОП  Stage2 – было выделено несколько программных модулей. Модули покрыты тестами, но проблема не выявлена.  Stage3 – в код модулей добавлен профайлер. Проблема исправлена, но код модулей загрязнен и нет возможности отключить профилирование.  Stage4 – пересекающаяся логика вынесена в отдельные Proxy. Внутреннее состояние профилируемых объектов стало прозрачным. Профилирование легко включать и выключать. Осталось дублирование кода и при необходимости профилирования новых модулей нужно писать новые Proxy. 13
  • 14. Практика АОП  Stage5Factory – отказ от отдельных Proxy в пользу АОП. Код профилирования содержится в аспекте. Легко повторно пере использовать.  Stage5IoC – большинство IoC поддерживают динамическое АОП, не стоит изобретать велосипед.  Bonus – демонстрация дополнительных возможностей АОП. Вынос ввода вывода в аспект. 14
  • 15. Практика АОП 15  Post – пример использования АОП в статических классах с использованием PostSharp. Используются все те же Interseptor’ы. Заплатив «всего» 500$, вы получите в подарок наборы аспектов  http://doc.postsharp.net/conceptual-documentation Logging Contracts INotifyPropertyC hanged Weak Event XAML Parent/Child, Visitor and Disposable Undo/Redo Caching Multithreading Aspects Validating Architecture Testing and Debugging
  • 16. Практика АОП  Fody – пример использования INotifyPropertyChanged. Легко устанавливается через NuGet, открыт и бесплатен, очень просто использовать.  Очень много расширений https://github.com/Fody/Fody  АОП лишь небольшая часть проекта. 16
  • 17. Что мешает использовать АОП Утверждение Реальность АОП это сложно Как и любая новая технология требует время на изучение АОП не решает ни каких новых задач АОП решает старые задачи новым способом АОП затрудняет понимание кода Любой дополнительный уровень абстракции усложняет понимание Шаблоны проектирования и интерфейсы заменяют АОП АОП хорошо дополняет модульную архитектуру При изменении классов нужно менять аспекты Зависит от качества проектирования. Плохое проектирование не устойчиво к изменениям АОП не тестируемо Аспекты тестируются точно так же как и обычные объекты 17
  • 18. Что мешает использовать АОП Утверждение Реальность АОП способствует плохому проектированию Нужно понимать что АОП – не золотой молоток АОП нельзя внедрять в уже разработанный продукт АОП можно внедрять на любой стадии разработки 18
  • 19. Вывод по внедрению АОП  Стадия Bonus – хороший пример плохого проектирования и использования АОП в качестве Gold Hummer. Ввод вывод не является сквозной функциональностью. 19
  • 20. Вывод по внедрению АОП  Стадия Post - С помощью статического связывания можно смешать аспект даже со статическими классами. Такой подход требует минимальных усилий, но в общем случае является сырым проектированием.  Стадия Fody – при внедрении АОП таким образом нужно соблюдать определенные правила, без которых система работать не будет. 20
  • 21. Когда не стоит использовать АОП  Функциональность не сквозная или используется в ограниченном числе модулей.  Необходимо работать с внутренним состоянием объектов.  Команда не готова. Нужно ориентироваться на тех кто это будет сопровождать. 21
  • 22. Как использовать АОП  Разделять крупные модули на более мелкие.  Инвертировать зависимости модулей.  Делать внутреннее состояние прозрачным.  Использовать Proxy классы для реализации сквозной функциональности.  Заменять Proxy на Аспекты.  АОП очень хорошо работает вместе с S.O.L.I.D.  Соблюдать правила диктуемые Аспектом.  Помнить: АОП, не Золотой Молоток. 22
  • 23. Заключение  Используйте АОП в своих проектах.  Будьте гибкими и не бойтесь новых технологий и подходов. Изменения неизбежны. 23