Аспект-ткач

редактировать

Аспект-ткач
Представлены два класса и один аспект. Ткач аспектов анализирует каждый класс и объединяет аспект в код реализации. Результатом являются два класса реализации с кодом аспекта, представленным в соответствующих, но разных местах в каждом классе. Аспект-ткач берет информацию из необработанных классов и аспектов и создает новые классы с аспектом code, соответствующим образом вплетенные в классы.
Доступно вAspectC ++, AspectJ
Type Аспектно-ориентированное программирование

аспект Weaver - это утилита метапрограммирования для аспектно-ориентированных языков, разработанная для выполнения инструкций, указанных в аспектах (изолированные представления важных концепций в программе) и сгенерируйте окончательный код реализации . Ткач интегрирует аспекты в места, указанные программным обеспечением, на предварительном этапе компиляции. Объединяя аспекты и классы (представления структуры сущностей в программе), ткач генерирует тканый класс.

Аспект-ткачи принимают инструкции, известные как advice, определенные с помощью pointcuts и точек соединения, специальных сегментов кода, которые указывают, что методы должны обрабатываться кодом аспекта. Реализация аспекта затем определяет, должен ли связанный код код быть добавлен до, после или во всех связанных методах. Делая это, ткачи аспектов улучшают модульность, сохраняя код в одном месте, который в противном случае был бы рассредоточен по различным, не связанным между собой классам.

Содержание
  • 1 Мотивация
  • 2 Реализация
    • 2.1 Переплетение в AspectJ
    • 2.2 Переплетение с байт-кодом
    • 2.3 Переплетение во время выполнения
  • 3 Производительность
  • 4 См. Также
  • 5 Ссылки
  • 6 Библиография
  • 7 Дополнительная литература
Мотивация

Многие языки программирования уже широко приняты и поняты. Однако желание создать радикально другие языки программирования для поддержки парадигмы аспектно-ориентированного программирования не имеет значения из-за проблем, связанных с бизнесом; есть риски, связанные с внедрением новых технологий. Использование совершенно нового языка зависит от способности компании привлекать новых разработчиков. Кроме того, необходимо отказаться от существующей кодовой базы бизнеса. Наконец, бизнесу потребуется приобрести новый набор инструментов (набор инструментов) для разработки, что часто требует как денег, так и времени. Основное беспокойство по поводу дорожных карт по внедрению новых технологий, как правило, заключается в необходимости обучения новых разработчиков и адаптации существующих процессов к новой технологии.

Для решения этих бизнес-проблем используется аспект Weaver, который позволяет использование широко распространенных языков, таких как Java, с аспектно-ориентированным программированием посредством незначительных изменений, таких как AspectJ, которые работают с существующими инструментами. Вместо того, чтобы разрабатывать совершенно новый язык, ткач аспектов интерпретирует расширения, определенные AspectJ, и строит «сплетенный» код Java, который затем может использоваться любым существующим компилятором Java. Это гарантирует, что любой существующий объектно-ориентированный код по-прежнему будет действительным аспектно-ориентированным кодом и что разработка будет казаться естественным расширением объектно-ориентированного языка. Язык программирования AspectC ++ расширяет C ++ за счет использования ткача аспектов, предлагая дополнительную эффективность по сравнению с AspectJ, которая необходима для встроенных систем сохраняя при этом преимущества аспектно-ориентированного программирования.

Реализация

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

Посредством этого процесса переплетения ткачи аспектов допускают код, который в противном случае дублировался бы в разных классах. Устраняя это дублирование, разработчики аспектов способствуют модульности сквозных проблем. Аспекты определяют код реализации, который в противном случае был бы дублирован, а затем используют pointcut и точки соединения для определения рекомендации. Во время плетения аспектный ткач использует точки и точки соединения, известные как обозначение точек, чтобы идентифицировать позиции в классах-кандидатах, в которые должна быть внедрена реализация. Затем реализация внедряется в классы в определенных точках, что позволяет выполнять код в нужное время, не полагаясь на ручное дублирование со стороны программиста.

аспекта Logger {pointcut method (): execute (* * (..)); before (): method () {System.out.println ("Вход" + thisJoinPoint.getSignature (). toString ()); } after (): method () {System.out.println ("Уход" + thisJoinPoint.getSignature (). toString ()); }} открытый класс Foo {public void bar () {System.out.println ("Выполнение Foo.bar ()"); } public void baz () {System.out.println ("Выполнение Foo.baz ()"); }}
Пример аспект и класс, определенные в AspectJ языке программирования
публичный класс Foo {public void bar () { System.out.println ("Вход в Foo.bar ()"); System.out.println ("Выполнение Foo.bar ()"); System.out.println ("Выход из Foo.bar ()"); } public void baz () {System.out.println ("Вход в Foo.baz ()"); System.out.println ("Выполнение Foo.baz ()"); System.out.println ("Выход из Foo.baz ()"); }}
Сотканный класс, который получается в результате выполнения аспекта Weaver в приведенном выше примере

Weaving в AspectJ

В языке программирования AspectJ pointcuts точки соединения и модульный код определены в блоке аспекта, аналогичном блоку Java классов. Классы определяются с использованием синтаксиса Java. Процесс переплетения состоит из выполнения рекомендаций по аспектам для создания только набора сгенерированных классов, в которые вплетен код реализации аспекта.

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

Ткач аспектов анализирует совет, указанный pointcut в аспекте, и использует этот совет для распределения кода реализации в определенный класс. Код для каждого метода немного отличается из-за небольших различий в требованиях к методу (так как метод идентификатор изменился). Ткач аспектов определяет соответствующий код для генерации в каждой ситуации в соответствии с рекомендациями по реализации, а затем внедряет его в методы, соответствующие указанному pointcut.

Ткачество к байт-коду

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

Переплетение во время выполнения

Разработки в AspectJ показали возможность включения своевременной компиляции в выполнение аспектно-ориентированного кода для удовлетворения требований к производительности. Во время выполнения ткач аспектов может преобразовывать аспекты более эффективно, чем традиционные подходы статического плетения. Использование AspectJ на виртуальной машине Java показало, что динамическое переплетение аспектов во время выполнения улучшает производительность кода на 26%. В то время как некоторые реализации виртуальных машин JIT реализуют эту возможность через новую виртуальную машину, некоторые реализации могут быть разработаны для использования функций, которые уже существуют в текущих виртуальных машинах. Требование новой виртуальной машины противоречит одной из первоначальных целей дизайна AspectJ.

Для выполнения своевременного преобразования, изменение виртуальной машины, которая выполняет скомпилированный байт-код необходим. Предлагаемое решение для AspectJ использует многоуровневый подход, который основывается на существующей виртуальной машине Java для добавления поддержки управления точками соединения и обратных вызовов для механизма динамического аспектно-ориентированного программирования. Альтернативная реализация использует механизм ткачества, который использует точки останова, чтобы остановить выполнение на pointcut, выбрать соответствующий метод, встроить его в приложение и продолжить. Было показано, что использование точек останова таким образом снижает производительность из-за очень большого количества переключателей контекста.

Производительность

производительность ткачей аспектов, а также производительность кода, который они производство, было предметом анализа. Предпочтительно, чтобы улучшение модульности, обеспечиваемое переплетением аспектов, не влияло на производительность во время выполнения. Аспект-ткачи могут выполнять оптимизацию для конкретных аспектов. В то время как традиционные оптимизации, такие как удаление неиспользуемых специальных переменных из кода аспекта, могут выполняться на времени компиляции, некоторые оптимизации могут выполняться только ткачом аспектов. Например, AspectJ содержит два похожих, но различных ключевых слова: thisJoinPoint, который содержит информацию об этом конкретном экземпляре сплетенного кода, и thisJoinPointStaticPart, который содержит информацию, общую для всех экземпляров кода, относящихся к этот набор советов. Оптимизация замены thisJoinPointболее эффективным и статическим ключевым словом thisJoinPointStaticPartможет быть выполнена только ткачом аспектов. Выполняя эту замену, тканая программа избегает создания точки соединения объекта при каждом выполнении. Исследования показали, что ненужное создание объектов точки соединения в AspectJ может привести к накладным расходам производительности на 5% во время выполнения, в то время как снижение производительности составляет только примерно 1%, когда этот объект не создается.

Компиляция- Временная производительность, как правило, хуже у аспектов ткачества, чем у их традиционных аналогов компилятора из-за дополнительной работы, необходимой для поиска методов, которые соответствуют указанным pointcut. Проведенное исследование показало, что компилятор AspectJ ajc примерно на 34% медленнее, чем компилятор Sun Microsystems Java 1.3, и примерно на 62% медленнее, чем компилятор Java 1.4.

См. Также
Ссылки
Библиография
Дополнительная литература
Последняя правка сделана 2021-06-12 00:34:57
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте