Please enable JavaScript.
Coggle requires JavaScript to display documents.
08 Refactoring und Legacy Code (Tool-Unterstütztes Refactoring (In allen…
08 Refactoring
und
Legacy Code
Refactoring Definition
Veränderung des Quelltextes bzw. der Struktur der Software mit dem Ziel, die Software besser lesbar und wartbar zu machen.
Gründe für Änderungen an Software
Hinzufügen von Funktionalität
Fehlerbehebung
Verbesserung des Design
Optimierungen (Geschwindigkeit/Speicher/...)
Migration auf neuere Hardware/Software
Legacy Code
Techniken
Breaking Dependencies
Sensing
Effekte von Methodenaufrufen auf andere Klassen / Datenstrukturen herausfinden
Fake-Collaborators
Ableitung der Klasse mit neuen Funktionsaufrufen
Mock-Objekte
Separation
Eine Klasse für einen Test Instanziieren
Constructor-Aufrufe mit "null"-Werten
Fake-Objekte als Parameter übergeben
Seam-Modell
Seam bedeutet "Nahtstelle"
Man versucht, Nahtstellen im Quellcode zu finden, an denen man eine veränderte Funktionalität einfügen kann
Wichtig: ein SEAM funktioniert ohne eine tatsächliche Veränderung des Quellcodes!
Techniken
C++:
Präprozessor
Linker
Java:
andere JAR-Dateien
Ableitungen von Methoden
Code-Beipspiel Legacy Code
Testklasse wird abgeleitet
Mockito wird verwendet
Legacy Code Change Algorithm
Identifiziere Stellen, die geändert werden sollen
Finde passende Stellen für Test-Methoden
Löse Abhängigkeiten (Break Dependencies)
Schreibe Test-Methoden
Führe die Änderungen durch und mache es schöner
(Nutzung von Test-Driven-Development)
Gute zusätzliche Beschreibung
https://danlimerick.wordpress.com/2012/06/11/breaking-hidden-dependencies/
Definition
Legacy Code
Existierender Quellcode für eine Anwendung, die schon lange existiert. Häufig ohne Testfälle und mit der Zeit gewachsen.
In der Regel schlecht wartbar, unübersichtlich.
Änderungen und Erweiterungen sind schwierig und nicht planbar.
Probleme
beim Umgang mit Legacy Code
Eigentlich müsste es ganz einfach sein, Testfälle zu schreiben, aber in Legacy-Code hat man sehr häufig das Problem, dass alles mit allem zusammenhängt
Man bekommt die Klassen also nicht in einen Test-Zusammenhang.
Deshalb muss man die Zusammenhänge aufbrechen (Break Dependencies)
Häufig haben die Klassen/Methoden, die man testen möchte einen Effekt auf andere Klassen, die noch nicht im "Test-Harness" sind. Dafür braucht man das "Sensing", d.h. die Möglichkeit, Werte und Zuständen von Klassen auszulesen.
Motivation
Langfristig lauffähige Software
Änderbarkeit erhalten
Höhere Qualität
Geringeres Risiko bei Veränderungen
Edit and Pray
:question:
oder
Cover and Modify
:!:
Bessere Planbarkeit
Tool-Unterstütztes Refactoring
In allen modernen IDEs integriert
Umbenennen von Attributen/Methoden/Klassen
Extraktion von Konstanten (Strings, Integer, etc.)
Extraktion von Methoden
Extraktion von Interfaces
Verschieben von Klassen
(Anpassung der Package-Struktur)
Umwandlung von Schleifen
Code-Formatierung
Code-Completion
Code Generierung (z.B. Getter/Setter)
Live-Coding Beispiel für Refactoring
Rezepte mit Zutaten und Mengen
Vorratsschrank
Aufgabe: Welche Rezepte kann ich mit den vorhandenen Vorräten kochen?
Komplexe Methode
Refactoring
Prof. Dr. Kai Renz, h-da
SE SS17,
kai.renz@h-da.de