Автор: Пользователь скрыл имя, 28 Февраля 2012 в 10:45, курсовая работа
Аспектно-ориентированное программирование (АОП) - это новая развивающаяся концепция, призванная сократить время, стоимость и сложность разработки программного обеспечения (ПО). Известно, что в жизненном цикле ПО 70% всего времени отводится на сопровождение и внесение изменений в готовый программный код. Кроме того, фактом является положение, утверждающее, что большинство необходимых программных продуктов уже реализовано, протестировано и внедрено.
Введение 3
Глава 1. Аспектно – ориентированное программирование 4
1.1 Введение в АОП 4
1.2 Основные концепции АОП 7
1.3 AspectJ как одна из реализаций АОП 11
1.4 Другие реализации АОП 21
Глава 2. Перспективы развития аспектно – ориентированного программирования 23
2.1 Преимущества и недостатки использования АОП 23
2.2 Эволюция развития АОП 27
Заключение 29
Список литературы 30
Aspect — основная единица модульности AspectJ. В аспектах задаются срезы точек выполнения (Pointcut) и инструкции, которые выполняются в точках выполнения (Advice).
Introduction — способность аспекта изменять структуру Java-класса путем добавления новых полей и методов, так и иерархию класса.
Pointcut и Advice определяют правила интеграции. Аспект — единица, напоминающая класс в ООП, она соединяет элементы pointcut и элементы advice вместе, и формирует модуль на срезе системы.
Рассмотрим пример, демонстрирующий, как язык AspectJ реализует принципы АОП. В качестве примера возьмем модель простого графического редактора. Этот редактор может работать с двумя типами графических элементов — точкой и линией. Диаграмма классов редактора представлена на рисунке 2. Классы Point и Line реализуют интерфейс FigureElement, содержащий метод перемещения фигуры. Операциями, влияющими на обновление экрана, являются операции перемещения фигур. После перемещения фигуры необходимо обновить изображение (Display). Обновление изображения в данном случае является сквозной функциональностью, которая должна вызываться при некоторых условиях (изменении положения фигур).
Рисунок 2. Модель графического редактора.
Класс Line содержит в себе 2 экземпляра класса Point. Классы, реализующие точку и линию, могут быть представлены в следующем виде:
class Line implements FigureElement
{
private Point p1, p2;
Point getP1() { return p1; }
Point getP2() { return p2; }
void setP1(Point p1) { this.p1 = p1; }
void setP2(Point p2) { this.p2 = p2; }
void moveBy(int dx, int dy) { ... }
}
class Point implements FigureElement
{
private int x = 0, y = 0;
int getX() { return x; }
int getY() { return y; }
void setX(int x) { this.x = x; }
void setY(int y) { this.y = y; }
void moveBy(int dx, int dy) { ... }
}
Предположим, пользователь переместил фигуру на 2 пункта, при этом отработал метод lineInst.moveBy(2,2). На схеме вызываемых функций можно увидеть, как работает этот метод. В теле вызываемого метода moveBy() содержится логика перемещения фигуры; метод имеет входные параметры, возвращаемое значение и набор инструкций языка, среди которых находится вызов аналогичного метода у двух точек — элементов класса Line. Метод moveBy() класса Point также имеет входные параметры, возвращаемое значение и набор инструкций языка. Каждая строго определенная точка выполнения программы, ассоциированная с контекстом выполнения, с учетом ограничений языка AspectJ является JoinPoint-ом. Выполнение метода moveBy() класса Line, вызов метода moveBy у Point — являются точками JoinPoint.
Рисунок 3. Схема вызываемых функций.
Здесь необходимо ввести различия между точками выполнения программы в рамках AspectJ. Точки выполнения бывают двух типов — точка выполнения метода, которая представляет собой выполнение всего тела метода, и точка вызова метода, которая представляет собой точку непосредственного вызова метода. Другими словами, тело метода может быть представлено точкой со стороны клиента либо только вызов метода может быть представлен как точка.
Язык AspectJ позволяет описывать несколько типов подобных точек выполнения программы:
Вызов методов и конструкторов.
Выполнение методов и конструкторов.
Доступ к полям класса.
Обработка исключительных ситуаций.
Статическая и динамическая инициализация классов.
При вызове клиентом метода moveBy все точки выполнения (joinPoint) находятся внутри потока управления, начиная с точки, удовлетворяющей условию. Средствами языка AspectJ можно влиять на поток управления, описав соответствующий поток управления как набор точек pointcut.
Конструкцией языка, позволяющей описывать набор точек JoinPoint, удовлетворяющих заданному условию, является pointcut. Например, call(void Line.setP1(Point)) соответствует каждой точке выполнения программы, если она является вызовом метода с сигнатурой "void Line.setP1(Point)". При конструировании подобных срезов можно использовать логические операции &&, || и !, что дает большую гибкость при описании наборов точек выполнения программы. Срезы точек могут иметь имя, что позволяет их повторно использовать при конструировании других срезов и описании набора инструкций Advice.
Рисунок 4. Поток выполнения метода moveBy.
Advice — набор инструкций языка java, выполняемых до, после или вместо каждой из точек выполнения, входящих в заданный срез. Язык AspectJ позволяет описывать подобные инструкции по следующим правилам:
before. Набор инструкций выполняется перед выполнением инструкций, входящих в описываемую точку выполнения.
afterreturning. Набор инструкций выполняется после возвращения значения из описываемой точки выполнения.
afterthrowing. Набор инструкций выполняется после возникновения исключительной ситуации в описываемой точке выполнения.
after. Набор инструкций выполняется после возвращения из описываемой точки выполнения в любом случае.
around. Набор инструкций выполняется вместо описываемой точки выполнения.
Приведенные правила формирования набора выполняемых инструкций в точке выполнения программы дают много возможностей при встраивании сквозной функциональности.
Аспект — единица модульности AspectJ. В аспектах задаются срезы точек выполнения и инструкции, которые выполняются в точках выполнения. Аспект имеет сходство с классом — аспект может содержать методы и поля, расширять другие классы или аспекты, или реализовывать интерфейсы.
Далее представлено два варианта кода рассматриваемого графического редактора — с использованием языка AspectJ и без него. В варианте без использования AspectJ видно, что при изменении координат фигур в методы, отвечающие за эту функциональность, встроен код, реализующий обновление дисплея. В примере с использованием аспектного подхода классы содержат код, отвечающий только за свою логику. Набор инструкций, реализующий сквозную функциональность "обновление дисплея", находится в аспектном модуле — aspect DisplayUpdating. На этом примере наглядно показано основное преимущество аспектного подхода — локализация сквозной функциональности в отдельных модулях и встраивание подобной функциональности в требуемые участки системы.
Пример кода графического редактора без использования языка AspectJ:
class Line implements FigureElement
{
private Point p1, p2;
Point getP1() { return p1; }
Point getP2() { return p2; }
void setP1(Point p1)
{
this.p1 = p1;
Display.update(this);
}
void setP2(Point p2)
{
this.p2 = p2;
Display.update(this);
}
}
class Point implements FigureElement
{
private int x = 0, y = 0;
int getX() { return x; }
int getY() { return y; }
void setX(int x)
{
this.x = x;
Display.update(this);
}
void setY(int y)
{
this.y = y;
Display.update(this);
}
}
Пример кода графического редактора с использованием языка
AspectJ:
class Line implements FigureElement
{
private Point p1, p2;
Point getP1() { return p1; }
Point getP2() { return p2; }
void setP1(Point p1)
{
this.p1 = p1;
}
void setP2(Point p2)
{
this.p2 = p2;
}
}
class Point implements FigureElement
{
private int x = 0, y = 0;
int getX() { return x; }
int getY() { return y; }
void setX(int x) {this.x = x; }
void setY(int y) {this.y = y; }
}
aspect DisplayUpdating
{
pointcut move(FigureElement figElt):
target(figElt) &&
(call(void FigureElement.moveBy(int, int) ||
call(void Line.setP1(Point)) ||
call(void Line.setP2(Point)) ||
call(void Point.setX(int)) ||
call(void Point.setY(int)));
after(FigureElement fe) returning: move(fe)
{
Display.update(fe);
}
}
Рисунок 5. Аспект DisplayUpdating на срезе системы.
При разработке программных систем с использованием средств языка AspectJ можно следовать трем принципам разработки аспектного подхода: выделять в отдельные модули сквозную функциональность — провести аспектную декомпозицию; реализовать каждое требование отдельно; интегрировать аспекты в программный код. В примере с графическим редактором на этапе аспектной декомпозиции была выявлена сквозная функциональность — обновление дисплея. Данное требование было реализовано в аспектном модуле DisplayUpdating. В этом аспекте определяется срез точек move(..), которые включают в себя точки выполнения программы, после которых будет встроена требуемая сквозная функциональность. На рисунке 5 схематично изображен аспект, находящийся на срезе модели графического редактора.
Интеграция аспектов (weaving) происходит в момент компиляции. Модель построения готовой программной системы при использовании компилятора ajc изображена на рисунке 6.
Рисунок 6. Интеграция аспектов.
После компиляции получаем готовую систему с интегрированной сквозной функциональностью по правилам, описанным в аспектных модулях.
1.4 Другие релизации АОП
В данный момент, кроме представленного выше языка AspectJ, известно еще несколько систем, реализующих принципы АОП:
ANGIE Generation Now! Предоставляет новый структурированный язык для реализации различных генераторов, в том числе интеграторов аспектов.
AspectC++. Аспектно-ориентированное расширение языка С++.
AspectR. Система аспектно-ориентированного программирования на основе языка Ruby, которая позволяет в классах оборачивать код вокруг существующих методов.
AspectS. Это один из первых прототипов, который дает возможность аспектно-ориентированного программирования в среде Squeak/Smalltalk.
Apostle – система, близкая к AspectJ, АОП-расширение языка Smalltalk.
AspectC. Простое АОП-расширение языка С, похожее на AspectJ.
AspectC# реализация, добавляющая поддержку аспектов к языку C#.
Caesar. Аспектно-ориентированный язык программирования, который фокусируется на многостороннем подходе к декомпозиции и повторном использовании аспектного кода.
DemeterJ и DJ. Делаются шаги в сторону структурной инкапсуляции сквозной функциональности.
Hyper/J. Предоставляет поддержку "многомерного" разделения и интеграции концепций для стандартной Java-платформы.
JAC. Представляет собой основу, написанную на языке Java, для создания распределенных аспектно-ориентированных программных систем.
JMangler. Представляет собой каркас на языке Java для преобразования программ на этапе загрузки, с поддержкой бесконфликтной композиции из независимо друг от друга разработанных аспектов (реализуемых в виде преобразующих компонентов системы JMangler). Также есть возможность интеграции аспектов в базовые классы Java.
MixJuice – расширение языка Java, базирующееся на механизме поиска различий в модулях.
MozartProgramming System – платформа для разработки "разумных и интеллектуальных" распределенных приложений.
PROSE — аспектно-ориентированная платформа, базирующаяся на виртуальной машине Java, и позволяющая динамическое встраивание и вычленение аспектного кода.
Pythius – проект с открытым исходным кодом, добавляющий принципы АОП к языку Python.
SmartTools — аспектно-ориентированный генератор семантических каркасов (XML).
UMLAUT представляет собой систему, которая позволяет встраивать многомерные высокоуровневые UML проектные модели в модели подходящие для каждого конкретного случая реализации.
Weave.NET – проект, направленный на исследование механизма поддержки АОП без привязки к конкретному языку программирования внутри компонентной модели .NET Framework.
Глава 2. Перспективы развития аспектно – ориентированного программирования
2.1 Преимущества и недостатки использования АОП
Информация о работе Перспективы развития аспектно-ориентированного программирования