77209

Инструмент аспектно-ориентированного программирования Aspect.Java

Курсовая

Информатика, кибернетика и программирование

Данная курсовая работа посвящена такой относительно новой методологии в разработке программного обеспечения как аспектно-ориентированное программирование. Суть данного подхода – поддержка разработки и модификации сквозной функциональности (cross-cutting concerns) в больших программных системах.

Русский

2015-02-02

628 KB

3 чел.

Кафедра системного программирования СПбГУ

Курсовая работа

Инструмент аспектно-ориентированного программирования Aspect.Java

                                                                                            студента группы № 445

                                                                Андриевского Евгения Валерьевича

Научный руководитель:

профессор каф. Информатики

Сафонов Владимир Олегович

2009 год

Введение

Данная курсовая работа посвящена  такой относительно новой методологии в разработке программного обеспечения как аспектно-ориентированное программирование. Суть данного подхода –  поддержка разработки и модификации сквозной функциональности (cross-cutting concerns) в больших программных системах.

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

Такого рода функциональность в программе, реализация которой выразима в виде одного модуля или взаимосвязанной совокупности модулей, называется модульной функциональностью.

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

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

  •  безопасность – аутентификация пользователей и программ; авторизация; криптографические операции над данными с целью обеспечения их конфиденциальности и т.д.;
  •  надежность  – проверка выполнения пред- и постусловий в модулях и инвариантов в классах; обработка ошибок и др.;
  •  безопасность многопоточного выполнения кода –  синхронизация по ресурсам или по событиям, выделение критических участков кода, взаимное исключение доступа к ним и др.;
  •  протоколирование и профилирование работы программы – трассировка начала и окончания выполнения каждой функции, вывод их аргументов и результатов, сбор и вывод статистической информации об исполнении различных фрагментов программы и т.д.

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

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

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

АОП расширяет традиционную концепцию модуля понятием аспекта. Аспект – это реализация сквозной функциональности, выполненная в виде специального модуля, содержащего фрагменты кода (действия аспекта), активируемые в заданных точках целевой программы как часть новой функциональности. Определение аспекта содержит также спецификацию разреза (pointcut) кода целевой программы – совокупности правил поиска в ней точек присоединения, или точек внедрения (joinpoints), для последующего внедрения (weaving) в них действий аспекта.

Основатель АОП - Г. Кичалес (G. Kiczales), Университет Британской Колумбии, Канада, а наиболее популярный инструмент АОП для платформы Java – разработанная под его руководством система AspectJ, первая версия которой была создана в 1995 г. в фирме Xerox Palo Alto Research Corporation, США

Обзор существующих подходов и инструментов

Если говорить о различиях подходов к применению принципов АОП, сразу стоит упомянуть, что существует два типа внедрения аспектов: статически или динамически.

Инструменты АОП со статическим внедрением осуществляют преобразования целевой программы либо на уровне исходного кода, либо на уровне промежуточного кода (например, байт-кода Java, универсального промежуточного кода CIL платформы .NET или какого-либо собственного внутреннего представления, используемого только данным инструментом АОП), либо, наконец, на уровне платформенно-зависимого объектного кода (native code). Используется также подход, основанный на внедрении аспекта на этапе just-in-time компиляции, т.е. в процессе динамической компиляции метода из промежуточного в платформенно-зависимый объектный код при первом его вызове. В каждой из этих моделей внедрения, в том или ином смысле, выполняется вставка кода аспекта в целевую программу. Преимущество – более высокая эффективность результирующего кода, недостаток – увеличение его объема, что не всегда приемлемо, например, для мобильных устройств с ограниченными ресурсами.

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

Определение аспекта может быть выполнено на специальном метаязыке либо в терминах расширений базового языка программирования конструкциями АОП. При использовании метаязыка возникает проблема его отображения в базовый язык реализации, которая в некоторых инструментах решается путем конвертирования конструкций метаязыка АОП в определения специализированных атрибутов (custom attributes) в случае C# или аннотаций (annotations) в случае Java. При втором подходе возникает зависимость инструмента АОП от базового языка и всех его изменений. Код на таком расширенном  языке требует для компиляции специализированный компилятор, и при любом изменении базового языка приходится вносить соответствующие изменения в компилятор.

AspectJ

На данный момент самый популярный инструмент АОП – система AspectJ. AspectJ — это расширение языка Java, которое добавляет к Java возможности, предоставляемые АОП. Аспекты в AspectJ могут внедряться несколькими способами – на уровне исходного кода, байт-кода, во время выполнения при загрузке класса, во время JIT компиляции. Пакет AspectJ состоит из компилятора (ajc), отладчика (ajdb) и генератора документации (ajdoc). Поскольку AspectJ  является расширением Java, то любая программа, написанная на Java, будет правильной с точки зрения семантики AspectJ. Компилятор AspectJ выдает байт-код, совместимый с виртуальной машиной Java. Добавленные расширения касаются в основном способов задания правил интеграции аспектов и java-объектов. Данные правила выражаются в ключевых понятиях AspectJ:

  •  JoinPoint — точка внедрения - конкретная точка выполнения программы, ассоциированная с контекстом выполнения (вызов метода, конструктора, доступ к полю класса, обработчик исключения, и т.д.), в которую будет выполнено  внедрение (вставка кода) аспекта;
  •  Pointcut — набор (срез) точек JoinPoint, задаваемый определенным условием;
  •  Advice — набор инструкций языка Java, выполняемых до, после или вместо каждой из точек выполнения (JoinPoint), входящих в заданный срез (Pointcut) (в терминологии некоторых других инструментов АОП - Action (действие));
  •  Aspect — основная единица модульности AspectJ. В аспектах задаются срезы точек внедрения (Pointcut) и инструкции, которые выполняются в точках внедрения (Advice);
  •  Introduction — способность аспекта изменять структуру Java-класса путем добавления новых полей и методов.

 

Pointcut и Advice вместе определяют правила интеграции (внедрения). Аспект — единица, напоминающая класс в ООП, соединяет элементы pointcut и элементы advice вместе, и  формирует модуль.

 Язык AspectJ позволяет  описывать несколько типов точек выполнения программы (JoinPoint):

  •  Вызов методов и конструкторов;
  •  Выполнение методов и конструкторов;
  •  Доступ к полям класса;
  •  Обработка исключительных ситуаций;
  •  Статическая и динамическая инициализация классов;

Срезы точек могут иметь имя, что позволяет их повторно использовать при конструировании других срезов и описании набора инструкций Advice. Язык AspectJ позволяет описывать инструкции (Advice) по следующим правилам:

  •  before.  Набор инструкций выполняется перед выполнением инструкций, входящих в описываемую точку выполнения.
  •  afterreturning. Набор инструкций выполняется после возвращения значения из описываемой точки выполнения.
  •  afterthrowing. Набор инструкций выполняется после возникновения исключительной ситуации в описываемой точке выполнения.
  •  after. Набор инструкций выполняется после возвращения из описываемой точки выполнения в любом случае.
  •  around. Набор инструкций выполняется вместо описываемой точки выполнения.

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

Моя точка зрения: AspectJ – мощный инструмент, но несколько сложен в использовании и потенциально небезопасен.

 Aspect.NET

 Aspect.NET – инструмент поддержки концепций АОП в платформе .NET. Он был разработан в Санкт-Петербургском Государственном Университете под управлением профессора кафедры информатики математико-механического факультета Сафонова Владимира Олеговича. Вся сквозная функциональность системы, как и в большинстве инструментов АОП, выделяется в аспекты. В Aspect.NET для описания аспектов используется метаязык Aspect.ML, что отличается от подхода AspectJ. Для конвертации метаязыка в исходный код используется компонент системы Aspect.ML.Converter. Пока поддерживается только конвертация в C#, но т.к. Aspect.ML не зависит от конкретных языков программирования, возможна реализация конвертации в другие объектно-ориентированные языки. В Aspect.NET аспект – это класс, методы которого  аннотированы атрибутами АОП для их внедрения (используется такое средство языка C#, как специализированные атрибуты (custom attributes)).

Аспект в Aspect.NET состоит из:

  •  Данных (data)– полей;
  •  Модулей (module)- методов аспекта;
  •  Действий (action)- public static методов, вызываемых в точках внедрения внутри целевого приложения;
  •  Правил внедрения (rule)  - определяют набор точек внедрения.

Пример определения на метаязыке Aspect.ML аспекта, печатающего в консоль своеобразное приветствие перед и после вызова каждого метода:

%aspect Aspect1

using System;

{

  %modules

     private static void Say (String s)

     { Console.WriteLine(s); }

       

  %rules

     %before %call *

     %action

     public static void SayHello ()

     { Say ("Hello " + %TargetMemberInfo.ToString()); }

     

     %after %call *

     %action

     public static void SayBye ()

     { Say ("Bye " + %TargetMemberInfo.ToString()); }

}

Система Aspect.NET поддерживает статическое внедрение на уровне двоичной сборки, что обеспечивает высокую производительность, к тому же многие общие инструменты .NET могут работать с полученными сборками.

 Правила внедрения могут специфицировать вставку действий аспекта перед, после или вместо вызова метода в целевом приложении (соответственно, %before, %after или %instead). Этот набор по функциональности, конечно, значительно уступает аналогичному набору в AspectJ.

Графический интерфейс для Aspect.NET выполнен в виде дополнения (add-on) для среды Visual Studio, где, помимо прочего, реализована еще одна оригинальная идея – управляемое пользователем внедрение. Речь идет о возможности увидеть перед внедрением все найденные точки (JoinPoint) и выбрать только некоторые из них:

 

Описание проделанной работы

 Целью данной курсовой работы было реализовать графический интерфейс в рамках проекта Aspect.Java, призванного создать аналог инструмента Aspect.NET для языка Java. В Aspect.Java архитектура такая же: конвертер из метаязыка в исходный код на Java, подсистема внедрения аспектов и GUI часть.

 Графический интерфейс пользователя (GUI) системы было решено делать в виде плагина для широко известной интегрированной среды разработки Eclipse.

Eclipse Foundation – это сообщество программного обеспечения с открытым кодом, чьи проекты сфокусированы на создание и улучшение расширяемой платформы (Eclipse Platform), а так же основных инструментов к ней для разработки, запуска ПО и управления всеми этапами его жизненного цикла. Приложения – плагины (plugins) – строятся на базе этой платформы, они  получаются полностью интегрированными  в единую универсальную среду разработки. Eclipse включает в себя более 60 проектов с открытым кодом. Поучаствовать в них или стартовать новый проект может любой желающий. Особым плюсом этих проектов является их кросс-платформенность (они написаны на Java) и свободная лицензия EPL. Большой популярностью пользуется среда разработки Java (Eclipse JDT). Сотни компаний создают на основе Eclipse свои коммерческие продукты.

Все вышеперечисленные преимущества послужили причиной сделать выбор именно в пользу Eclipse, не смотря на существование других интересных систем со схожими идеями (NetBeans, IntellijIDEA).

Всю работу можно разделить на следующие части:

  •  добавление новых вариантов проекта в визард (wizard) New: Aspect Module и Aspect.ML Module;
  •  переопределение сборки (Build) для проекта Aspect.ML Module, чтобы сначала происходил вызов MLConverter, затем компилятора Java;
  •  реализация получения в процессе такой сборки отчета об ошибках конвертации и отображение их в окне Problems, специальном в Eclipse для таких целей;
  •  добавление в окне Options закладки настроек для Aspect.Java;
  •  реализация окна Aspect.Java Framework - главного рабочего окна.

Благодаря обширному, гибкому и практичному API платформы Eclipse, призванному облегчить разработчику доступ к компонентам среды и решение интеграционных задач, с добавлением новых видов проектов никаких проблем не возникло:

Модульная архитектура Eclipse построена на понятии точки расширения. Когда какой-нибудь плагин (а весь Eclipse – это и есть набор плагинов) хочет дать возможность другим плагинам расширять или как-то изменять некоторые свои части/функциональности, он определяет новую уникальную в рамках всей среды точку расширения. Она оформляется как набор Java интерфейсов и требований к наличию записи в специальном конфигурационном XML файле плагина  plugin.xml. В этом файле собирается вся информация обо всех точках системы, которые плагин расширил или которые определил сам. Взглянем на часть plugin.xml, ответственную за добавление возможности создания проектов типа Aspect Module и Aspect.ML Module:

<extension

      point="org.eclipse.ui.newWizards">

     <category

           name="Aspect project"

           id="Aspect projects">

     </category>

     <wizard

           name="Aspect Module"

           icon="icons/sample.gif"

           category="Aspect projects"

           class="edu.spsu.aspectjava.eclipse.wizards.AspectWizard"

           id="edu.spsu.aspectjava.eclipse.wizards.AspectWizard">

     </wizard>

     <wizard

           name="Aspect.ML Module"

           icon="icons/sample.gif"

           category="Aspect projects"

           class="edu.spsu.aspectjava.eclipse.wizards.AspectMLWizard"

           id="edu.spsu.aspectjava.eclipse.wizards.AspectMLWizard">

     </wizard>

 </extension>

 

 Благодаря простоте принятого формата кода XML даже непосвященный человек может без особых проблем понять, о чем идет речь.

Для переопределения процесса сборки проекта было создано aspect project nature (поведение проекта аспектов), т.е. новый тип проекта с необходимыми свойствами АОП. Для этого описание nature было добавлено в plugin.xml:

<extension

      id="AspectNature"

      name="Aspect Project Nature"

      point="org.eclipse.core.resources.natures">

     <runtime>

          <run

              class="edu.spsu.aspectjava.eclipse.natures.AspectNature">

          </run>

     </runtime>

     <builder

          id="edu.spsu.aspectjava.eclipse.builders.AspectBuilder">

     </builder>

</extension>

и был реализован интерфейс IProjectNature, главный метод которого - configure() – отвечает за добавление к проекту nature-специфичной информации, например, установка сборщика AspectBuilder.

К сожалению, закончить реализацию AspectBuilder и отчета об ошибках конвертации не удалось, так как другими участниками проекта не был доделан Aspect.ML.Converter.

Главное окно управления аспектами Aspect.Java Framework требовалось сделать по образу окна Aspect.NET Framework из дополнения к Visual Studio, для удобства пользователей. Основные интерфейсные детали и их местоположение были сохранены, за исключением тех, изменение которых требовали соглашения Eclipse по пользовательскому интерфейсу.

Окно Aspect.Java Framework реализовано в виде стандартного оконного интерфейсного элемента view. Благодаря этому оно доступно среди остальных базовых окон Eclipse (Console, Problems, Tasks,…) и тесно интегрировано в среду.

Как и Aspect.NET Framework, Aspect.Java Framework содержит 2 основные вкладки: Aspects и Joinpoints. Вкладка Visualization пока не реализована в виду ее некритичности и присутствия еще не до конца оформленных идей по ее улучшению.

Во вкладке Aspects при добавлении существующих Java архивов (JAR файлов) с аспектами  пользователь может увидеть их структуру (JAR  файлы –> аспекты –> правила), определить их порядок при внедрении:

Отображение и редактирование модели аспектов происходит по известному шаблону MVC (model-view-controller). Его использование облегчается благодаря большому набору гибких и мощных вьюеров (viewer) в пакете org.eclipse.jface.viewers. В данном случае использовался TreeViewer.

В окне Aspect.Java Framework пользователь может выбрать целевой проект для внедрения.

Каждый раз при открытии диалога “Choose project” он отображает список активных на данный момент проектов. Причем если пользователь в какой-то момент закрывает или удаляет проект, который ранее был выбран в качестве целевого для внедрения, в Aspect.Java Framework так же происходит сброс проекта, что лишний раз говорит о полной интеграции интерфейса Aspect.Java в среду Eclipse.

При нажатии кнопки “Find Joinpoints” подсистема внедрения (weaver) должна найти все точки внедрения в целевом приложении и сформированную структуру передать плагину для отображения во вкладке Joinpoints. Данная функция будет окончательно реализована при завершении работы над подсистемой внедрения (weaver).

Заключение

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

В рамках диплома планируется продолжить эту тему и реализовать рабочую версию подсистемы внедрения. Надеюсь, что к этому времени будет закончена работа над Aspect.ML конвертером, и мы получим первую версию инструмента Aspect.Java 1.0.

Источники

  1.  Safonov V.O. Using aspect-oriented programming for trustworthy software development. – Wiley Interscience. John Wiley & Sons, June 2008
  2.  Web-сайт по аспектно-ориентированной разработке программ. http://aosd.net
  3.  Валентин Павлов, Аспектно-ориентированное программирование, статья на IT Archiv (http://www.javable.com/)
  4.  Web-сайт проекта AspectJ. http://www.eclipse.org/aspectj/
  5.  Web-сайт проекта Aspect.NET http://aspectdotnet.org/
  6.  Web-сайт Eclipse Foundation http://www.eclipse.org/


 

А также другие работы, которые могут Вас заинтересовать

50400. Изучение принципа работы баллистического маятника 80.5 KB
  Определение момента инерции баллистического маятника и коэффициента упругих сил кручения.2кг Результаты опытов вводим в ПЭВМ и с помощью специальной программы производим расчет: а коэффициента упругих сил кручения: б момента инерции баллистического маятника: Задание 2. Определение момента инерции баллистического маятника и коэффициента упругих сил кручения методом наименьших квадратов.
50402. Определение скорости пули при помощи крутильного баллистического маятника 279 KB
  Цель работы: изучение принципа работы баллистического маятника и закона сохранения момента импульса; экспериментальная проверка зависимостей между физическими величинами характеризующими крутильные колебания; экспериментальное определение постоянной упругих сил кручения и момента инерции баллистического маятника; определение коэффициента затухания крутильных колебаний. экспериментальное определение с помощью баллистического маятника скорости пули Приборы и принадлежности: баллистический маятник ГРМ02 со счётчиком периодов...
50404. Изучение законов динамики вращательного движения твердого тела вокруг неподвижной оси на маятнике обербека 76.5 KB
  В этой модели считается что трение в оси блока 8 отсутствует этот блок невесом а момент сил трения Μтр в оси блока с крестовиной не зависит от угловой скорости вращения. В этих условиях ускорение груза массой m постоянно на всем отрезке Н и равно: где r – радиус намотки I – момент инерции блока с крестовиной r=r1 либо r2 I определяется положением грузов массой m´ каждый и моментом инерции блока без грузов I0.1 Проверка независимости момента сил трения Μтр от угловой скорости вращения блока Если Μтр не зависит от угловой...
50407. Зависимость между физическими величинами 70 KB
  Экспериментально проверил зависимость между физическими величинами характеризующими вращение твёрдого тела вокруг неподвижной оси I и Мтр и рассчитали их.
50408. ЭКОНОМИКА ОРГАНИЗАЦИИ (ПРЕДПРИЯТИЯ). Т.Л. Ардашева 1.44 MB
  В учебнике в соответствии с Государственным образовательным стандартом рассмотрены вопросы курса: предприятие в условиях рынка, материально-техническая база предприятия, управление, кадры и оплата труда, основные показатели хозяйственной деятельности и ее планирование. Приведены задачи и упражнения для практических занятий и список рекомендуемой литературы.