Mustersuche in Quellcode Komponentenbasierte Softwareentwicklung 13.07.2005 Peter Schübel 1
Gliederung 1. Vorstellung des Projekts InPulse 2. Design Patterns 1. Idee 2. Beispiele 3. Referenzsystem World Simulator 4. Mustersuche 1. Suchalgorithmen 2. Werkzeuge / Schnittstellen 3. Implementierungen 4. Ergebnisse 2
InPulse Projekt (1) = Integrative Pattern- und UML-orientierte Lernund System Entwicklungsumgebung Aufgabe: Automatische Erkennung der verwendeten Design Patterns in existierendem Quellcode Ziel: Besseres Verständnis Vereinfachtes Refactoring [1] 3
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] 4
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] 5
Design Patterns (2) Dekorierer (Decorator) Dynamisches Hinzufügen / Entfernen von Funktionalität zu Objekten Häufige Verwendung, wenn Ableitung unpraktisch ist (viele Kombinationen) [2] 6
Design Patterns (3) Dekorierer Beispiel: ScrolledWindow [2] 7
Design Patterns (4) Kompositum (Composite) Baumstrukturen (Teil-Ganzes-Hierarchien) Einzelne Objekte und Kompositionen werden gleichbehandelt [2] 8
Design Patterns (5) Kompositum Beispiel: Vektorgrafik [2] 9
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 10
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] 11
Mustersuche (2) [3] 12
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
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] 14
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 15
together (1) 16
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] 17
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 18
chorda -API (1) Basiert auf Meta Object Facility (OMG) abstrakte Sprache und Framework zur Verwaltung technologieneutraler Metamodelle MOF (Meta-meta) ==> UML (Meta) ==> UMLModell ==> 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] 19
chorda -API (2) [6] 20
chorda -API (3) 21
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 22
Bisherige Implementierung (1) Nutzung der OpenAPI Speicherung / Ausgabe der Suchresultate Abstrakte Klasse FindPattern häufig benötigte Methoden: 23
Bisherige Implementierung (2) Interne Repräsentation in Hashtables: 24
Neue Implementierung Nutzung der chorda -API Speicherung / Ausgabe der Suchresultate Abstrakte Klasse FindPattern häufig benötigte Methoden Interne Repräsentation durch chorda-baum 25
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")) { 26
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 [3] od 27
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))) {... 28
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 29
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 30
InPulse Plug-In (1) Starte Suche... 31
InPulse Plug-In (2) Ergebnisse: 32
Ergebnisse Qualitätsmaße: [8] Recall 100% Precision 100% Angaben zu realen Projekten? Anzahl der gefundenen Muster: Projekt/Muster Bsp. Projekt WorldSimulator Dekorierer Kompositum 1 (1) 1 (1) 0 (1) 1 (0) geerbte Methode wurde nicht berücksichtigt? 33
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 Entwurfsmustern, 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. 34
Vielen Dank für Ihre Aufmerksamkeit! 35