-
13.07.05 Peter Schübel - Mustersuche in Quellcode 1
Mustersuche in Quellcode
Komponentenbasierte Softwareentwicklung
13.07.2005
Peter Schübel
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 2
Gliederung1. Vorstellung des Projekts „InPulse“2. Design Patterns
1. Idee2. Beispiele
3. Referenzsystem „World Simulator“4. Mustersuche
1. Suchalgorithmen2. Werkzeuge / Schnittstellen3. Implementierungen4. Ergebnisse
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 3
InPulse – Projekt (1)● = Integrative Pattern- und UML-orientierte Lern-
und System – Entwicklungsumgebung
● Aufgabe: Automatische Erkennung der verwendeten Design Patterns in existierendem Quellcode
● Ziel:– Besseres Verständnis– Vereinfachtes Refactoring
[1]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 4
InPulse – Projekt (2)● Laufzeit: 01.10.2003 – 30.09.2005● Beteiligte Institutionen / Firmen:– BMBF– TU Ilmenau, OFFIS Oldenburg– Daimler-Chrysler, Ulm– eXXellent solution GmbH Ulm– transit GmbH, Ilmenau– Phaidros Software AG Ilmenau
● Umfang: 211 TEUR[1]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 5
Design Patterns (1)● „...descriptions of communicating objects and
classes that are customized to solve a general design problem in a particular context.“ (Gamma...)
● Fertige Lösungsansätze für häufige Probleme● Erleichtern Verständnis von Quellcode und die
Kommunikation im Softwareentwicklungsprozess
● Gamma, Helm, Johnson, Vlissides (GOF): Festlegung von 23 objekt-orientierten Entwurfsmustern
[2]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 6
Design Patterns (2)● Dekorierer (Decorator)– Dynamisches Hinzufügen / Entfernen von
Funktionalität zu Objekten– Häufige Verwendung, wenn Ableitung
unpraktisch ist (viele Kombinationen)
[2]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 7
Design Patterns (3)
[2]
● Dekorierer – Beispiel: ScrolledWindow
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 8
Design Patterns (4)● Kompositum (Composite)– Baumstrukturen (Teil-Ganzes-Hierarchien)– Einzelne Objekte und Kompositionen werden
gleichbehandelt
[2]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 9
Design Patterns (5)● Kompositum – Beispiel: Vektorgrafik
[2]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 10
Referenzsystem „World Simulator“● Implementierung aller 23
„GoF“ Design Patterns● Dient als Referenz für
Suchalgorithmen
● Implementiert keine sinnvolle Funktionalität
● „reale“ Verwendungen von Design Pattern sind oft Variationen der „ursprünglichen“ DPs
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 11
Mustersuche (1)● 4 Diplom-/Studienarbeiten● Allg. Methodik: Suche nach Schlüsselmerkmalen– Definition von notwendigen Merkmalen– Definition von verbotenen Merkmalen– Nutzung einer API, die diese Merkmale liefert– Möglichst allgemeingültige Suchalgorithmen
● Qualitätsmaße:– Recall: % der existierenden Muster gefunden– Precision: % der gefundenen Muster korrekt
[3]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 12
Mustersuche (2)
[3]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 13
Suchalgorithmus Dekorierer● für jede Klasse i (Dekorierer) do
– gibt es 1-zu-1-Aggregation zu einer Klasse j (Komponente)?– ja: ist Klasse j Oberklasse von Klasse i?– ja: hat Klasse i Unterklasse k (konkreter Dekorierer)?– ja: für alle Methoden L von Klasse k do
● gibt es ein Aufruf auf Klasse i gefolgt von lokalem Methodenaufruf?
● ja: enthält die in Methode L aufgerufene Methode der Klasse i einen Aufruf der gleichnamigen Methode der Klasse j?
● ja: Muster gefunden– od
● od[3]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 14
Suchalgorithmus Kompositum● für jede Klasse i (Kompositum) do
– besitzt Klasse i eine 1-zu-n-Aggregation zu einer Oberklasse(Komponente)? ja: weiter
– besitzt Klasse i Unterklassen? nein: Muster gefunden– ja: für jede Unterklasse k (spez. Kompositum) von Klasse i do
● für jede Methode L der Klasse k do– ruft Methode L eine Methode der Klasse i auf, und folgt
dem ein lokaler Methodenaufruf?– nein: weiter, ja: Abbruch
● od– od– Muster gefunden
● od [3]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 15
Werkzeuge / Schnittstellen● Entwicklung in Java unter Eclipse● UML-Design Toolkit „together“– UML-Diagramme erstellen– Sourcecode-Generierung
● Java-Archiv als PlugIn nutzbar
● Auffinden der Schlüsselmerkmale:– OpenAPI von together– „chorda“-API von eXXellent
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 16
together (1)
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 17
together (2)● Entwicklungsumgebung– C++, C#, Corba IDL, Java, VisualBasic 6/.NET
● Entwurf mittels Design Patterns● Synchronhaltung Quellcode UML-Diagramme
➔ Reverse Engineering● OpenAPI liefert Daten aus Diagrammen, SourceCode
& Kommentaren– IDE (Ausgabe)– Read-Write Interface RWI– SourceCode Interface SCI (sprachenabhängig!) [7]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 18
together (3)• Probleme:
— Abhängigkeit von proprietärer API— Schlechte Performance (Java)— Virtualität, Klassennamen bei Zeigern— OpenAPI prüft nur Header-Dateien— Klassenstruktur muss separat gespeichert
werden (Hashtables)— Togethersoft von Borland aufgekauft:• Neues Datenmodell, veränderte API, Bugs...
— Kein Debuggen der PlugIns möglich
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 19
„chorda“-API (1)● Basiert auf Meta Object Facility (OMG)– abstrakte Sprache und Framework zur Verwaltung
technologieneutraler Metamodelle– MOF (Meta-meta) ==> UML (Meta) ==> UML-
Modell ==> Computer System● Allgemeines, abstraktes Modell für Quellcode● Spezialisierung: Definition konkreter Sprachelemente● Geplant als eigenständige unabhängige API– Bisher als PlugIn für together realisiert– Portierung für andere IDE's (Eclipse)
[4, 5]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 20
„chorda“-API (2)
[6]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 21
„chorda“-API (3)
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 22
„chorda“-API (4)● Probleme– Zugriff auf Daten oft sehr umständlich– Kardinalität nicht direkt abfragbar– API unvollständig
● Bisher nur konkretes Modell für Java● Expressions teilweise nicht implementiert
– Dokumentation mangelhaft– Quellcode nicht verfügbar– Keine Debug-Version
➔Nur per Log-Ausgaben nachvollziehbar
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 23
Bisherige Implementierung (1)● Nutzung der OpenAPI● Speicherung / Ausgabe der Suchresultate● Abstrakte Klasse „FindPattern“– häufig benötigte Methoden:
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 24
Bisherige Implementierung (2)● Interne Repräsentation in Hashtables:
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 25
Neue Implementierung● Nutzung der „chorda“-API● Speicherung / Ausgabe der
Suchresultate● Abstrakte Klasse „FindPattern“– häufig benötigte Methoden
● Interne Repräsentation durch chorda-Baum
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 26
FindPattern● getStatements(IModelElement methodNode)– Allgemeines Statement? => Stringvergleich
/* if(children[j].getModelElementType().equals(IModelElementJava.STATEMENT_EXPRESSION)) {
v_statements.addElement(children[j]); }*/if(children[j].getModelElementType().equals("javaExpression")){
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 27
Find_Decorator (1)● für jede Klasse i (Dekorierer) do
– gibt es 1-zu-1-Aggregation zu einer Klasse j (Komponente)?– ja: ist Klasse j Oberklasse von Klasse i?– ja: für jede Klasse j do
● ja: hat Klasse i Unterklasse k (konkreter Dekorierer)?● ja: für alle Methoden L von Klasse k do
– gibt es einen Aufruf auf Klasse i gefolgt von lokalem Methodenaufruf?
– ja: enthält die in Methode L aufgerufene Methode der Klasse i einen Aufruf der gleichnamigen Methode der Klasse j?
– ja: Muster gefunden● od
– od● od [3]
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 28
Find_Decorator (2)● Ergänzungen:– Mehrere ConcreteDecorator werden erkannt und
gespeichert– Test auf Methodenaufrufe wird für alle
aggregierten Oberklassen durchgeführt
● Probleme:– Kardinalität kann nicht direkt bestimmt werden
if(!(attribute.getSpecification().getSpecificationElementType().equals(ISpecificationElementJava.ARRAY)))
{...
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 29
Find_Composite (1)● für jede Klasse i (Kompositum) do
– besitzt Klasse i eine 1-zu-n-Aggregation zu einer Oberklasse j(Komponente)?
– ja: für jede Klasse j do● besitzt Klasse i Unterklassen? nein: Muster gefunden● ja: für jede Unterklasse k (spz. Kompositum) von Klasse i do
– für jede Methode L der Klasse j do● ruft Methode L eine Methode der Klasse i auf, und
folgt dem ein lokaler Methodenaufruf?● nein: weiter, ja: Abbruch
– od● od; Muster gefunden
– od● od
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 30
Find_Composite (2)● Ergänzungen:– Test auf Methodenaufrufe wird für alle
aggregierten Oberklassen durchgeführt
● Probleme:– Kardinalität kann nicht direkt bestimmt werden➔Akzeptieren aller Aggregationen
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 31
InPulse Plug-In (1)● Starte Suche...
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 32
InPulse Plug-In (2)● Ergebnisse:
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 33
Ergebnisse● Qualitätsmaße:– Recall 100%– Precision 100%
● Angaben zu „realen“ Projekten?● Anzahl der gefundenen Muster:
[8]
Projekt/Muster Dekorierer KompositumBsp. Projekt 1 (1) 1 (1)WorldSimulator 0 (1) 1 (0)
➔ geerbte Methode wurde nicht berücksichtigt?
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 34
Quellenangaben[1] http://www.tu-ilmenau.de/fakia/Drittmittelprojekte
[2] Gamma, et al: Design Patterns. Elements Of ReUsable Object-Oriented Software, 1995.
[3] Naumann, Sebastian: Reverse-Engineering von Entwurfs-mustern, 2001. TU Ilmenau. Diplomarbeit.
[4] http://www.software-kompetenz.de/?7116
[5] OMG: Meta Object Facility Specification, 2002. Ver 1.4
[6] chorda-Dokumentation: sprachabbildung.pdf
[7] Herbig, Jens: Reverse Engineering von Entwurfsmustern, 2003. TU Ilmenau. Studienarbeit
[8] Seidel, Antje: Analyse von Algorithmen zur automatisierten Mustererkennung, 2004. TU Ilmenau. Diplomarbeit.
-
13.07.05 Peter Schübel - Mustersuche in Quellcode 35
Vielen Dankfür Ihre
Aufmerksamkeit!