
- •Архитектуры и модели программ и знаний
- •Аспектно-ориентированное программирование (АОП)
- •Аспектно-ориентированное программирование:
- •Структура определения аспекта (Aspect.NET)
- •Аспекты – статические или динамические?
- •Аспекты в AspectJ (1/2)
- •Аспекты в AspectJ (2/2)
- •Аспекты в Aspect.NET
- •Подходы к АОП
- •Цели Aspect.NET
- •Aspect.NET - Обзор
- •Aspect.NET ML – метаязык АОП
- •%aspect Test
- •Aspect.NET ML - пример
- •Аспект в терминах custom-атрибутов (пример)
- •Возможности Aspect.NET ML (1/3)
- •Возможности Aspect.NET ML (2/3)
- •Возможности Aspect.NET ML (3/3)
- •Архитектура Aspect.NET
- •Примеры внедрения
- •Диаграмма классов
- •Фильтрация точек внедрения
- •Декомпилированные результаты внедрения
- •Microsoft Phoenix (http://connect.microsoft.com /phoenix)
- •Проблемы АОП и их решения в Aspect.NET
- •Литература по АОП
- •Вопросы и домашнее задание к лекции 7

Архитектуры и модели программ и знаний
Лекция 7
Аспектно-ориентированное программирование
Сафонов Владимир Олегович
Профессор кафедры информатики Заведующий лабораторией Java-технологии
(http://polyhimnie.math.spbu.ru/jtl)
Санкт-Петербургский государственный университет
Email: vosafonov@gmail.com
WWW: http://www.vladimirsafonov.org

Аспектно-ориентированное программирование (АОП)
Модульная функциональность (common concern) –
выразима некоторой обобщенной процедурой
(подпрограммой, классом и т.д.)
Сквозная функциональность (cross-cutting concern) –
реализация “пронизывает” код всей программы, рассредоточена по ней (например, security)
АОП – подход к программированию, основанный на
модуляризации сквозной функциональности
А.Л. Фуксман (Ростовский университет, 1979):
Технология вертикального слоения – предшественник АОП
1995, Xerox PARC: Gregor Kiczales и его группа
сформулировали основные понятия АОП; выпущена первая версия AspectJ – расширение Java средствами поддержки АОП
Конец 1990-х гг., IBM Research: HyperJ – многомерная
декомпозиция функциональностей; еще одно расширение Java для АОП (сложно для понимания и использования)
Разработаны сотни инструментов АОП – ANGIE, AMT, …
Aspect.NET
(C) Сафонов В.О. 2012

Аспектно-ориентированное программирование:
Аспекты
Аспект – реализация сквозной функциональностиАспект – особая разновидность модуля,
предназначенная для использования путем внедрения (weaving) фрагментов его кода в другие модулиПримеры аспектов:
- Реализация МП-безопасности в существующей библиотеке
- Реализация новой языковой конструкции исходного языка в компилятореТаким образом, аспекты фактически уже стали
повседневной необходимостью в программировании, однако до сих пор они внедряются и извлекаются “вручную”, без подходящих инструментов – отсюда трудности при сопровождении и развитии программПрименение АОП в облачных вычислениях и
сервисно-ориентированной архитектуре: Добавление новой функциональности (services, mash-ups)Потенциальная опасность АОП: “слепое”
(неуправляемое) внедрение аспектов может привести к ненадежности программы. Метод решения проблемы: user-controlled weaving (Aspect.NET)
(C) Сафонов В.О. 2012

Структура определения аспекта (Aspect.NET)
Имя аспектаПараметры аспекта (не обязательны) –
параметризованные аспекты удобныДанные аспектаМодули аспекта
Действия аспекта, с соответствующими
правилами их внедрения в целевое приложениеВозможны отдельные наборы правил
внедрения, которые могут использоваться различными аспектами
(C) Сафонов В.О. 2012

Аспекты – статические или динамические?
Первая точка зрения на аспекты:
Внедрение аспектов должно выполняться статическиВторая: Внедрение аспектов выполняется
динамически, во время выполнения if Condition then Action
Второй подход очень напоминает контрольные точки в отладчиках – известен много летНаша точка зрения: мы придерживаемся
статического подхода, но динамический подход может быть также реализован
(C) Сафонов В.О. 2012

Аспекты в AspectJ (1/2)
AspectJ: Xerox PARC (1995) -> Univ. of British
Columbia, Canada (2003), руководитель проекта: Gregor Kiczales
AspectJ – аспектно-ориентированное расширение
Java (имеет свой компилятор с расширенного языка, визуализатор аспектов и т.д.)
Pointcut (разрез) – определение правила
внедрения в аспекте, использующее шаблоны имен сущностей в целевом приложении, - либо отдельная
группа подобных правил, вне аспекта, которую могут использовать несколько аспектов
Join points (точки присоединения)– конкретные
точки в коде конкретного целевого приложения, в которые будет выполнено внедрение аспектаAdvices (фактически – действия)– действия
аспекта, которые должны быть выполнены в точках
внедрения (C) Сафонов В.О. 2012

Аспекты в AspectJ (2/2)
Аспекты в AspectJ могут внедряться
несколькими способами – на уровне исходного кода, байт-кода, во время выполнения при загрузке классаВнедрение нового определения в другой
модуль; это определение будет видимым только для аспекта, так что нарушения инкапсуляции не происходит
around S A -> B - стиль AspectJ
модификации кода во время выполнения
(самомодифицируемый код). Однако иногда такие модификации полезны
Наша точка зрения: AspectJ – мощный
инструмент, но несколько сложен в использовании и потенциально небезопасен. Может возникнуть много проблем нарушения принципов(C) Сафонов В.О. TWC2012

Аспекты в Aspect.NET
Статический подход к внедрению аспектов очень
важен: он улучшает понимание процесса изменения
целевой программы
Аспекты для .NET должны быть языково-независимыми,
в соответствии с общими принципами .NET
Использование custom-атрибутов
Синтаксический сахар: простой язык АОП-аннотаций
(Aspect.NET.ML), конвертируемых в атрибуты АОП на языке реализации
Аспектизация (классический термин – aspect mining):
конвертирование не аспектно-ориентированных
программ в аспектно-ориентированные (извлечение и “раскрашивание” аспектов)
Aspect GUI (Aspect.NET Framework): интеграция с Visual
Studio.NET; простота; возможность управлять
процессом внедрения аспектов и отменять
нежелательные точки внедрения
Сайт проекта Aspect.NET (Aspect.NET 2.1):
http://www.facultyresourcecenter.com/curriculum/pfv.aspx?I D=6801
(C) Сафонов В.О. 2012

Подходы к АОП
Расширение существующего языка (AspectJ, Aspect#) Требуют разработки специального компилятора с
расширенного языка
Динамическое внедрение (вставки и изменение кода при исполнении) - Loom.NET, RAIL:
- Пользователь не знает, какой код фактически исполняется
- Низкая производительностьСтатическое внедрение аспекта на уровне двоичной
сборки (assembly) - Aspect.NET:
- Высокая производительность - Результирующий код может быть визуализирован
(Reflector, ildasm)
- Многие общие инструменты .NET могут работать с полученными сборками
(C) Сафонов В.О. 2012

Цели Aspect.NET
Aspect.NET позволяет определить аспекты – особые модули, реализующие сквозную функциональность и предназначенные для внедрения в целевые приложения.
Выделение сквозной функциональности в аспекты улучшает структуру кода.Aspect.NET реализован как расширение (add-in) Visual Studio.NET 2005 (Whidbey), позволяет использовать АОП в удобной интегрированной среде, наряду с другими возможностями разработки программ в Visual Studio.NET
(C) Сафонов В.О. 2012