Programowanie zorientowane aspektowo

23
Programowanie zorientowane aspektowo Aspect-Oriented Programming » Magdalena Tchorzewska

description

Programowanie zorientowane aspektowo. Aspect-Oriented Programming. » Magdalena Tchorzewska. Ewolucja. Assembler Tłumaczenie formuł (Fortran) Programowanie proceduralne Abstrakcyjne typy danych (ADT) Programowanie obiektowe (OOP) Programowanie po-obiektowe (POP): - PowerPoint PPT Presentation

Transcript of Programowanie zorientowane aspektowo

Page 1: Programowanie zorientowane aspektowo

Programowaniezorientowane

aspektowoAspect-Oriented Programming

» Magdalena Tchorzewska

Page 2: Programowanie zorientowane aspektowo

Ewolucja Assembler Tłumaczenie formuł (Fortran) Programowanie proceduralne Abstrakcyjne typy danych (ADT) Programowanie obiektowe (OOP) Programowanie po-obiektowe (POP):

Programowanie aspektowe (AOP) Programowanie generyczne ...

Page 3: Programowanie zorientowane aspektowo

Implementacje Łatwa do zrozumienia i nieefektywna, Efektywna, lecz trudna do zrozumienia, Oparta na AOP, która jest zarówno łatwa

do zrozumienia, jak i efektywna. Eufemizm?

Implementacja dużych systemów OOP nadal nastręcza wiele trudności podczas prób modyfikacji kodu.

Page 4: Programowanie zorientowane aspektowo

Czym jest AOP? Jest to rozwiązanie problemu

wynikającego z użycia wielu podobnych obiektów do interakcji z wieloma klasami w tradycyjnych systemach OOP.

Nazywa się je także związkiem przecięcia (ang. cross-cutting concern), trawersacją (ang. traversal strategy) lub po prostu aspektem.

Page 5: Programowanie zorientowane aspektowo

System OOPgeneralizacja

specjalizacja

osoba

student profesor uczelnia

policz()policz()

Page 6: Programowanie zorientowane aspektowo

System AOP [1]generalizacja

specjalizacja

osoba

student profesor uczelnia

policz()policz()

aspekt

Page 7: Programowanie zorientowane aspektowo

System AOP [2]

„tkacz” (ang. weaver),w czasie kompilacji

kod źródłowy(poplątany kod)

Wysoki poziom,wynik implementacjimoże być różny

komponenty i opisy aspektów

(c) grimsay

Page 8: Programowanie zorientowane aspektowo

System AOP [3]zwykły program

funkcjonalność

struktura

synchronizacja

komponenty

aspekt 1

aspekt 2

program AOP

Page 9: Programowanie zorientowane aspektowo

Przykładowe zastosowania Rejestrowanie aktywności

użytkowników (logowanie) Rejestrowanie wystąpień błędów

(ang. error handling) Synchronizacja Optymalizacja Zarządzanie konfiguracją

Page 10: Programowanie zorientowane aspektowo

aspect PointObserving {private Vector Point.observers = new Vector();public static void addObserver(Point p, Screen s) {

p.observers.add(s); }public static void removeObserver(Point p, Screen s) {

p.observers.remove(s); }pointcut changes(Point p): target(p) && call(void Point.set*(int));after(Point p): changes(p) {

Iterator iter = p.observers.iterator();while ( iter.hasNext() ) {

updateObserver(p, (Screen)iter.next()); }

}static void updateObserver(Point p, Screen s) {

s.display(p); }

}

Przykład 1

Page 11: Programowanie zorientowane aspektowo

Przykład 2 Śledzenie:aspect SimpleTracing {

pointcut tracedCall(): call(void FigureElement.draw(GraphicsContext));before(): tracedCall() {

System.out.println("Entering: " + thisJoinPoint); }

}

Logowanie:aspect SetsInRotateCounting {

int rotateCount = 0;int setCount = 0;before(): call(void Line.rotate(double)) { rotateCount++; }before(): call(void Point.set*(int)) && cflow(call(void Line.rotate(double))) { setCount++; }

}

Page 12: Programowanie zorientowane aspektowo

Przykład 3abstract aspect SubjectObserverProtocol {

abstract pointcut stateChanges(Subject s);after(Subject s): stateChanges(s) { for (int i = 0; i < s.getObservers().size(); i++) {((Observer)s.getObservers().elementAt(i)).update(); } }

private Vector Subject.observers = new Vector();public void Subject.addObserver(Observer obs) {observers.addElement(obs); obs.setSubject(this);}public void Subject.removeObserver(Observer obs) {observers.removeElement(obs); obs.setSubject(null); }public Vector Subject.getObservers() { return observers; }private Subject Observer.subject = null;public void Observer.setSubject(Subject s) { subject = s; }public Subject Observer.getSubject() { return subject; }

}

Page 13: Programowanie zorientowane aspektowo

Co wiemy? Zmiany w każdym z aspektów są

propagowane do całego systemu podczas ponownego „tkania” kodu.

Wielkość kodu wejściowego jest nieporównywalnie mniejsza od wielkości kodu wynikowego (strukturalnego).

AOP jest rozszerzeniem dotychczas istniejących technik programowania (obiektowego).

Page 14: Programowanie zorientowane aspektowo

Co dalej? Nadal jest zbyt mało wiedzy

teoretycznej na temat interakcji między aspektami a komponentami.

Czy można utworzyć kolekcję komponentów, tak by połączyć języki aspektowe w jedną całość widoczną na różne sposoby przez różne aplikacje?

Czy musimy pisać oddzielnie aspekty dla każdego języka programowania lub różnych rodzajów komponentów?

Page 15: Programowanie zorientowane aspektowo

Aspectual components (AC)

Odpowiedź na brak niezależności od języka programowania.

Odpowiedź na potrzebę kontroli nad poplątanym kodem.

Page 16: Programowanie zorientowane aspektowo

Łączenie funkcji i obiektów

spodziewane wymagane

modyfikacja

aplikacjapołączenia

wynik

Page 17: Programowanie zorientowane aspektowo

Cechy komponentów Typowe dla klas:

Posiadają zmienne lokalne i zmienne metod

Jeden komponent może dziedziczyć od innego

Różniące się od klas: Oddzielenie komponentu/połączenia od

całości -- kod komponentu nie jest częścią aplikacji.

Page 18: Programowanie zorientowane aspektowo

Rozlokowanie połączeńconnector ShowReadAccessConn1 {

Point is ShowReadAccess.DataToAccesswith { readOp = get*; }

}

connector ShowReadAccessConn3 {{Point, Line, Rectangle} is ShowReadAccess.DataToAccess with { readOp = get*; }

}

Page 19: Programowanie zorientowane aspektowo

Dziedziczenie komponentów

component ShowReadWriteAccessextends ShowReadAccess {

participant DataToAccess {

expect void writeOp(Object[] args); replace void writeOp(Object[] args) { System.out.println("Write access on " +

this.toString());expected(args);

}}

}

Page 20: Programowanie zorientowane aspektowo

Dziedziczenie połączeńconnector ShowReadWriteAccessConn2

extends ShowReadAccessConn3 {{Point,Line,Rectangle} is DataToAccess with { writeOp =

set*; } }

Page 21: Programowanie zorientowane aspektowo

Podsumowanie AC Komplementarność w modelowaniu

współpracy pomiędzy klasami lub zachowań dla nich wspólnych

Uniwersalne zachowanie, które może być wielokrotnie wykorzystywane

Niezależne tworzenie komponentów Niezależne połączenia AC z aplikacjami Niezależne interfejsy, które mogą być

precyzyjnie zaadaptowane

Page 22: Programowanie zorientowane aspektowo

Systemy wspierające AOP Demeter (C++/Java) AspectJ HyperJ Object Teams ...

LOOM.NET i WEAVER.NET (Microsoft)

Inne: http://www.aosd.net/technology/research.php

Page 23: Programowanie zorientowane aspektowo

Źródła G. Kiczales, J. Lamping, A. Mendhekar, C. Maeda,

C.V. Lopes, J.M. Loingtier, J. Irwin „Aspect-Oriented Programming”

M. Mezini, D. Lorenz, K. Lieberherr „Components and Aspect-Oriented Design/Programming”

K. Lieberherr „Demeter and Aspect-Oriented Programming: Why are programs hard to evolve?”

D. Bruce, N. Exon „Alternatives to Aspect-Oriented Programming?”

http://www.parc2.com/csl/groups/sda/ http://www.ccs.neu.edu/research/demeter/ http://www.aspectprogramming.com/