Feature-Oriented Programming [1]

Ähnliche Dokumente
Informationsverarbeitung im Bauwesen

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Probeklausur: Programmierung WS04/05

Theorie zu Übung 8 Implementierung in Java

11.3 Virtuelle Methoden

Comparing Software Factories and Software Product Lines

Kurzeinführung in C/C++ Elementare Datentypen in C++

Einführung in Generatives Programmieren. Bastian Molkenthin

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

Übersicht. Vorstellung des OO-Paradigmas

Java, OO und UML Fortsetzung

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

3 Klassen, Attribute, Methoden

Zusammenfassung und Ausblick

Repetitorium Informatik (Java)

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Generatives Programmieren

Programmieren in Java

Kapitel 6. Vererbung

Architekturmodell: der Weg zur Klassen-Hierarchie

Algorithmen und Datenstrukturen

Klassenbeziehungen & Vererbung

Handbuch für die Erweiterbarkeit

Application Frameworks

Konstruktoren und Destruktoren Initialisierung von Objekten

Objektorientierte und Funktionale Programmierung SS 2014

Abschnitt 9: Schnittstellen: Interfaces

Überschreiben von Methoden

Nathan Burgener. Design by Contract. Modul SWE

Objekt-Komposition versus Vererbung: Decorator-Design-Pattern

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Einführung in die Programmierung Vorlesungsprüfung

Objektorientierte Programmierung Teil 1: Einführung

Kapitel 6. Vererbung

MOF Meta Object Facility. Veranstaltungsvortrag im Rahmen der Projektgruppe ComponentTools

Feature Modelle. und ihre Anwendung. Feature Modelle und ihre Anwendungen. Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn

Javakurs 2013 Objektorientierung

6. Modellierung von Informationssystemen. 6.1 Einleitung 6.2 Konzeptuelles Modell 6.3 OASIS Spezifikation 6.4 Execution Model 6.

Von der UML nach C++

Prof. W. Henrich Seite 1

Kapitel 6. Vererbung

Aspektorientierte Programmierung (aspect-oriented programming, AOP)

Probeklausur: Programmierung WS04/05

Einführung in die Java- Programmierung

12) Generische Datenstrukturen

Programmieren - Vererbung & Polymorphie

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Javakurs für Anfänger

Model Driven Development im Überblick

Vortrag im Seminar Aspektorientierte Systemprogrammierung

Einführung in C++ Vererbung und Polymorphismus

Objektorientierte Programmierung

Angewandte Softwareentwicklung Serialisierung

1. Übung zu "Numerik partieller Differentialgleichungen"

Client-Server-Beziehungen

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Software-Entwurfsmuster

Software Engineering Klassendiagramme Einführung

Programmierkurs Java

Vererbung & Schnittstellen in C#

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

2.4.3 Polymorphie (Wiederholung von Alp2)

Assoziation und Aggregation

Gebundene Typparameter

C++-Zusammenfassung. H. Schaudt. August 18, 2005

1 Polymorphie (Vielgestaltigkeit)

Factory Method (Virtual Constructor)

Aspekt Orientierte Programmierung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

12) Generische Datenstrukturen

Vererbung. Martin Wirsing. Ziele. Vererbung

Software Product Lines

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Java: Vererbung. Teil 3: super()

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Vererbung und Polymorphie

Aspekt-Orientierte Programmierung mit C++

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Vererbung. Was versteht man unter dem Begriff Vererbung?

Teil 2: OOP und JAVA (Vorlesung 11)

Ogre Einführung Teil 1

Teil 1: Grundeigenschaften von Rechnern und Software

Codegenerierung am Beispiel des PIMAR-Projekts PhoneBook. 14. Januar 2015

Relationen-Algebra und Persistenz Teil I

Advanced Software Engineering WS0910 Kapitel4. Dr. Dominik Haneberg

Objektorientierte Programmierung. Kapitel 12: Interfaces

Code-Erzeugung aus UML-Klassendiagrammen

Java I Vorlesung Vererbung und Sichtbarkeit

Softwareproduktlinien - Versionsverwaltungs- und Buildsysteme

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

C++ für Ingenieure. Einführung in die objektorientierte Programmierung. Seite Programmverzeichnis VII HARALD NAHRSTEDT

Einstieg in die Informatik mit Java

Software-Entwurfsmuster

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

1. Teilklausur. Modul "OOPM Vorlesung/Übung" Gruppe A

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Transkript:

Betriebssystemtechnik Operating System Engineering (OSE) Feature-Oriented Programming [1] (D. Batory) Motivation Software wird heute auf einem zu niedrigen Abstraktionsniveau modelliert im Zentrum der Betrachtung sind meist Klassen, Funktionen und Objekte erschwert wird dadurch... - die Konstruktion von Applikationen aus Komponenten und die automatische Analyse von Kompositionen - automatisches Generieren von Applikationen (Produktlinienvarianten) aus Spezifikationen höherer Ebene Merkmal-basierte Systembeschreibung und -generierung 1 2007 Olaf Spinczyk 2 Merkmal-basierte Beschreibung Anwender beschreiben Programme und deren Varianten mit Hilfe von abstrakten Merkmalen. Warum nicht auch die Entwickler beim Entwurf? Individuelle Programme werden in Form von Gleichungen repräsentiert: Merkmal-basierter Entwurf eine GenVoca-Konstante besteht aus Klassen Funktionen bestehen aus Klassen und Klassen-Refinements f a f b f c f d f f // Programm mit Merkmal f g // Programm mit Merkmal g i(x) // fügt Merkmal i zu x hinzu j(x) // fügt Merkmal J zu x hinzu app1 = i(f) // Merkmale i, f app2 = j(g) // Merkmale j, g app3 = i(j(f)) // Merkmale i, j, f f und g sind Konstanten i und j sind Funktionen, sog. Refinements dieses GenVoca Modell beschreibt eine Produktlinie! j i a j jede Schicht (f, j, i)... realisiert ein bestimmtes Merkmal besteht aus einer Kollaboration c j d j e j c i d i Schnittstelle 2007 Olaf Spinczyk 3 2007 Olaf Spinczyk 4

Merkmal-basierter Entwurf eine GenVoca-Konstante besteht aus Klassen die fertige Klasse wird aus Fragmenten konstruiert Funktionen bestehen aus Klassen und Klassen-Refinements Merkmal-basierte Implementierung flexible Refinement Chains erfordern, dass... ein Refinement Klassen und verfeinerte Klassen erweitern kann f j i a f a j jede Schicht (f, j, i)... realisiert ein bestimmtes Merkmal besteht aus einer Kollaboration b f c f d f c j d j e j c i d i Schnittstelle die Benutzerschnittstelle unabhängig von Verfeinerungen ist ein erster Lösungsansatz basiert(e) auf der Kombination von Templates und Vererbung leider bringt die Vererbung aber Probleme mit sich der neuere Lösungsansatz basiert auf einem neuen Sprachkonstrukt: Refinements 2007 Olaf Spinczyk 5 2007 Olaf Spinczyk 6 Implementierung mit Mixin-Layers (1) Implementierung mit Mixin-Layers (2) flexibles Erweitern, ohne die konkrete Basis zu kennen, lässt sich in C++ mittels Mixin-Klassen erledigen: template <typename Base> class Mixin : public Base { int _attr; // weiteres Attribut // weitere Methode void func() { something_before(); Base::func(); // Aufruf der Basismethode something_after(); ; die einheitliche Schnittstelle lässt sich durch ein typedef erreichen und mit der Konfigurierung kombinieren: typedef Mixin<SomeBase> SomeAPI; 2007 Olaf Spinczyk 7 Kollaborationen lassen sich durch Mixin-Layers realisieren: template <typename BaseLayer> class MixinLayer_J : public BaseLayer { // hier kommen die Verfeinerungen als nested classes class A : public BaseLayer::A { typedef typename BaseLayer::A Base; // die verfeinerte Basis int _attr; // neues Attribute void func() { something_before(); Base::func(); // Aufruf der Basismethode something_after(); ; class C : public BaseLayer::C {... ; class D : public BaseLayer::D {... ; // hier kommt eine neue Klasse class E {... ; ; 2007 Olaf Spinczyk 8

Implementierung mit Mixin-Layers (3) Vererbungsprobleme (1) Konfigurierung wieder mittels typedef: das Extensibility Problem: class Buffer {... ; typedef MixinLayer_I<Layer_F> App1; // oder typedef MixinLayer_J<Layer_G> App2; // oder typedef MixinLayer_I<MixinLayer_J<Layer_F> > App3; // Puffervarianten class FileBuffer : Buffer {... ; class SocketBuffer : Buffer {... ;... Fazit: Ziel (fast) erreicht mit Templates und Vererbung lassen sich Merkmal- Implementierungen flexibel stapeln die konfigurierenden typedefs lassen sich leicht aus abstrakten Spezifikationen generieren leider hat die Vererbung hier ein paar Nachteile... // eine Erweiterung durch Vererbung class SynchBuffer : Buffer { Mutex _lock; void put (Item i) { Secure s(_lock); Buffer::put(i); Item get () const { Secure s(_lock); return Buffer::get(); ; die Erweiterung SynchBuffer wirkt sich nicht auf abgeleitete Klassen (Varianten) aus Ursache: die Erweiterung heißt nicht Buffer 2007 Olaf Spinczyk 9 2007 Olaf Spinczyk 10 Vererbungsprobleme (2) das Constructor Propagation Problem: class TheBase { TheBase (int, double) {... ; template <typename Base> class Mixin : public Base { // obwohl keine eigenen Initialisierungen nötig sind, muss ein // Konstruktor angelegt werden, damit TheBase bedient werden kann Mixin (int i, double d) : Base(i, d) { ; wenn eine Basis einen speziellen Konstruktor hat, entsteht eine starke Schichtenabhängigkeit Ursache: Vererbung propagiert keine Konstruktoren 2007 Olaf Spinczyk 11 Implementierung mit Refinements Refinements sind eine spezielle Spracherweiterung: implementiert z.b. in Jak[1] und FeatureC++ [2] class Buffer { Base (int) {... // ein nicht-standard Konstruktor... ; // zwei Puffervarianten class FileBuffer : Buffer {... ; class SocketBuffer : Buffer {... ; // eine Erweiterung durch Refinement refines class Buffer { Mutex _lock; void put (Item i) { Secure s(_lock); super::put(i); Item get () const { Secure s(_lock); return super::get(); ; das Refinement wirkt sich auf alle abgeleiteten Klassen aus; der Konstruktor wird automatisch propagiert 2007 Olaf Spinczyk 12

Zwischenfazit FOP versucht Merkmale als First Class Entities auch bei Entwurf und Implementierung zu behandeln der Merkmalbegriff kommt also in die Welt der Programmierung! Programme werden als Gleichungen beschrieben und können leicht aus Gleichungen generiert werden Möglichkeit der Optimierung ( Automatic Programming ) Offene Fragen: Wie können die Schichten gestapelt werden, d.h. sind die Funktionen typisiert? Reicht Typisierung? Wie findet man bei mehreren funktional gleichwertigen Programmen die beste Lösung unter Beachtung nicht-funktionaler Eigenschaften? Wie sieht die Beziehung zwischen GenVoca Modellen und Merkmaldiagrammen aus? 2007 Olaf Spinczyk 13 GenVoca Grammatiken (1) GenVoca Architekturen sind immer geschichtet: g (x:s):r bedeute, dass das Merkmal g... j i f Schnittstellen Objektorientierte Virtuelle Maschinen Schnittstellen sind Typen eine virtuelle Maschine R implementiert eine Schicht x importiert, die eine VM S implementiert einen Parameter x vom Typ S hat und selbst vom Typ R ist 2007 Olaf Spinczyk 14 GenVoca Grammatiken (2) Schichten (=Merkmale) mit dem selben Typ bilden ein Realm (dt. Fachgebiet, Bereich), z.b.: S = { y, z, w R = { g(x:s), h(x:s), i(x:r) die erlaubten Konfiguration dieses Systems lassen sich durch eine äquivalente GenVoca Grammatik beschreiben: S ::= y z w ; R ::= g( S ) h( S ) i( R ) ; gültig wäre z.b.: g(y), h(z), i(i(h(w))) ungültig wäre z.b.: g(h(w)), i(y) Design Rule Checking (1) Grammatiken können nur zur Prüfung der syntaktischen Korrektheit einer Komposition benutzt werden Lösung: zusätzliche Design Rules preconditions j postconditions a j c j d j e j postrestrictions prerestrictions eine GenVoca Grammatik beschreibt eine Produktlinie! 2007 Olaf Spinczyk 15 2007 Olaf Spinczyk 16

Design Rule Checking (2) Wann ist eine Komposition zulässig? Beispiel:...... a b OK! pre: X and Y c post: X post: Y a und b sind vertauschbar OK! pre: X and Y 2007 Olaf Spinczyk 17 b a c post: Y post: X Attributierte GenVoca Modelle Welche gültige Konfiguration verbraucht am wenigsten Speicher, ist am schnellsten oder besteht nur aus verifizierten Komponenten? Derartige nicht-funktionale Eigenschaften können über Attribute erfasst werden, die automatisch bei der Auswahl berücksichtigt werden können. {size=x.size+5k {veri=x.veri && true h(x:s):r {size=x.size+20k {veri=false w:s {size=10k {veri=true h(x:s):r w:s {size=40k {veri=false {size=35k {veri=false {size=30k {veri=false {size=10k {veri=true 2007 Olaf Spinczyk 18 Attributierte GenVoca Modelle Welche gültige Konfiguration verbraucht am wenigsten Speicher, ist am schnellsten oder besteht nur aus verifizierten Komponenten? Derartige nicht-funktionale Eigenschaften können über Attribute erfasst werden, die automatisch bei der Auswahl berücksichtig werden können. {size=x.size+5k {veri=x.veri && true h(x:s):r {size=x.size+20k {veri=false w:s {size=10k {veri=true h(x:s):r w:s {size=40k {veri=false {size=35k {veri=false {size=30k {veri=false {size=10k {veri=true das Programm i(i(h(w))) hätte eine Größe von 40K und wäre nicht vollständig verifiziert 2007 Olaf Spinczyk 19 Merkmal-Modelle vs. GenVoca (1) lässt sich die Variabilität dieser Produktlinie auch als GenVoca-Grammatik ausdrücken? [ElementType] external reference Ownership Morphology LengthCounter owned reference copy polymorphic monomorphic [LengthType] int short long 2007 Olaf Spinczyk 20...

Merkmal-Modelle vs. GenVoca (1) lässt sich die Variabilität dieser Produktlinie auch als GenVoca-Grammatik JA! Es helfen ein paar einfache ausdrücken? Abbildungsregeln: Merkmaldiagramm S e 1 e 2 e n [ElementType] S e external 1 e 2 e owned n reference reference S e 1 e 2 e n Ownership Morphology LengthCounter copy Grammatik S ::= e 1 (e 2 (e n ))) ; S ::= e 2 (e n ) ; S ::= e 1 e 2 e n ; polymorphic monomorphic... S+... S ::= e 1 e 2 e n ; [LengthType] int short long 2007 Olaf Spinczyk 21... Merkmal-Modelle vs. GenVoca (2) Ergebnis der Transformation: ::= (LengthCounter (Morphology (Ownership (ElementType)))); ::= LengthCounter (Morphology (Ownership (ElementType))); ::= (Morphology (Ownership (ElementType))); ::= Morphology (Ownership (ElementType)); Ownership ::= External Reference Owned Reference ; Morphology ::= Polymorphic; LengthCounter := LengthType; Gültige Sätze der Sprache: (LengthType(((ElementType)))) (External Reference(ElementType)) die Grammatik hat im Prinzip die selbe Aussagekraft wie das Merkmaldiagramm nicht-terminale kommen allerdings in den Sätzen nicht mehr vor Constraints können über Attribute ausgedrückt werden 2007 Olaf Spinczyk 22 Merkmal-Modelle vs. GenVoca (3) für die erste Variante ergibt sich z.b. folgende Schichtenstruktur: ElementType LengthType bringt uns diese Hierarchie einer vernünftigen Implementierung näher? Merkmal-Modelle vs. GenVoca (4) Probleme (auf den ersten Blick): Mindestens ElementType und LengthType ElementType sollten eher keine Schicht, sondern Template- Parameter sein. Wo ist die eigentliche enverwaltung? LengthType und scheinbar unabhängig. Gründe: Bei der Transformation vom Merkmalmodell in die Grammatik ist der Kontext der Merkmale verloren gegangen: ElementType ist /ElementType ist /Morphology/ Die Basisebene realisiert also bereits einige enfunktionen Der Name einer Schicht im FOP repräsentiert die Implementierung eines Merkmals. Ein Merkmal im Merkmaldiagramm hat mit der Implementierung nichts zu tun! Man muss daher manuell anpassen. 2007 Olaf Spinczyk 23 2007 Olaf Spinczyk 24

Merkmal-Modelle vs. GenVoca (4) Probleme (auf den ersten Blick): Mindestens ElementType und LengthType ElementType sollten eher keine Schicht, sondern Template- Parameter sein. Wo ist die eigentliche enverwaltung? LengthType Merkmale und im scheinbar Sinne von unabhängig. FOP sind Gründe: Elemente des Lösungsraums, während Bei der Transformation Merkmalmodelle vom Merkmalmodell den Problemraum in die Grammatik ist der Kontext der beschreiben! Merkmale verloren gegangen: ElementType ist /ElementType ist /Morphology/ Die Basisebene realisiert also bereits einige enfunktionen Der Name einer Schicht im FOP repräsentiert die Implementierung eines Merkmals. Ein Merkmal im Merkmaldiagramm hat mit der Implementierung nichts zu tun! Man muss daher manuell anpassen. 2007 Olaf Spinczyk 25 Beispiel: eine e in FeatureC++ (1) class { // Datenelemente ElementType *head_; // Zeiger auf 1 Element *tail_; // weitere Elemente // Konstruktor: erzeugt eine neue e (SetHeadElementType &h, *t=0) : head_(0), tail_(0) { sethead(h); // Initialisierung des Elements void sethead(setheadelementtype &h) { head_ = &h; // hier wird nichts kopiert // oder geprüft! // Setter und Getter Funktionen ElementType &head() { return *head_; void settail( *t) { tail_ = t; *tail() const { return tail_; ; 2007 Olaf Spinczyk 26 Len Beispiel: eine e in FeatureC++ (1) class { // Datenelemente ElementType *head_; // Zeiger auf 1 Element *tail_; // weitere Elemente Dieser Typ ist hier noch unbekannt! Das // Konstruktor: erzeugt eine neue efragment funktioniert (SetHeadElementType &h, *t=0) : head_(0), tail_(0) { sethead(h); // Initialisierung des Elements void sethead(setheadelementtype &h) { head_ = &h; // hier wird nichts kopiert // oder geprüft! // Setter und Getter Funktionen ElementType &head() { return *head_; void settail( *t) { tail_ = t; *tail() const { return tail_; ; daher nicht ohne Refinement. Sicherzustellen über Design Rule Check. 2007 Olaf Spinczyk 27 Len Beispiel: eine e in FeatureC++ (2) // Erweiterungen für monomorphe en refines class { // hinzugefügte Funktion: so wird ein Element // in einer monomorphen e kopiert (evtl.) static ElementType *copy(const ElementType &e) { return new ElementType(e); // -Konstruktor // Initialisierung des Elements erweitern void sethead(setheadelementtype &h) { // Typüberprüfung mittels RTTI zur Laufzeit assert(typeid(e)==typeid(elementtype)); super::sethead(h); ; 2007 Olaf Spinczyk 28 die Schicht trägt (wie Polymorphic auch) eine passende Kopierfunktion durch ein Refinement bei und erweitert sethead um eine Typprüfung. Len

Beispiel: eine e in FeatureC++ (3) // Erweiterungen für kopierende en refines class { // hinzugefügter Typ typedef const ElementType SetHeadElementType; // Initialisierung des Elements erweitern void sethead(setheadelementtype &h) { if (head_) delete head_; // Kopieren mittels copy Funktion super::sethead(copy (h)); ~ () { // Speicherfreigabe im Destruktor delete head_; ; 2007 Olaf Spinczyk 29 Len die Schicht erweitert sethead um das Kopieren und fügt einen Destruktor hinzu. Außerdem wird hier der Typ SetHeadElementType endlich definiert. Beispiel: eine e in FeatureC++ (4) // Erweiterungen zum Zählen der Elemente template <typename ElementType, typename LengthType> class Len : public <ElementType> { LengthType length_; // Anzahl der Elemente typedef <ElementType> Type; Len(SetHeadElementType &h, Type *t=0) : Type(h,t), length_(computedlength()) { void settail( *t) { Type::setTail(t); length_ = computedlength(); const LengthType &length() const { return length_; LengthType computedlength() const { return tail()? tail()->length()+1 : 1; ; diese Schicht nutzt Vererbung, um die Länge als weiteren Template-Parameter einzubringen. 2007 Olaf Spinczyk 30 Len Beispiel: eine e in FeatureC++ (5) Beispiel: eine e in FeatureC++ (5) // Erweiterungen zum Verfolgen des Kontrollflusses refines class { // Methoden: Wrapper zur Ausgabe des Funktionsnamens void sethead(setheadelementtype &h) { cout << "sethead(" << h << ")" << endl; super::sethead(h); ElementType &head() { cout << "head()" << endl; return super::head(); void settail(returntype *t) { cout << "settail(t)" << endl; super::settail(t); ; Len // Erweiterungen zum Verfolgen des Kontrollflusses // Erweiterungen zum Verfolgen des Kontrollflusses refines class { // auch in der Len Klasse // template Methoden: <typename Wrapper zur ElementType, Ausgabe des Funktionsnamens void sethead(setheadelementtype typename LengthType> &h) { refines cout << class "sethead(" Len << h { << ")" << endl; super::sethead(h); const LengthType &length() const { ElementType cout << &head() length() { << endl; cout return << "head()" super::length(); << endl; return super::head(); void LengthType settail(returntype computedlength() *t) { const { cout cout << << "settail(t)" computedlength() << endl; << endl; super::settail(t); return super::computedlength(); ; ; Len das Refinement wirkt sich sowohl auf als auch auf die abgeleitete Len aus. leider aber nicht auf die Len Methoden 2007 Olaf Spinczyk 31 das Refinement wirkt sich sowohl auf als auch auf die abgeleitete Len aus. leider aber nicht auf die Len Methoden 2007 Olaf Spinczyk 32

Beispiel: eine e in FeatureC++ (6) um den Aufwand zu verringern, integriert FeatureC++ Feature-Oriented Programming und AOP mit AspectC++ ;-) // Erweiterungen zum Verfolgen des Kontrollflusses aspect { advice execution(derived( )) : before () { cout << JoinPoint::signature() << endl; ; 2007 Olaf Spinczyk 33 Len dabei werden Pointcuts beispielsweise automatisch so angepasst, dass sie sich nur auf Elemente in Basisebenen auswirken. die Kombination von AOP und FOP bietet noch viele spannende Forschungsthemen! Beispiel: Fazit Vergleich zur generischen Implementierung aus Synthesizing Objects : deutlich weniger Klassen keine Template Metaprogramme Es gibt allerdings auch Nachteile: weniger Konfigurierbarkeit durch den Anwendungscode zusätzliche Spracherweiterung und Werkzeuge nötig ElementType Generell ist FOP eher für Konfigurierung im Großen gedacht, wo Generizität nicht erforderlich ist. LengthType FeatureC++ unterstützt Aspekte als eine interessante Ergänzung 2007 Olaf Spinczyk 34 FOP Ausblick mit der AHEAD Tool Suite (ATS) wird die Vision verfolgt, FOP auf beliebige Artefakte (Klassen, Makefiles, Manuals,...) anzuwenden [3]. Zusammenfassung FOP versucht, eine Verbindung herzustellen zwischen... Merkmalen bzw. Merkmaldiagrammen und geschichteten Softwarearchitekturen und Entwurf und Implementierung Ziel: automatische Analyse, Optimierung und Generierung FOP eignet sich speziell für grobgranulare Konfigurierung generische Programme, die viele Varianten gleichzeitig bereitstellen stehen nicht im Zentrum der Betrachtung es geht um Produktlinien von denen z.b. ein Softwarehersteller einzelne statisch konfigurierte Varianten ausliefern will 2007 Olaf Spinczyk 35 2007 Olaf Spinczyk 36

Literatur [1] D. Batory, Homepage of the Product-Line Architecture Research Group. http://www.cs.utexas.edu/users/schwartz [2] S. Apel, Feature C++ Homepage. http://wwwiti.cs.uni-magdeburg.de/iti_db/fcc/ [3] D. Batory, J.N. Sarvela, A. Rauschmeyer, Scaling Step-Wise Refinement. International Conference on Software Engineering (ICSE 2003), May 2003. 2007 Olaf Spinczyk 37