Software-Refactoring 27. Mai 2015
Überblick Was ist Refactoring und wozu dient es? Welche Refactorings gibt es? Refactoring-Katalog: www.refactoring.com Wann, wo und wie führt man Refactorings durch? Wie definiert man neue Refactorings? offene Probleme bzgl. Refactoring Werkzeugunterstützung für Refactoring Refactoring in Eclipse Literatur: M. Fowler: Refactoring, Addison-Wesley, 2005 Taentzer Softwarequalität 2015 119
Was ist Refactoring? eine Technik im Rahmen der iterativen Softwareentwicklung Restrukturierung der Software nach jedem Iterationsschritt Refactoring ist der Prozess, ein Softwaresystem so zu verändern, dass das externe Verhalten unverändert bleibt, der Code aber eine bessere Struktur erhält. (Martin Fowler) Taentzer Softwarequalität 2015 120
Wozu dient Refactoring? Verbesserung der Software, wobei die Funktionalität unverändert bleibt aus Sicht des Benutzers nicht (oder kaum) bemerkbar Mögliche Qualitätsverbesserungen des Codes: Bessere Übersichtlichkeit und Verständlichkeit Verbesserte Lesbarkeit Vereinfachte Wartbarkeit und Erweiterbarkeit Bessere Modularität (bessere Wiederverwendbarkeit) Leichtere Testbarkeit Taentzer Softwarequalität 2015 121
Refactoring-Beispiel 1 Taentzer Softwarequalität 2015 122
Refactoring: Extrahiere eine Klasse Ziel: Zusammengehörige Felder und Methoden, die in einer Klassen zusammen auftreten, werden in eine separate Klasse extrahiert. Eingabeparameter: Felder und Methoden, die extrahiert werden sollen Name der neuen Klasse Effekt: Eine neue Klasse mit einer Referenz zu dieser wird angelegt. Alle markierten Felder und Methoden werden in diese neue Klasse verschoben. Taentzer Softwarequalität 2015 123
Refactoring-Beispiel 2 Ersetze Typkonstanten durch Unterklassen Taentzer Softwarequalität 2015 124
Refactoring: Ersetze Typkonstanten Ziel: durch Unterklassen Varianten werden in Unterklassen gekapselt. Eingabeparameter: Klasse Typ-Konstanten dieser Klasse Effekt: Für jede Konstante: Erzeuge Unterklasse mit Namen der Konstanten. Lösche alle Typ-Konstanten. Lösche Typ-Attribut. Taentzer Softwarequalität 2015 125
Welche Refactorings gibt es? Mittlerweile existiert ein umfangreicher Katalog. Typische Refactoring-Methoden: Umbenennungen (Felder, Methoden, Klassen, etc.) Entfernung von redundantem Code Verschiebung eines Elements in ein anderes Modul (z.b. Methode in andere Klasse) Aufteilung oder Zusammenlegung eines Moduls (z.b. Paket oder Klasse) Extraktion einer Methode Taentzer Softwarequalität 2015 126
Konkrete Refactoring-Methoden Eine Auswahl aus dem Katalog www.refactoring.com: Innerhalb von Methoden: Extract Method Inline Method Replace Temp With Query Inline Temp Vereinfachte Bedingungen: Decompose Conditional Introduce Assertion Replace Conditional With Polymorphism Verschiebung zwischen Klassen: Move Method / Field Extract Class Hide Delegate Datenorganisation: Replace Data Value With Object Encapsulate Field Replace Array with Object Taentzer Softwarequalität 2015 127
Konkrete Refactoring-Methoden (2) Vereinfachte Methoden: Rename Method Add/Remove Parameter Introduce Parameter Object Remove Setting Method Replace Error Code with Exception Replace Exception with Test Änderungen an der Vererbungshierarchie: Pull up Field / Method Push Down Field /Method Extract Superclass / Subclass Replace Inheritance With Delegation Größere Refactorings: Tease Apart Inheritance Convert Procedural Design to Objects Taentzer Softwarequalität 2015 128
Durchführung von Refactorings nach einem Iterationsschritt auf funktionsfähigem Code fortlaufend in kleinen Schritten Tests nach jedem Schritt: Funktionalität muss erhalten bleiben Veränderung soll zu einem effektiveren System führen Komplexe Refactorings werden in mehrere kleine Refactorings zerteilt. Taentzer Softwarequalität 2015 129
Wo führt man Refactorings durch? Problem: Wie findet man die Stellen, an den Refactorings durchgeführt werden sollten? Bad Code Smells: Anzeichen auf schlechte Programmstruktur Katalog über Bad Code Smells und passende Refactorings: https://refactoring.guru/catalog Einführung von Design Patterns Taentzer Softwarequalität 2015 130
Refactoring-Beispiel 3 Student familienname:string matrikelnr: int addresse: String teilnehmer 3..* Lehrveranstaltung * titel: String * Dozent nachname: String alter: int giballelvs() gib AlleTeilnehmer() 1..* dozent Vorlesung Welche Refactorings sollten hier durchgeführt werden? Taentzer Softwarequalität 2015 131
Definition von Refactorings Refactoring als Programm- und Modelltransformation Definition von Refactorings mit einer Programmiersprache implementiert mit einer Skriptsprache beschrieben mit der Object Constraint Language (OCL) beschrieben mit Query/View/Transformation (QVT) beschrieben mit Graphtransformation beschrieben Refactoring für eine spezielle Anwendungsdomäne eine neue Sprache Taentzer Softwarequalität 2015 132
Qualität von Refactorings Verhaltensbewahrung: Was ist das Verhalten eines Systems? Auch wenn die Funktionalität gleich bleibt, kann sich der Zeit- oder Speicherplatzbedarf ändern. Wie weist man die Bewahrung von Verhalten nach? Strukturverbesserung: Wie misst man den Effekt eines Refactorings auf die Softwarequalität? Taentzer Softwarequalität 2015 133
Empirische Studien zu Refactoring In Windows7 konzentriert sich der Refactoring-Aufwand auf Module mit den meisten Abhängigkeiten. Nach dem Refactoring zeigen diese Module weniger Code-Komplexität, mehr Code- Zeilen und mehr klassenübergreifende Änderungen. [KZN14] Erfahrene Entwickler führen mehr automatisierte Refactorings aus. [NCV+13] Umbenennungen und Herausziehen von Variablen und Methoden sind die populärsten Refactorings. [NCV+13] Taentzer Softwarequalität 2015 134
Zusammenfassung Refactoring heißt Verbesserung der Software, wobei die Funktionalität unverändert bleibt. konstruktive Qualitätssicherungsmaßnahme umfangreicher Katalog an konkreten Refactoring- Methoden Werkzeugunterstützung: Eclipse Refactoring-Werkzeug weitere IDEs, wie z.b. IntelliJIDEA Offene Fragen: Wie weist man Verhaltensbewahrung von Refactorings nach? Wie führt man kohärentes Refactoring von Model und Code durch? Taentzer Softwarequalität 2015 135
Literatur [MT04] Tom Mens, Tom Tourwé: A Survey of Software Refactoring. IEEE Trans. Software Eng. 30(2): 126-139 (2004) [KZN14] Miryung Kim, Thomas Zimmermann, Nachiappan Nagappan: An Empirical Study of Refactoring Challenges and Benefits at Microsoft. IEEE Trans. Software Eng. 40(7): 633-649 (2014) [NCV+13] Stas Negara, Nicholas Chen, Mohsen Vakilian, Ralph E. Johnson, Danny Dig: A Comparative Study of Manual and Automated Refactorings. ECOOP, LNCS 7920, Springer 2013: 552-576 Taentzer Softwarequalität 2015 136