Menu
27.08.2014| Игорь| 0 комментариев

Аспектно-ориентированное программирование В. О. Сафонов

У нас вы можете скачать книгу Аспектно-ориентированное программирование В. О. Сафонов в fb2, txt, PDF, EPUB, doc, rtf, jar, djvu, lrf!

Автором курса написана монография по АОП на английском языке [ 1 ], ставшая классикой в области технологий разработки программ. Интересующиеся читатели могут заказать книгу через сайты amazon. NET и ссылки, которые доступны на нашем сайте. Состав нашей группы разработчиков Aspect. NET приведен на рис. Система используется в 26 странах. По АОП и системе Aspect.

NET защищено три кандидатских диссертации Д. Григорьев — ныне доцент мат-мех. Муханов ; готовятся к защите еще несколько диссертаций.

Сафоновым создана на мат-мех. Рассмотрим теперь на примере, каким образом АОП и система Aspect. Общий принцип в следующем. Облачное приложение — это ASP.

Эти управлющие коды, представляющие собой обработчики типовых событий, связанных со страницей загрузка страницы и т. NET , эти модификации выполняются автоматически и систематизировано под управлением аспектов — особых модулей сборок. NET , содержащих условия внедрения аспекта и действия аспекта. NET , осуществив поиск всех потенциальных точек внедрения, затем выполняет собственно внедрение , то есть вставляет перед, после или вместо каждого такого вызова вызов действия аспекта статического публичного метода.

Для примера обработаем с помощью аспекта простое опубликованное в облаке приложение. Результат его запуска с помощью браузера изображен на рис. Правила внедрения аспекта определяют точки присоединения join points в целевой программе, в которые должны быть добавлены действия аспекта. Именно действия аспекта, в конечном счете, определяют его функциональность.

NET - pre - processor converter — преобразует аннотации АОП в определения специализированных атрибутов АОП AOP custom attributes , специально спроектированные для , - которые помечают классы и методы как части определения аспекта см. Далее, соответствующий штатный компилятор Visual для 2. Точки присоединения в определяются по правилам внедрения, которые либо являются частью определения аспекта, либо определены в отдельном модуле — наборе правил rule set. Реализация других видов точек присоединения планируется в следующих версиях.

Процесс внедрения аспекта состоит из двух фаз: Одним из важнейших принципов , в отличие от многих других инструментов АОП, является возможность внедрения, управляемого пользователем user - controlled weaving. По завершении фазы сканирования, позволяет пользователю отметить select или отменить отметку unselect любой из найденных потенциальных точек внедрения, используя Framework GUI. Таким образом, в Aspect. NET окончательный выбор, внедрять или не внедрять аспект в ту или иную точку присоединения, остается за пользователем.

Пользователь может определять аспекты либо в форме. ML, либо непосредственно в терминах специализированных атрибутов на языке C , без использования метаязыка. Framework поддерживает два соответствующих типа проектов для определения аспектов. NET Framework на примере. Рассмотрим простой пример целевой программы и определения аспекта, предназначенного для внедрения в нее.

Опишем последовательно все этапы определения аспекта, его внедрения с помощью , и тестирование функциональности измененной целевой программы после внедрения аспекта, по сравнению с ее первоначальной версией. Данного примера вполне достаточно, чтобы изучить, как работать в Framework. Предположим, что мы создали в Visual решение solution для этой программы и назвали его ConsoleApplication 1.

Заметим при этом, что окно Framework появляется на экране как часть GUI Visual , как показано на рисунке 3. Заметим, что имеется и другая разновидность проекта — Aspect. NET module модуль Aspect. Ее следует выбрать, если мы решим обойтись без метаязыка. Предположим, что имя аспектного проекта - Aspect 1 оно выбирается по умолчанию.

Для имен файлов с кодом на метаязыке. Конвертор преобразует его в заголовок класса с именем Aspect 1. Допустимо также явное использование заголовка класса Aspect1 после заголовка аспекта. В таком случае заголовок класса не будет сгенерирован;.

Условие используется для поиска множества потенциальных точек присоединения join points в целевой программе, в которые должно быть выполнено внедрение аспекта перед вызовом каждого метода целевой программы или после его вызова, соответственно. Действие должно быть определено как public static метод.

Она преобразуется конвертором в конструкцию языка C для доступа к имени и сигнатуре целевого метода. Заметим, что в ходе сборки создан новый текстовый файл Aspect 1. На уровне языка реализации C аспект представлен определением класса, а каждое действие помечено специализированным атрибутом AspectAction, содержащим условие внедрения и используемым системой. Если пользователю так удобнее, аспект может быть определен непосредственно на C , без использования метаязыка.

В таком случае следует выбрать другой вид проекта - Aspect. NET module , для которого предлагает следующий шаблон исходного кода на C:.

Открытие целевой программы и окна Aspect. В результате увидим компоненты открытого аспекта — имя и действия, визуализируемые Framework см. После этого необходимо вызвать подсистему внедрения аспектов weaver в режиме сканирования поиска точек присоединения. Это делается нажатием кнопки Find Joinpoints. Следует отметить, что внедрение аспектов в осуществляется на уровне сборки. В этом отношении отличается от многих других инструментов АОП.

Результирующая сборка с внедрненными аспектами может быть использована самым обычным образом, например, быть дизассемблированной утилитой ildasm или отлаживаться штатным отладчиком.

Вернемся к нашему примеру. После завершения работы подсистемы внедрения на вкладке Joinpoints будут визуализированы потенциальные точки присоединения аспекта см. Визуализация точек присоединения, найденных подсистемой внедрения аспектов. Описываемая возможность — внедрение, управляемое пользователем, - позволяет сделать процесс внедрения аспектов более безопасным и разумным. Отметим еще раз, что подобная возможность отсутствует во всех известных нам остальных, даже весьма популярных, инструментах АОП.

На данном этапе имеется также возможность визуализации каждой потенциальной точки присоединения аспекта в исходном коде целевой программы. Для этого следует использовать вкладку Visualization, щелкнув на соответствующем красном отрезке, схематически изображающем точку присоединения. Наконец, для внедрения аспекта следует нажать кнопку Weave aspects. При этом вызовется weaver в режиме внедрения. После завершения внедрения аспекта Вам будет предложено одним нажатием кнопки сразу же запустить модифицированный код целевой программы.

Модифицированный код с внедренными аспектами будет записан системой в ту же директорию, в которой расположен и исходный бинарный код целевой программы. Имя модифицированного файла кода имеет вид: Далее Вы можете выгрузить из сборку аспекта, загрузить сборку другого аспекта, загрузить заново все сборки всех аспектов, уже известных , и управлять структурой списка очереди открытых аспектов, используя соответствующие иконки на вкладке Aspects.

Как видно из рисунка, по умолчанию 2. Как уже отмечалось, для обратной совместимости с предыдущими версиями 1. При этом они не должны использовать характерное для версий 1. Если выбрать пункт AspectDef version 1. Наконец, фаза конвертирования из. ML на C может быть явным образом отменена с помощью опций , в результате чего Вы сможете использовать непосредственно язык C со специализированными атрибутами и соответствующий тип проекта - module — для определения аспектов.

Подробное описание метаязыка Aspect. Приведем полное подробное описание синтаксиса и семантики конструкций метаязыка АОП -. ML, соответствующих версии 2. За заголовком следует тело аспекта, которое может быть любым определением класса на языке C. Имя класса должно совпадать с именем аспекта. Заголовок класса class AspectName может отсутствовать. В таком случае он актоматически генерируется конвертором. Модули аспекта раздел modules не обязателен , как правило, должны быть приватными методами класса см.

Заметим, что такой подход отличается от подхода AspectJ. Мы не вводим в новую разновидность конструкции в сам язык C , а вместо этого предоставляем простые и наглядные аннотации к коду на C , объясняющие пользователям и самой системе , что данный код определения класса должен рассматриваться как аспект.

Мы считаем, что такой подход гораздо проще, не создает коллизий аспектов и классов на уровне языка реализации, а в будущих версиях он позволит нам использовать аналогичные АОП-аннотации для кода на других языках платформы.

Данное правило внедрения обеспечивает следующую функциональность: Таким образом, применение подобного рода правил внедрения существенно упрощает реализацию протоколирования целевых программ. Данное правило внедрения обеспечивает следующую функциональность. В целевом приложении, как предполагается в определении аспекта, должны быть классы, имена которых оканчиваются на BankAccount.

В таких классах, как предполагается, должен быть статический метод withdraw с одним аргументом типа float. В соответствии с данным ограничением, действие аспекта WithdrawWrapper также имеет ровно один аргумент типа float. Возможность фильтрации методов по их сигнатурам - весьма важный и мощный инструмент. Вот несколько примеров фильтрации методов:. Правила внедрения определяют, каким образом аспект в вставляет вызовы действий аспекта перед точкой присоединения , после нее или вместо нее - точки фрагмента в коде целевой программы, который подсистема внедрения находит, в соответствии с условием правила.

В текущей версии - 2. Это означает, что подсистема внедрения может вставлять вызовы действий аспекта перед вызовом, после или вместо вызова метода в целевой программе. В последующих версиях мы также планируем реализовать две других разновидности точек присоединения — assign присваивание именованной сущности и use использование именованной сущности.

Условие правила внедрения в общем случае может быть дизъюнкцией предложений:. Если искомый метод целевой программы принадлежит ее классу C , то для имени данного метода должен быть использован шаблон C.

Иначе подсистема внедрения выдаст сообщение об ошибке, и внедрение будет невозможно. Это означает, что условие, задаваемое шаблоном имени метода, и данное ограничение рассматриваются как конъюнкция условий. В нем конструкция IntLiteral специфицирует номер аргумента в целевой программе нумерация начинается от 0 для захвата.

При вставке вызова действия аспекта, его аргумент должен быть первым аргументом целевого метода. Он обеспечивает доступ к аргументам целевого метода и аналогичен возможностям AspectJ.

Второй способ коммуникации — это набор простых конструкций метаязыка. ML, которые могут быть использованы в коде определения аспекта и обеспечивают доступ к имени целевого метода, номеру строчки исходного кода, где расположена точка присоединения и т.

ML, перечисленные выше, могут использоваться в определении аспекта на. ML, везде, где может быть использовано первичное выражение языка C , за исключением левых частей присваиваний, то есть указанные сущности не могут быть модифицированы аспектом. Они предоставляют базовые способы коммуникации аспекта с его точками присоединения.

Object — это ссылка на объект в целевой программе, к которому применяется целевой метод в точке присоединения. Например, если вызов целевого метода в точке присоединения имеет вид p. MemberInfo - это ссылка на объект, представляющий целевой метод из точки присоединения в традиционном стиле, принятом при использовании рефлексии.

Данная конструкция позволяет получить значительный объем информации о целевом методе и использовать ее в аспекте. Name — это public-свойство, содержащее имя целевого метода. Пример его использования — RetValue , входящий в поставку 2. Type — это ссылка на определение типа, в котором расположен вызов целевого метода.