Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
Merciless Refactoring with Eclipse
Martin Lippert, Bernd Schifferit-agile GmbH
{martin.lippert, bernd.schiffer}@it-agile.dehttp://www.it-agile.de/
JAX 2006, Wiesbaden
JAX 2006 Merciless Refactoring with Eclipse 2
Part 2: Large Refactorings
Part 1: Daily RefactoringQuick fixesLocal refactoringsSmall refactorings
Hands-on demonstrations
Part 2: Large RefactoringsLarge refactoringsDependency managementTools to detect and control refactorings
Some Demos
JAX 2006 Merciless Refactoring with Eclipse 3
Generelle Prinzipien
Refactoring wird in Mikro-Schritten ausgeführt.Diese Schritte können als Mechanics formuliert werden
Siehe Mechanics in [Fowler 99]
System ist nach jedem Mikro-Schritt lauffähig!!!Kontinuierliche Integration.
Aber es gibt Ausnahmen (z.B. Rename Class ohne Automatisierung)Daher
Sichere Refactorings - während der Mechanics können keine Compilefehlerauftreten.Unsichere Refactorings - während der Mechanics kann das System zerbrechen.
JAX 2006 Merciless Refactoring with Eclipse 4
Refactoring in der Praxis
Das Ideal:Bevor eine neue Anforderung implementiert wird, zuerst prüfen, ob die Struktur für die neue Anforderung geeignet ist. Wenn nicht: RefactoringAnforderung implementieren. Dabei ggf. weitere Refactorings.Nach Implementierung des Refactorings prüfen, ob die Struktur noch sauber ist. Wenn nicht: Refactoring.
Beobachtung: Refactorings werden viel zu selten durchgeführt.
Warum?„Ist doch egal…“ ?Mangelnde Disziplin?Aufgeschobene Refactorings werden immer größer?Keine Testcases, um Refactorings zu überprüfen? Kein Sicherheitsnetz?
JAX 2006 Merciless Refactoring with Eclipse 5
Folgen
Die Struktur des Systems degeneriert und es wird immer schwieriger, Refactorings durchzuführenDie nötigen Refactorings werden immer größer und damit auch risikoreicher
Refactoring ist heute elementarer Bestandteil der Softwareentwicklung!!!
JAX 2006 Merciless Refactoring with Eclipse 6
Besser viele kleine Refactorings
Häufig kleine Refactorings durchzuführen ist nicht schwer:Das braucht wenig ZeitIst häufig gut unterstützt durch moderne IDEsIst besser als selten größere Refactorings durchzuführen
Refactorings möglichst durch die IDE erledigen lassen!!!
JAX 2006 Merciless Refactoring with Eclipse 7
No Refactoring by Copy&Paste
Refactoring mit Copy&Paste gehört der Vergangenheit an!!!
JAX 2006 Merciless Refactoring with Eclipse 8
Interessante Effekte
Z. B. Methode aus einem Interface umbenennen
getCustomer(int customerNo)
«Interface»ICustomerService
getCustomer(int customerNo)
CustomerService
getCustomer(int customerNo)
«Interface»IAccountService
getCustomer(int customerNo)
AccountService
Rename Method an dieser Stelle verändert auch den Methodennamen
JAX 2006 Merciless Refactoring with Eclipse 9
Trotzdem große Refactorings?
Viele kleine Refactorings sind gut und unersetzbar.Sie dienen uns auch dazu, die Architektur des Systems weiter zu entwickeln.
Können trotzdem größere Refactorings nötig werden?Ja!
Missverständnis: Um Architektur muss man sich bei agilen Methoden nicht kümmern.Zeitdruck.Aufgeschobene kleine Refactorings.Prototyp wird produktiv.Unvollständiges/inkonsistentes Bild der Anforderungen.System sehr groß und unübersichtlich.Zu viele Entwickler im Team.Jeder macht mal Fehler.…
JAX 2006 Merciless Refactoring with Eclipse 10
Architektur-Smells und große Refactorings
In größeren Projekten entstehen häufig strukturelle Probleme, so genannte Architektur-Smells.
Architektur-Smells sind potenzielle Defizite in den Beziehungen zwischen Paketen, Modulen, Klassen.
Unsere Erfahrung: Jedes größere Projekt hat Architektur-Smells. (Größeres Projekt: mehr als 6 Entwickler, länger als 6 Monate)
Große Refactorings helfen, Architektur-Smells zu beseitigen.
JAX 2006 Merciless Refactoring with Eclipse 12
Weitere Architektur-Smells
Parallele VererbungshierarchienFalsche Verwendung von VererbungZyklen zwischen Klassen, Packages, Subsystemen, SchichtenTechnologie auf Vorrat, ÜbergeneralisierungUnbenutzter Codezu viele Abhängigkeiten zu Basisklassenkeine Subsysteme, Schichtenzu große Packages, Subsysteme, SchichtenSubsystem-API umgangenSubsystem-API zu großSchichtung durchbrochen...
JAX 2006 Merciless Refactoring with Eclipse 13
Große Refactorings: Charakterisierung
dauern länger als ein Tagführen zu Änderungen an vielen Systemteilenbetreffen mehr als einen Entwickler / ein Pairgroßes Refactoring muss zerlegt werdenmehr als eine Liste kleiner Refactoringsenthalten häufig unsichere Refactoringsdie Folgen der Einzelschritte lassen sich nur schwer absehengroßes Refactoring muss explizit geplant werdenZwischenschritte müssen integriert werdenzerbrechen häufig Unit-Testses muss schlechter werden, bevor es besser werden kann (Umleitungen)
JAX 2006 Merciless Refactoring with Eclipse 14
Große Refactorings:Ein Schritt zurück, zwei vor :-)
Des
ign-
Ver
bess
erun
g
Refactoring-Schritte
JAX 2006 Merciless Refactoring with Eclipse 15
Große Refactorings: Probleme
man läuft schnell in Sackgassenwegen Interferenzen mit restlicher Entwicklung kann man nicht einfach so zurückman verliert schnell den Überblickdie Planung ist sehr schwierigSicherheit wg. Zerbrochenen Unit-Tests reduziertunter Projektdruck neigen Refactorings zum Versanden
auf halbem Wege abgebrochene Refactorings verschlechtern die Systemstruktur statt sie zu verbessern
JAX 2006 Merciless Refactoring with Eclipse 16
Probleme lösen
Best Practices:Immer schön refaktorisieren, wenn einem etwas auffälltRefactoring-Tools ausgiebig nutzen (da schlummern viele Features, die noch gar nicht richtig eingesetzt werden)Tools zum Identifizieren von Schwächen nutzen (möglichst auch ständig bei der Entwicklung)Nicht vor Refactorings zurückschrecken, aber vorher Tests bauenRefactorings im Team diskutieren
Patterns und Practices für große Refactorings
JAX 2006 Merciless Refactoring with Eclipse 17
Best Practices: Einplanung von großen Refactorings
Refactorings explizit in den Planungsprozess einbeziehen
Refactoring-Budget pro IterationRefactoring-Iterationen bei BedarfRegelmäßige Refactoring-Iterationen
JAX 2006 Merciless Refactoring with Eclipse 18
Best Practices: Refactoring-Planungs-Session
Refactoring-Planungs-Session
Größere Refactorings mit dem gesamten Team diskutieren und planenSpannungsfeld: Upfront-Design vs. Refactoring-Planung
JAX 2006 Merciless Refactoring with Eclipse 19
Best Practices: Refactoring-Pläne
Refactoring-Pläne erstellen
Refactoring-Route aufschreibenRefactoring-Plan prominent veröffentlichenRefactoring-Plan als Tracking-Instrument nutzenUnsichere Refactoring-Schritte kennzeichnenUnsichere Refactoring-Schritte nach Möglichkeit an den Anfang stellen
JAX 2006 Merciless Refactoring with Eclipse 20
Best Practices: Umleitungen
UmleitungenUm ein Refactoring in kleine Schritte zu zerlegen, müssen häufig Umleitungen in den Code eingebaut werden.So kann ein Refactoring schrittweise durchgeführt werden und das System ist trotzdem immer lauffähig.Umleitungen müssen aber als solche gekennzeichnet werden.
Z.B. mit deprecated Tag.
JAX 2006 Merciless Refactoring with Eclipse 21
Best Practices: Safe-Points
Safe-PointsRefactoring in kleine Schritte zerlegenNicht nach jedem kleinen Schritt wird die Struktur des Systems besser (Umleitungen)Safe-Point definieren: nach welchen Schritten hat das System einen verbesserten Stand erreicht, aber noch nicht das endgültige Design
Des
ign-
Ver
bess
erun
g
Refactoring-Schritte
JAX 2006 Merciless Refactoring with Eclipse 22
Best Practices: Branches
Branches und Safe-Points
Branches nicht für das komplette Refactoring (Merge-Aufwände würden zu großwerden)Stattdessen Branches jeweils bis zu einem definieren Safe-Point durchführen und dann mergen
JAX 2006 Merciless Refactoring with Eclipse 23
Architektur-Smells finden
Selbst EntwickelnWas ist im Weg?
Entwicklern zuhören:„Das hier nervt, aber wir haben keine Zeit, das umzustellen.“„Das hier passt überhaupt nicht, aber wenn wir das umstellen, laufen wir Gefahr, alles kaputt zu machen.“
Tools zur Architekturanalyse, z.B.Sotograph (http://www.sotograph.de).XRadar (http://xradar.sourceforge.net)Dr. Freud (http://www.freiheit.com)...
Weitere Tools, z.B.JDependPMDCheckstyle...
JAX 2006 Merciless Refactoring with Eclipse 24
Gemeinsamkeiten der Tools
Open Sourcedaher z.B. SonarJ ausgelassen
JavaErwachsen (mind. sehr gute Beta)
JAX 2006 Merciless Refactoring with Eclipse 25
Gemeinsamkeiten der Tools
Open Sourcedaher z.B. SonarJ ausgelassen
JavaErwachsen (mind. sehr gute Beta)
JAX 2006 Merciless Refactoring with Eclipse 26
XRadar
Top Down View eines SW-ProjektesStatische Analyse für IST-ZustandDynamische Analyse für Historie
Arbeitete mit vielen anderen Open Source-Tools zusammenJUnit, Cobertura, JCoverage, JDepend, PMD, CheckStyle, JavaNCSS uvm.)
Ergebnisse werden konzentriert in(HTML-)Tabellen(SVG-)Grafiken
Integrierbar durchAntMaven
JAX 2006 Merciless Refactoring with Eclipse 30
PMD
Statischer Codescanner für JavaPotentielle Bugs
z.b. leere try/catch/finally/switch-statementsToter CodeSuboptimaler Code
z.B. verschwenderischer Umgang mit String/StringBuffer
Unnötig komplizierte AusdrückeDuplizierter Code
Regelbasiertauch eigene Regeln in z.B. XPath oder propr. PMD Rule Designer
Integrierbar in/durchEclipse, IntelliJ‘s IDEA, Maven, Ant, … (viele weitere) …, Emacs :-)
Buch ThemaPMD Applied von Tom Copeland
Beispiel
JAX 2006 Merciless Refactoring with Eclipse 31
FindBugs
Sucht nach Bugs im Code (Bug-Pattern-Konzept)Statische Codeanalyse von BytecodeSteuerung der Anwendung
Swing-GUIKommandozeileAnt-TaskEclipse-Plugin
Ergebnisse in(HTML-)ListenSwing-GUIEclipse
Beispiel
Live-Demo
JAX 2006 Merciless Refactoring with Eclipse 32
CheckStyle
Statische Überprüfung von Code ConventionsIntegrierbar in
Eclipse (2x), IntelliJ‘s IDEA, NetBeans, JBuilder uvm.
Ausführbar durchAntMavenKommandozeile
Ergebnisse angezeigt durchHTML-Tabellenin IDEs durch Marker
Regelbasiertauch eigene Regeln einführbar an eigene Code Conventions anpassbar!
Live-Demo
JAX 2006 Merciless Refactoring with Eclipse 33
Fazit
Code zu refaktorisieren ist wichtiger als Code zu schreiben.Oder: Refactoring is more important than coding.
Wir verbringen viel mehr Zeit damit, bereits vorhandenem Code zu bearbeiten, als neuen Code zu implementieren.
Nutzen Sie Refactoring-Tools intensiv!!!Refactorings sind nur mit Unit-Tests wirklich sicher durchführbar!
Besonders wichtig:Refactorings dürfen nicht aufgeschoben werden!Refactorings müssen im Team kommuniziert werden!
Fragen Sie die Experten! ;-)
JAX 2006 Merciless Refactoring with Eclipse 34
Refactoring-EinführungArchitektur-SmellsCharakteristika großer RefactoringsBausteine großer RefactoringsProzess-AspekteDatenbanken und RefactoringAPIs und Refactoring
Ein wenig Werbung… ;-)
JAX 2006 Merciless Refactoring with Eclipse 35
Weitere Referenzen
Martin Fowler: Refactoring –Improving the Design of Existing Code, Addison-Wesley, 1999Joshua Kerievsky: Refactoring to Patterns, Addison-Wesley, 2004William Wake: Refactoring Workbook, Addison-Wesley, 2003.
On the road:Ramnivas Laddad: Aspect Oriented Refactoring, Addison-Wesley, 2006Scott W. Ambler, Pramodkumar J. Sadalage: Refactoring Databases: Evolutionary Database Design, Addison-Wesley, 2006
JAX 2006 Merciless Refactoring with Eclipse 36
Vielen Dank
Fragen und Feedback jederzeit gerne!
Martin Lippert: [email protected] Schiffer: [email protected]
Interessante Links:http://www.refactoring.com/: Maintained by Martin Fowler, contains a lot of useful other references, articles, tools catalog, …http://www.refactoring.be/: Refactoring Thumbnails as a visualization for refactoringshttp://groups.yahoo.com/group/refactoring: Refactoring mailing list at Yahoo