$KK(Refacoring) $KKK(Was ist Refactoring ?) Was ist guter Design Hier meine Lieblingsdefinition aus einem Tutoriel über Extreme Programming The right design for the software is one that #Runs all the tests #Has no duplicated logic. #States every intention important to the programmers. #Has the fewest possible classes and methods In der obigen Definition ist die Reihenfolge der Anforderungen entscheident. Ein Wesen von Extreme Programming ist es, daß es keine Softwareanforderung gibt, die nicht durch Tests abgedeckt wird. Not *Most hooks *Most abstract *Designed for the ages Was ist Refactoring Durch Refactoring wird die interne Struktur von Software, aber nicht das externe Verhalten geändert. Das Ziel von Refactoring ist es den Design von Software zu verbessern. Dadurch verspricht man sich leichtere Wartung und Weiterentwicklung, sowie ein hoeherer Grad an Wiederverwendbarkeit $KKK(Warum führt redundanten Code zu höherer Wartung) Der beste Code ist nicht vorhandener Code * Viele Entwickler ändern vorhandenen Code nicht, weil sie (zurecht) Angst haben existierende Funktionalitäten zu zerstören. * Anstatt exisistierende Frameworks an neuen Anforderungen anzupassen, werden diese Frameworks weitgehend kopiert, und die Kopien den neuen Anforderungen angepasst. (Solange dem Entwickler die alten Anforderungen nicht bewusst sind, und er nicht weiss wie er die alten Anforderungen testen soll, ist dies der einzig machbare Weg sicher neue Anforderungen einzubauen). * Der Entwickler benutzt nun die alten Frameworks für die alten Anforderungen, sowie etwas abgeänderten Kopien dieser Frameworks für neue Anforderungen, d.h. der Entwickler hat verschiedene Versionen desselben Codes * Die Codemenge vergrössert sich, der Entwickler verliert den Überblick. * Oft erkennt man dann nicht welche Teile des Frameworks in welchem Kontext gebraucht werden. Es existieren aehnliche Klassen, die sich im Klassennamen kaum unterscheiden (Beispiel: Teil1, Teil2, TeilDummy ; Nuplnutzer, Nupl_nutzer, Nutzplatinenutzer) * Ändern sich alte Anforderungen, oder werden Fehler entdeckt, so müssen diese Änderungen sowohl an den kopierten als auch an den alten Frameworks vorgenommen werden. * Je älter das Projekt wird, desto teurer wird die Wartung (auch fuer nur kleine Änderungen), desto frustrierter werden Entwickler und Kunde. Fluktuation der Mitarbeiter verstärkt diese Problematik. * Zunächst verdienen wir an den hohen Wartungskosten sogar Geld. Allerdings bekommen wir erhebliche Probleme wenn der Entwickler wegläuft; bzw. der Kunde das Projekt stoppt bzw. an einer anderen Firma ueberträgt. $KKK(Warum entsteht redundanter Code) Redundanten Code kann viele Ursachen haben: *fehlende Sensibilät der Programmierer in die Problematik *Zeitdruck *keine Qualitätssicherung vorhanden *Programmierer kennen nicht die existierenden Frameworks *kein Vertrauen in existierenden Code *keine Möglichkeit die vorhandene Funktionalität zu testen $KKK(Wie entsteht durch Refactoring firmensspezifische Frameworks) * Es wird nur das codiert, was für die aktuelle Anforderung notwendig ist. * Durch Refactoring wird redundanter Code gelöscht. * Es wird automatisch fachlich und technischer Code getrennt, sobald es 2 verschiedene Anwendungsfälle gibt, die denselben technischen Code benötigen. * Synergieeffekte zwischen verschiedenen Projekten, ist nur dann möglich wenn Wissen verteilt ist. Dies geschieht durch Pair Programming mit wechselnden Partnern. * Verschiedene Projekte benötigen gemeinsames Repository $KKK(Ressourcen Refactoring) Refactoring Kenntnisse sollten zum Grundwissen jedes Programmierers von objekt orientierten Sprachen gehören. Hier einige Links um sich weiterzubilden. * [e|OO-Design Kurs von Klaus Meucht>http://www.cocodil.org/OO-Designkurs/content.htm] *Die [e|Refactoring Homepage>http://www.refactoring.com]