So#wareproduktlinien -Feature-Orien4erung SvenApel(UniversitätPassau) Chris4anKästner(CMU) GunterSaake,ThomasThüm(UniversitätMagdeburg) 1 WieVariabilitätimplemen4eren? Wiederverwendbare Implemen4erungs- artefakte Applica/onEng. DomainEng. Feature-Modell Feature-Auswahl 2 Generator Fer4gesProgram Ziele } } Neuar4geImplemen4erungstechniken LösenderProbleme: } } } } } 3 FeatureTraceability(inbs.beiLaufzeitvariabilität,Branches, Build-Systemen,Präprozessoren) QuerschneidendeBelange(inbs.beiFrameworks, Komponenten) PreplanningProblem(inbs.beiFrameworks,Komponenten) UnflexibleVererbungshierarchien(inbs.BeiLaufzeitvariabilität, Frameworks,Komponenten) ModulareFeature-Implemen4erung Agenda } } } } 4 Grundidee Implemen4erungmitAHEAD PrinzipderUniformität Modellbildung Grundidee 5 Ziel:Feature-Kohäsion(FeatureTraceabilityProblem) } Eigenscha#einesProgrammsalleImplemen4erungsartefakteeinesFeaturesaneinerStelleimCodezu lokalisieren } } EineFragederProgrammiersprachebzw.der Programmierumgebung! } 6 FeaturessindexplizitimProgrammcode Virtuellevs.physischeTrennung FeatureTraceabilitymitWerkzeugunterstützung Feature-Modell Ein Werkzeug verwaltet die Abbildung Implementierungsartefakte 7 FeatureTraceabilitymitSprachunterstützung Feature-Modell 1:1 Abbildung (oder zumindest 1:n) Implementierungsartefakte 8 Feature-Orien4erteProgrammierung Prehofer,ECOOP'97undBatory,ICSE'03 } SprachbasierterAnsatzzurÜberwindungdes FeatureTraceabilityProblems } JedesFeaturewirddurcheinFeature-Modul implemen4ert } } } } } 9 GuteFeatureTraceability TrennungundModularisierungvonFeatures EinfacheFeature-Komposi4on Feature-basierteProgrammgenerierung Feature-Komposi4on 10 Feature-Komposi4on 11 Feature-Komposi4on 12 Feature-Komposi4on 13 ProduktlinienmitFeature-Modulen 1:1-Abbildung von Features auf Feature-Module Feature-Module Feature-Modell Feature-Auswahl als Eingabe Feature-Auswahl 14 Fertiges Program Kompositionswerkzeug Implemen4erungmitAHEAD 15 Implemen4erungvonFeature-Modulen Au#eilunginKlassenistetabliertundalsGrundstruktur nutzbar } Featureswerdeno#vonmehrerenKlassenimplemen4ert } Klassenimplemen4ereno#mehralseinFeature } Idee:Klassenstrukturprinzipiellbeibehalten,aberKlassen au#eilenanhandvonFeatures } AHEAD(AlgebraicHierarchicalEqua4onsforApplica4on Design)oderFeatureHousealsmöglicheWerkzeuge } 16 AufspaltenvonKlassen Klassen Graph Features Search Directed Weighted Colored 17 Edge Node Weight Color Kollabora4onen&Rollen Kollabora1on:eineMengevonKlassen,diemiteinander interagieren,umeinFeaturezuimplemen4eren } VerschiedeneKlassenspielenverschiedeneRollen innerhalbeinerKollabora4on } EineKlassespieltverschiedeneRolleninverschiedenen Kollabora4onen } EineRollekapseltdasVerhalten/dieFunk4onalitäteiner Klasse,welche(s)füreineKollabora4onrelevantist } 18 Kollabora4onen&Rollen Kollaborationen Graph Edge Search Directed Weighted Colored Rollen 19 Klassen Node Weight Color Auszug:Kollabora4onenentwurf 20 class Graph { Vector nv = new Vector(); Vector ev = new Vector(); Edge add(Node n, Node m) { Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); return e; } void print() { for(int i = 0; i < ev.size(); i++) ((Edge)ev.get(i)).print(); } } class Edge { Node a, b; Edge(Node _a, Node _b) { a = _a; b = _b; } void print() { a.print(); b.print(); } } class Node { int id = 0; void print() { System.out.print(id); } } refines class Graph { Edge add(Node n, Node m) { Edge e = Super.add(n, m); e.weight = new Weight(); } Edge add(Node n, Node m, Weight w) Edge e = new Edge(n, m); nv.add(n); nv.add(m); ev.add(e); e.weight = w; return e; } } refines class Edge { Weight weight = new Weight(); void print() { Super.print(); weight.print(); } } class Weight { void print() { ... } } Auszug:Verzeichnishierarchie 21 Beispiel:Klassenverfeinerungen Edge.jak class Edge { ... } Schrittweise Erweiterung der Basisimplementierung durch Verfeinerungen Edge.jak refines class Edge { private Node start; ... } Edge.jak “Ungenaue” Definition der Basisimplementierung 22 refines class Edge { private int weight; ... } Methodenverfeinerungen(AHEAD) Methodenkönnenin jederVerfeinerung eingeführtodererweitert werden } Überschreibenvon Methoden } AufrufderMethodeaus vorherigerVerfeinerung mitSuper* } ÄhnlichzuVererbung } * Aus technischen Gründen müssen hinter Super die erwarteten Typen der Methode angegeben werden, z. B. Super(String,int).print('abc', 3) 23 class Edge { void print() { System.out.print( " Edge between " + node1 + " and " + node2); } } refines class Edge { private Node start; void print() { Super().print(); System.out.print( " directed from " + start); } } refines class Edge { private int weight; void print() { Super().print(); System.out.print( " weighted with " + weigth); } } Methodenverfeinerungen(FeatureHouse) Keinrefinesnö4g } Methodenkönnenin jederVerfeinerung eingeführtodererweitert werden } Überschreibenvon Methoden } AufrufderMethodeaus vorherigerVerfeinerung mitoriginal } ÄhnlichzuVererbung } 24 class Edge { void print() { System.out.print( " Edge between " + node1 + " and " + node2); } } class Edge { private Node start; void print() { original(); System.out.print( " directed from " + start); } } class Edge { private int weight; void print() { original(); System.out.print( " weighted with " + weigth); } } ProduktlinienmitFeature-Modulen 1:1-Abbildung von Features auf Feature-Module Feature-Module Feature-Modell Feature-Auswahl als Eingabe Feature-Auswahl 25 Fertiges Program Kompositionswerkzeug Komposi4oninAHEAD jampack Konfiguration Komponierte Jak-Dateien Composer mixin jak2java Feature-Module (Verzeichnisse) mit Jak-Dateien Java-Dateien 26 Komposi4oninFeatureHouse Konfiguration Java-Dateien FeatureHouse Feature-Module (Verzeichnisse) mit Java-Dateien 27 Komposi4onvonVerzeichnissen AlleRolleneinerKollabora4onwerdenineinemPackage/ Modulgespeichert,i.d.R.ineinemVerzeichnis } Komposi4onvonKollabora4onendurchKomposi4onvon Klassenmitallenenthaltenengleichnamigen Klassenverfeinerungen } 28 Beispielkomposi4on Graph Base Edge Node Weight Color Graph Edge Node Search Directed Weighted Colored Feature-Auswahl in Textdatei (Feature-Namen in Zeilen) 29 Komposi4onmitJampack Zusammenbauenzueiner KlassedurchÜberlagerung (superimposi4on) } Super/original-Aufrufe werdendurchinlining integriert } Ergebnis:eineKlasse } 30 class Edge { private Node start; private int weight; void print() { System.out.print( " Edge between " + node1 + " and " + node2); System.out.print( " directed from " + start); System.out.print( " weighted with " + weigth); } } Komposi4onmitMixin GenerierungeinerKlasse proRollemit entsprechender Hierarchie } Umbenennung,sodass finaleKlasseden Klassennamenerhält } ErsetzenvonSuperdurch super } 31 class Edge$$Base { void print() { ... } } class Edge$$Directed extends Edge$$Base { private Node start; void print() { super.print(); System.out.print( " directed from " + start); } } class Edge extends Edge$$Directed{ private int weight; void print() { super.print(); System.out.print( " weighted with " + weigth); } } Mixinvs.Jampack } Jampack } } ZuordnungvongeneriertenCodezuRollenverschwindetnach Generierung Mixin } } 32 Code-Overhead Langsamer,durchIndirek4onbeiMethodenaufrufen Werkzeuge } AHEADToolSuite+Dokumenta4on } } } FeatureHouse } } } KommandozeilenwerkzeugfürJava1.5,C#,C,Haskell,UML hpp://www.fosd.de/s FeatureC++ } } } KommandozeilenwerkzeugefürJak(Java1.4-Erweiterung) hpp://www.cs.utexas.edu/users/schwartz/ATS.html Alterna4vezuAHEADfürC++ hpp://www.fosd.de/fcpp FeatureIDE } } } 33 Eclipse-PluginfürAHEAD,FeatureHouseundFeatureC++ Automa4schesBauen,SyntaxHighligh4ng,etc… hpp://www.fosd.de/featureide FeatureIDE–Demo } Video-TutorialaufWebseite http://www.cs.utexas.edu/users/dsb/cs392f/Videos/FeatureIDE/ 34 ZusammenfassungzumAHEAD-Ansatz } } EineBasisklasse+beliebigeVerfeinerungen(Rollen) Klassenverfeinerungenkönnen… } } } Feldereinführen Methodeneinführen Methodenverfeinern Feature-Modul(Kollabora4on):Verzeichnismit Basisklassenund/oderVerfeinerungen } BeimÜbersetzemwerdenBasisklasse+Verfeinerungen derausgewähltenFeature-Modulezusammengebaut } 35 PrinzipderUniformität 36 PrinzipderUniformität } So#warebestehtnichtnurausJava-Quellcode } } } } } } AndereProgrammiersprachen(z.B.C++,Javascript) Build-Skripte(Make,XML) Dokumenta4on(XML,HTML,PDF,Text,Word) Gramma4ken(BNF,ANTLR,JavaCC,Bali) Modelle(UML,XMI,...) … AlleSo#ware-Artefaktemüssenverfeinertwerden können } Integra4onvonverschiedenenArtefaktenin Kollabora4onen } 37 PrinzipderUniformität Features are implemented by a diverse selection of software artifacts and any kind of software artifact can be subject of subsequent refinement. ̶ Don Batory Don Batory 38 Beispiel:PrinzipderUniformität Base Graph Edge Node Buildfile Doc Grap h.jak Edge. jak Node. jak build. xml index. htm Node .jak build. xml index. htm Search Grap h.jak Directed Grap h.jak Edge. jak build. xml index. htm Grap h.jak Edge. jak build. xml index. htm build. xml index. htm Weighted Colored Node. jak Node. jak Weitere Dateien: Grammatiken, Unit-Tests, Modelle, Spezifikationen, u.v.m. 39 Werkzeugunterstüzung } AHEAD–Konzeptsprachübergreifend,separateToolsfür: } } } } Jak(Java1.4) Xak(XML) Bali-Gramma4ken FeatureHouse–sprachübergreifendesTool,leicht erweiterbar,z.Z.implemen4ertfür: } } } } } } } 40 Java1.5 C# C Haskell JavaCC-undBali-Gramma4ken XML JML(JavaModelingLanguage) Modellbildung 41 WozueinabstraktesModell? DiskussionbisherhauptsächlichaufEbeneverschiedener Sprachkonstrukte } ModellzeigtdiegemeinsamenIdeenundignoriert „ablenkende“Details } AbstrahiertvonDetailsinAHEAD,FeatureHouseoder anderenSprachenundTools } ErmöglichtdieDiskussionvonKonzeptenunabhängig einerkonkretenProgrammiersprache (àPrinzipderUniformität) } 42 WozueinabstraktesModell? ErlaubtspäterneueOpera4onenaufFeatures (z.B.TypprüfungoderInterak4onsanalyse)formalund sprachunabhängigzudisku4eren } VereinfachtdieImplemen4erungvonWerkzeugen (z.B.Komposi4oninnererKlassen?) } AnalysealgebraischerEigenscha#envon Feature-Komposi4onàpoten4elleOp4mierung } 43 Feature-Komposi4on FeatureskönnenmitanderenFeatures„komponiert“ werdenundbildensokomplexereFeatures } Programmesindselberauch(zusammengesetzte) Features } MengeFderFeatures;Komposi4onsoperator● } (assoziativ, aber nicht kommutativ und nicht idempotent) 44 FeaturesmodelliertalsBäume EinFeaturebestehtauseinemodermehrerenCodeArtefakten,jemiteinerinternenStruktur } FeatureswerdenalsBäumemodelliert(FeatureStructure Tree–FST),welchedieStrukturderArtefaktereflek4eren } package util; class Calc { int e0 = 0, e1 = 0, e2 = 0; void enter(int val) { e2 = e1; e1 = e0; e0 = val; } void clear() { e0 = e1 = e2 = 0; } String top() { return String.valueOf(e0); } } 45 util Calc e0 e1 e2 top enter clear StrukturvonFSTs } } NurdiewesentlicheStruktureinesArtefaktsimFST BeispielJava: } } } Packages,Klassen,Methoden,undFelderabgebildet Statements,Parameter,Ini4alwertvonFeldernnichtimFST abgebildet AndereGranularitätmöglich èjenachProgrammierspracheundAufgabewählen 46 Eigenscha#envonFSTs } } KnotenimFSThabeneinenNamenundeinenTyp OrdnungderKinderkannrelevantsein package util; class Calc { int e0 = 0, e1 = 0, e2 = 0; void enter(int val) { e2 = e1; e1 = e0; e0 = val; } void clear() { e0 = e1 = e2 = 0; } String top() { return String.valueOf(e0); } } 47 util package Calc class e0 e1 e2 top enter clear field field field method method method Komposi4ondurchÜberlagerungvonBäumen package util; class Calc { void add() { e0 = e1 + e0; e1 = e2; } } ● feature: Add package util; class Calc { int e0 = 0, e1 = 0, e2 = 0; void enter(int val) { e2 = e1; e1 = e0; e0 = val; } void clear() { e0 = e1 = e2 = 0; } String top() { return String. valueOf(e0); } } feature: CalcAdd feature: CalcBase util util ● 48 e0 util = Calc Calc add = package util; class Calc { int e0 = 0, e1 = 0, e2 = 0; void enter(int val) { e2 = e1; e1 = e0; e0 = val; } void clear() { e0 = e1 = e2 = 0; } String top() {/*...*/} void add() { e0 = e1 + e0; e1 = e2; } } e1 e2 top enter clear e0 Calc e1 e2 top enter clear add ÜberlagerungvonBäumen RekursiveÜberlagerung(superimposi4on)derKnoten, beginnendbeiderWurzel } ZweiKnotenwerdenüberlagert,wenn... } } } ...ihreVaterknotenüberlagertwurden ...undbeidedengleichenNamenundTyphaben NachderÜberlagerungvonzweiKnoten,werdenihre Kinderrekursivüberlagert } WennzweiKnotennichtüberlagertwurden,werdensie beidedemErgebnisbaumanentsprechenderStelle hinzugefügt } 49 Terminal-undNichperminalknoten } Nichperminalknoten } } } } } TransparenteKnoten KönnenKinderhaben NameundTyp,aberkeinenweiterenInhalt Könnenproblemlosüberlagertwerden Terminalknoten } } } 50 HabenkeineKinder NameundTyp KönnenweiterenInhalthaben,Überlagerungdahernicht trivial Feature-Komposi4on } RekursiveKomposi4onderFST-Elemente } } } } 51 package●packageàpackage(auchfürUnterpakete) class●classàclass(auchfürinnereKlassen) method●methodà? field●fieldà? ÜberlagerungvonTerminalknoten Op4on1:ZweiTerminalknotenmitgleichemNamenund Typkönnennieüberlagertwerden } Op4on2:ZweiTerminalknotenmitgleichemNamenund Typkönnenunterbes4mmtenUmständenüberlagert werden } } } 52 method●methodàmethod,fallseineMethodedieandere erweitert,z.B.indemsieSuperoderoriginalaufru# field●fieldàfield,fallsmin.einApributkeinenIni4alwert hat Komposi4onvonTerminalknoten class Calc { int count = 0; void enter(int val) { original(val); count++; } } ● class Calc { int count; void enter(int val){ e2 = e1; e1 = e0; e0 = val; } } ... 53 ... ... Calc enter = class Calc { int count = 0; void enter(int val) { e2 = e1; e1 = e0; e0 = val; count++; } } count ● Calc enter count = Calc enter count BedingungendurchbisherigesModell DieStruktureinesFeaturesmusshierarchischsein (Baumstruktur) } JedesStrukturelementmusseinenNamenundeinenTyp haben } EinElementdarfnichtzweiKindermitdemgleichen NamenunddemgleichenTyphaben } Elemente,diekeinehierarchischeUnterstrukturhaben (Terminale)müsseneinespezielleKomposi4onsregel angebenoderkönnennichtkomponiertwerden } 54 WelcheSprachenkönnenmipelsFSTsmodelliert werden? Objektorien4erteSprachenerfüllenmeistdie Bedingungen } EinigeandereSprachen,u.a.Gramma4ken,erfüllendie Bedingungenauch } Sprachen,welchedieBedingungennichterfüllengelten alsnicht„feature-ready“,dasienichtausreichend Strukturaufweisen } EinigeSprachenkönnenmitzusätzlicherStruktur angereichertwerden,z.B.XML } 55 FeatureHouse } FeatureHouseentstandausderFormalisierung 56 FeatureHouse Java FSTs Java = Parser Pretty Printer C# C# = Parser Pretty Printer C C = Parser ⋮ Haskell Parser 57 Pretty Printer Haskell = Pretty Printer Perspek4venderModellbildung } DiskussionvonSprachmipelnunabhängigeiner spezifischenSprache,z.B. } } } } } 58 WaswürdeesbedeutenwenneinFeatureineinerKomposi4on mehrfachvorkommenkann(z.B.X●Y●X)? WiekönnenwirKomposi4onvonStrukturenerreichen,beidem dieReihenfolgederKinderwich4gist(z.B.XML)? UnterwelchenVoraussetzungenistFeature-Komposi4on kommuta4v? WiekönnenwireineSprache„feature-ready“gestalten(insb. Defini4onvonSprachmechanismenfürTerminalüberlagerung)? WaspassiertwennwirdasLöschenvonMethodenerlauben wollen? Zusammenfassung Feature-orien4erteProgrammierunglöstu.a.das Feature-Traceability-ProblemdurchKollabora4onenund Rollen(1:1-Abbildung) } Implemen4erungmipelsKlassenverfeinerungen } PrinzipderUniformität } ModellaufBasisvonFeatureStructureTrees } 59 Ausblick Implemen4erungvonquerschneidendenBelangenkann inbes4mmtenFällensehraufwendigsein } Featuressindnichtimmerunabhängig.Wie implemen4ertmanabhängigeKollabora4onen? } Bewertung/Abgrenzung } 60 Literatur } S.Apel,D.Batory,C.Kästner,andG.Saake.Feature-Oriented So#wareProductLines-ConceptsandImplementa4on.Springer, 2013. } } Sec4on6.1:Feature-OrientedProgramming D.Batory,J.N.Sarvela,andA.Rauschmayer.ScalingStep-Wise Refinement.IEEETransac4onsonSo#wareEngineering,30(6), 2004. [VorstellungvonAHEAD] } S.Apel,C.Kästner,andC.Lengauer.Language-Independentand AutomatedSo#wareComposi4on:TheFeatureHouseExperience. IEEETransac4onsonSo#wareEngineering,39(1),2013. [ÜberblicküberFSTsundFeatureHouse] } S.Apel,C.Lengauer,B.Möller,andC.Kästner.AnAlgebraic Founda4onforAutoma4cFeature-BasedProgramSynthesis. ScienceofComputerProgramming,75(11),2010. [Formalisierung&Feature-Algebra] 61 Quiz } WievieleRollenkanneinProgrammmitdreiKlassenundvierFeatures(a) maximalund(b)minimalhaben? } WielöstAHEADdasPreplanningProblem? } KannFließtext(z.B.eineDoku)alsFSTdargestelltundkomponiertwerden? } WasistderUnterschiedzwischenFSTsundASTs? 62