SlideShare a Scribd company logo
1 of 26
Download to read offline
Аспектно-Ориентированный Подход
Чижиков Дмитрий
coffee'n'code, Донецк, февраль 2011
Аспектно-ориентированное подход (АОП) — методология
программирования, основанная на идее разделения
функциональности для улучшения разбиения программы на
модули.
АОП предлагает языковые средства, позволяющие
выделять сквозную функциональность в отдельные модули,
и таким образом упрощать работу с компонентами
программной системы, и снижать сложность системы в
целом.
Методология АОП была предложена группой инженеров
исследовательского центра Xerox PARC под руководством
Грегора Кичалеса (Gregor Kiczales). Ими же в 2001 году было
разработано аспектно-ориентированное расширение для
языка Java, получившее название AspectJ.
Система как набор функциональных
требований
Функциональные требования:
– работа со счетами
– валютные операции
– работа с кредитными картами
– работа с банкоматами
– ...
Общесистемные требования:
– авторизованный доступ
– целостность транзакций
– ведение журнала событий
– мониторинг производительности
– обработка исключительных
ситуаций
– валидация данных
– многопоточность
– ...
– ...
Требования к банковской системе
Проблема сквозной функциональности
public class SomeBusinessClass {
// Данные, отвечающие за состояние объекта
// Вспомогательные данные, отвечающие за:
// - авторизованный доступ к данным;
// - целостность транзакций;
// - ведение журнала событий;
// - безопасность междупоточного взаимодействия;
// - ...
public void someOperation(Object...params) {
// проверить уровень доступа к данным
// запретить доступ к данным другим потокам выполнения
// занести в журнал отметку о начале операции
// Реализация логики данного метода
// занести в журнал отметку о конце операции
// разрешить доступ к данным другим потокам выполнения
}
}
Пространство требований и
реализации
Отображение
в реализацию
Безопасность
Управление
транзакциями
Бизнес-логика
Пространство требований
Безопасность
Управление
транзакциями
Бизнес-логика
Пространство реализации
Сворачивание многомерного пространства требований
в одномерное пространство реализации
Спутанный код
– Журналирование– Бизнес-логика
– Безопасность – Управление транзакциями
Отдельный модуль Система в целом
Рассредоточенный код
Модуль БД
Модуль
безопасности
Модуль счетов
Модуль банкомата
Вызовы API
Влияние запутанного и
рассредоточенного кода на
проектирование и реализацию
– Плохое прослеживание назначения модуля
– Низкая пригодность кода для повторного
использования
– Большая вероятность ошибок
– Трудности в сопровождении
Выделение сквозной
функциональности с помощь аспектов
Модуль счетов
Модуль банкомата
Модуль БД
Модуль
безопасности
Аспект
безопасности
Вызовы API
Автоматически
интегрированные
вызовы
Фундаментальные понятия АОП
● JoinPoint — строго определённая точка выполнения программы, ассоциированная с контекстом
выполнения (вызов метода, конструктора, доступ к полю класса, обработчик исключения, и т.д.)
● Pointcut — набор (срез) точек JoinPoint удовлетворяющих заданному условию.
● Advice — набор инструкций, выполняемых до, после или вместо каждой из точек выполнения
(JoinPoint), входящих в заданный срез (Pointcut)
● Inter-type declaration* — способность аспекта изменять статическую структуру класса путем
добавления как новых полей и методов, так и иерархии класса.
● Aspect — основная единица модульности АОП, инкапсулирующая срезы точек выполнения
(Pointcut), наборы инструкци (Advice), а также Inter-type определения*.
● Weaving – процесс интеграции правил вплетения кода аспектов с кодом, ответственным за
бизнес-логику, результатом которого является конечная система.
* – доступно только в AspectJ
Aspect. AspectJ
public aspect SomeAspect {
pointcut allMethodCalls() : call(* *.*(..)) && !within(*Aspect);
before() : allMethodCalls() {
Logger.log("Before " + thisJoinPoint.toLongString());
}
after() : allMethodCalls() {
Logger.log("Before " + thisJoinPoint.toLongString());
}
declare parents : Account implements Serializable;
}
Joinpoints, доступные в AspectJ
Категория Преставление
Выполнение метода Тело метода
Вызов метода Вызов метода
Выполнение конструктора Тело конструктора
Вызов конструктора Вызов конструктора
Чтение поля класса Чтение поля
Запись в поле класса Запись поля
Обработка исключений catch-блок обработки исключения
Инициализация класса Блок статической инициализации
Инициализация объекта Инициализация в конструкторе
Отношения между Joinpoints,
шаблонами сигнатур и Pointcuts
public class Account {
private double balance;
private int accountNumber;
public Account(int accountNumber) {
this.accountNumber = accountNumber;
}
public void credit(double amount) {
balance += amount;
}
public void debit(double amount)
throws InsufficientBalanceException {
if (balance < amount) {
throw new InsufficientBalanceException(
"Недостаточный баланс.");
} else {
balance -= amount;
}
}
// ...
}
within(Account)
Pointcut
Account
Сигнатура типа
Сигнатура метода
public * Account.*(..)
execution(public * Account.*(..))
Pointcut
private double Account.balance
get(private double Account.balance)
Pointcut
set(private double Account.balance)
PointcutPointcut
Сигнатура поля
public Account.new(int)
Сигнатура конструктора
execution(Account.new(int))
Pointcut
Pointcut. Мета-символы и логические
операторы
Операция Пример использования
&& call(* debit(..)) && target(Account+)
|| call(* int Account.*(..)) || call(* double Account.*(..))
! !whitin(Account)
Логические операторы
Символ Пример использования
* call(public *.new(int))
execution(public int *.get*())
..
call(public Account.new(..))
call(public int *.*(Account, .., double))
+ execution(public Account+.new(..))
Мета-символы
Pointcut. Лексические,
типизированные и зависимые от
аргументов
Pointcut Пример
within(<Синатура типа>) within(Account)
withincode(<Синатура метода/конструктора>) withincode(Account.new(..))
this(<Синатура типа>) call(* *(..)) && target(Account)
target(<Синатура типа>) execution(* *(..)) && this(Account)
args(<Список аргументов>) execution(* Account.*(double)) && args(amount)
Конструкция Advice
Advice – набор инструкций сквозной функциональности, добавляемый до,
после или вместо JoinPoint, входящих в указанный Pointcut.
● Before – набор инструкций выполняемый перед выполнением инструкций
входящих в описываемую Joinpoint.
● after returning – набор инструкций выполняется после успешного
возвращения значения из описываемой точки выполнения.
● after throwing – набор инструкций выполняется после возникновения
исключительной ситуации в описываемой точке выполнения.
● after – набор инструкций выполняется после возвращения из
описываемой точки выполнения в любом случае.
● around – набор инструкций выполняется вместо описываемой точки
выполнения.
Advice. Пример
pointcut constructorCall(int accountNumber) :
call(Account.new(int)) && args(accountNumber);
before(int accountNumber) : constructorCall(accountNumber) {
System.out.println("Before calling. Caller signature "
+ thisEnclosingJoinPointStaticPart.getSignature());
}
after(int accountNumber) : constructorCall(accountNumber) {
System.out.println("After calling.");
}
Inter-type declaration
Inter-type declaration позволяют добавлять новые методы и переменные в
классы, объявлять класс как реализацию интерфейса, устанавливать или
отменять проверку исключений, определять предупреждения и ошибки
компиляции, использовать примеси.
declare parents : Account implements Serializable;
declare @type: Account : @MyAnnotation;
private String Account.name;
private void Account.getName(String name) {
this.name = name;
}
private String Account.getName() {
return name;
}
declare warning : get(* System.out) && !within(Logger)
: "Воспользуйтесь Logger.log()";
Weaving
– модификация исходного кода с дальнейшей
компиляцией (source-to-source weaving)
– модификация откомпилированного байт-кода
(post-compile weaving)
– модификация байт-кода загружаемого JVM при
старте приложения (load-time weaving)
– прямое использование паттерна Proxy
@AspectJ
@Aspect
public class PureJavaAspect {
@Pointcut(value = "execution(* Content.*(..))")
public void parents() {}
@Before("parents()")
public void before(JoinPoint joinPoint) {
Logger.log("Before " + joinPoint.toLongString());
}
@DeclareWarning("get(* System.*) && !within(cnc.logging.Logger)")
static final String warning = "Do not use System.out";
}
AspectJ. Средства разработки
Консольные:
– ajc - компилятор AspectJ
– ajdoc - средство документации AspectJ в стиле
javadoc
Визуальные:
– плагин для Eclipse
– плагин для NetBeans
– плагин для IntelliJ IDEA
Преимущества АОП
– Упрощение дизайна
– Более понятная реализация
– Уменьшение объёма исходного кода
– Уменьшение количества ошибок
– Уменьшение связанности между классами
– Улучшение повторного использования кода
– Уменьшение затрат на поддержку ПО
– Снижение стоимости разработки
Недостатки АОП
– Порог вхождения
– Похоже на магию
– Некоторые недостатки реализации
– Некоторые недостатки средств разработки
– Изучение существующих практик применения для
снижения рисков
Альтернативы АОП
– Фреймворки
– Кодогенерация
– Паттерны проектирования
– Observer
– Chain of Responsibility
– Decorator
– Proxy
Языки программирования, имеющие
реализации АОП
– Java
– .NET
– C/C++
– JavaScript
– Python
– Ruby
– PHP
– Perl
– XML
– ActionScript
– Common Lisp
– Object Pascal
– ColdFusion
– Lua
– Cocoa
Ссылки
– Аспектно-ориентированное программирование (Gregor Kiczales и др.)
– AspectJ home page
– AspectJ 5 Quick Reference
– The AspectJ Programming Guide
– Техническая библиотека IBM - AOP@work

More Related Content

What's hot

Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
Vladimir Kochetkov
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
Ciklum
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Глеб Тарасов
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
GoSharp
 
Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011
Dmytro Mindra
 

What's hot (20)

C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать Makeup
 
Автоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кодаАвтоматическая генерация патчей для уязвимого исходного кода
Автоматическая генерация патчей для уязвимого исходного кода
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
MVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяMVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоваться
 
Создание графического интерфейса пользователя мобильных Android приложений (ч...
Создание графического интерфейса пользователя мобильных Android приложений (ч...Создание графического интерфейса пользователя мобильных Android приложений (ч...
Создание графического интерфейса пользователя мобильных Android приложений (ч...
 
Парсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangПарсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clang
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
 
создание живых сайтов
создание живых сайтовсоздание живых сайтов
создание живых сайтов
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
 
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Как разработать защищенное веб-приложение и не сойти при этом с ума? (PHDays 3)
Как разработать защищенное веб-приложение и не сойти при этом с ума? (PHDays 3)Как разработать защищенное веб-приложение и не сойти при этом с ума? (PHDays 3)
Как разработать защищенное веб-приложение и не сойти при этом с ума? (PHDays 3)
 
Как работают оптимизации компилятора
Как работают оптимизации компилятораКак работают оптимизации компилятора
Как работают оптимизации компилятора
 
MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)MVVM в WinForms – DevExpress Way (теория и практика)
MVVM в WinForms – DevExpress Way (теория и практика)
 
Паттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложенийПаттерны быстрой разработки WPF MVVM бизнес-приложений
Паттерны быстрой разработки WPF MVVM бизнес-приложений
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011
 

Similar to Aspect Oriented Approach

Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Softengi
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
Ontico
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
 

Similar to Aspect Oriented Approach (20)

Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафорCQRS на практике. В поиске точки масштабирования и новых метафор
CQRS на практике. В поиске точки масштабирования и новых метафор
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
 
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVCАрхитектура кода нового 2ГИС Web API или куда мы дели MVC
Архитектура кода нового 2ГИС Web API или куда мы дели MVC
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Виталий Каторгин, Wamba
Виталий Каторгин, WambaВиталий Каторгин, Wamba
Виталий Каторгин, Wamba
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Formal Verification of a Linux Security Module
Formal Verification of a Linux Security ModuleFormal Verification of a Linux Security Module
Formal Verification of a Linux Security Module
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 

Aspect Oriented Approach

  • 2. Аспектно-ориентированное подход (АОП) — методология программирования, основанная на идее разделения функциональности для улучшения разбиения программы на модули. АОП предлагает языковые средства, позволяющие выделять сквозную функциональность в отдельные модули, и таким образом упрощать работу с компонентами программной системы, и снижать сложность системы в целом. Методология АОП была предложена группой инженеров исследовательского центра Xerox PARC под руководством Грегора Кичалеса (Gregor Kiczales). Ими же в 2001 году было разработано аспектно-ориентированное расширение для языка Java, получившее название AspectJ.
  • 3. Система как набор функциональных требований Функциональные требования: – работа со счетами – валютные операции – работа с кредитными картами – работа с банкоматами – ... Общесистемные требования: – авторизованный доступ – целостность транзакций – ведение журнала событий – мониторинг производительности – обработка исключительных ситуаций – валидация данных – многопоточность – ... – ... Требования к банковской системе
  • 4. Проблема сквозной функциональности public class SomeBusinessClass { // Данные, отвечающие за состояние объекта // Вспомогательные данные, отвечающие за: // - авторизованный доступ к данным; // - целостность транзакций; // - ведение журнала событий; // - безопасность междупоточного взаимодействия; // - ... public void someOperation(Object...params) { // проверить уровень доступа к данным // запретить доступ к данным другим потокам выполнения // занести в журнал отметку о начале операции // Реализация логики данного метода // занести в журнал отметку о конце операции // разрешить доступ к данным другим потокам выполнения } }
  • 5. Пространство требований и реализации Отображение в реализацию Безопасность Управление транзакциями Бизнес-логика Пространство требований Безопасность Управление транзакциями Бизнес-логика Пространство реализации Сворачивание многомерного пространства требований в одномерное пространство реализации
  • 6. Спутанный код – Журналирование– Бизнес-логика – Безопасность – Управление транзакциями Отдельный модуль Система в целом
  • 8. Влияние запутанного и рассредоточенного кода на проектирование и реализацию – Плохое прослеживание назначения модуля – Низкая пригодность кода для повторного использования – Большая вероятность ошибок – Трудности в сопровождении
  • 9. Выделение сквозной функциональности с помощь аспектов Модуль счетов Модуль банкомата Модуль БД Модуль безопасности Аспект безопасности Вызовы API Автоматически интегрированные вызовы
  • 10. Фундаментальные понятия АОП ● JoinPoint — строго определённая точка выполнения программы, ассоциированная с контекстом выполнения (вызов метода, конструктора, доступ к полю класса, обработчик исключения, и т.д.) ● Pointcut — набор (срез) точек JoinPoint удовлетворяющих заданному условию. ● Advice — набор инструкций, выполняемых до, после или вместо каждой из точек выполнения (JoinPoint), входящих в заданный срез (Pointcut) ● Inter-type declaration* — способность аспекта изменять статическую структуру класса путем добавления как новых полей и методов, так и иерархии класса. ● Aspect — основная единица модульности АОП, инкапсулирующая срезы точек выполнения (Pointcut), наборы инструкци (Advice), а также Inter-type определения*. ● Weaving – процесс интеграции правил вплетения кода аспектов с кодом, ответственным за бизнес-логику, результатом которого является конечная система. * – доступно только в AspectJ
  • 11. Aspect. AspectJ public aspect SomeAspect { pointcut allMethodCalls() : call(* *.*(..)) && !within(*Aspect); before() : allMethodCalls() { Logger.log("Before " + thisJoinPoint.toLongString()); } after() : allMethodCalls() { Logger.log("Before " + thisJoinPoint.toLongString()); } declare parents : Account implements Serializable; }
  • 12. Joinpoints, доступные в AspectJ Категория Преставление Выполнение метода Тело метода Вызов метода Вызов метода Выполнение конструктора Тело конструктора Вызов конструктора Вызов конструктора Чтение поля класса Чтение поля Запись в поле класса Запись поля Обработка исключений catch-блок обработки исключения Инициализация класса Блок статической инициализации Инициализация объекта Инициализация в конструкторе
  • 13. Отношения между Joinpoints, шаблонами сигнатур и Pointcuts public class Account { private double balance; private int accountNumber; public Account(int accountNumber) { this.accountNumber = accountNumber; } public void credit(double amount) { balance += amount; } public void debit(double amount) throws InsufficientBalanceException { if (balance < amount) { throw new InsufficientBalanceException( "Недостаточный баланс."); } else { balance -= amount; } } // ... } within(Account) Pointcut Account Сигнатура типа Сигнатура метода public * Account.*(..) execution(public * Account.*(..)) Pointcut private double Account.balance get(private double Account.balance) Pointcut set(private double Account.balance) PointcutPointcut Сигнатура поля public Account.new(int) Сигнатура конструктора execution(Account.new(int)) Pointcut
  • 14. Pointcut. Мета-символы и логические операторы Операция Пример использования && call(* debit(..)) && target(Account+) || call(* int Account.*(..)) || call(* double Account.*(..)) ! !whitin(Account) Логические операторы Символ Пример использования * call(public *.new(int)) execution(public int *.get*()) .. call(public Account.new(..)) call(public int *.*(Account, .., double)) + execution(public Account+.new(..)) Мета-символы
  • 15. Pointcut. Лексические, типизированные и зависимые от аргументов Pointcut Пример within(<Синатура типа>) within(Account) withincode(<Синатура метода/конструктора>) withincode(Account.new(..)) this(<Синатура типа>) call(* *(..)) && target(Account) target(<Синатура типа>) execution(* *(..)) && this(Account) args(<Список аргументов>) execution(* Account.*(double)) && args(amount)
  • 16. Конструкция Advice Advice – набор инструкций сквозной функциональности, добавляемый до, после или вместо JoinPoint, входящих в указанный Pointcut. ● Before – набор инструкций выполняемый перед выполнением инструкций входящих в описываемую Joinpoint. ● after returning – набор инструкций выполняется после успешного возвращения значения из описываемой точки выполнения. ● after throwing – набор инструкций выполняется после возникновения исключительной ситуации в описываемой точке выполнения. ● after – набор инструкций выполняется после возвращения из описываемой точки выполнения в любом случае. ● around – набор инструкций выполняется вместо описываемой точки выполнения.
  • 17. Advice. Пример pointcut constructorCall(int accountNumber) : call(Account.new(int)) && args(accountNumber); before(int accountNumber) : constructorCall(accountNumber) { System.out.println("Before calling. Caller signature " + thisEnclosingJoinPointStaticPart.getSignature()); } after(int accountNumber) : constructorCall(accountNumber) { System.out.println("After calling."); }
  • 18. Inter-type declaration Inter-type declaration позволяют добавлять новые методы и переменные в классы, объявлять класс как реализацию интерфейса, устанавливать или отменять проверку исключений, определять предупреждения и ошибки компиляции, использовать примеси. declare parents : Account implements Serializable; declare @type: Account : @MyAnnotation; private String Account.name; private void Account.getName(String name) { this.name = name; } private String Account.getName() { return name; } declare warning : get(* System.out) && !within(Logger) : "Воспользуйтесь Logger.log()";
  • 19. Weaving – модификация исходного кода с дальнейшей компиляцией (source-to-source weaving) – модификация откомпилированного байт-кода (post-compile weaving) – модификация байт-кода загружаемого JVM при старте приложения (load-time weaving) – прямое использование паттерна Proxy
  • 20. @AspectJ @Aspect public class PureJavaAspect { @Pointcut(value = "execution(* Content.*(..))") public void parents() {} @Before("parents()") public void before(JoinPoint joinPoint) { Logger.log("Before " + joinPoint.toLongString()); } @DeclareWarning("get(* System.*) && !within(cnc.logging.Logger)") static final String warning = "Do not use System.out"; }
  • 21. AspectJ. Средства разработки Консольные: – ajc - компилятор AspectJ – ajdoc - средство документации AspectJ в стиле javadoc Визуальные: – плагин для Eclipse – плагин для NetBeans – плагин для IntelliJ IDEA
  • 22. Преимущества АОП – Упрощение дизайна – Более понятная реализация – Уменьшение объёма исходного кода – Уменьшение количества ошибок – Уменьшение связанности между классами – Улучшение повторного использования кода – Уменьшение затрат на поддержку ПО – Снижение стоимости разработки
  • 23. Недостатки АОП – Порог вхождения – Похоже на магию – Некоторые недостатки реализации – Некоторые недостатки средств разработки – Изучение существующих практик применения для снижения рисков
  • 24. Альтернативы АОП – Фреймворки – Кодогенерация – Паттерны проектирования – Observer – Chain of Responsibility – Decorator – Proxy
  • 25. Языки программирования, имеющие реализации АОП – Java – .NET – C/C++ – JavaScript – Python – Ruby – PHP – Perl – XML – ActionScript – Common Lisp – Object Pascal – ColdFusion – Lua – Cocoa
  • 26. Ссылки – Аспектно-ориентированное программирование (Gregor Kiczales и др.) – AspectJ home page – AspectJ 5 Quick Reference – The AspectJ Programming Guide – Техническая библиотека IBM - AOP@work