Post on 04-Aug-2019
1
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
info@oio.deVersion:
Refactoring mit der Mikado-Methode
1.0 1
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH
Abstract
2
Viele von uns haben tagtäglich mit Legacy-Code zu tun. Mal eben schnelletwas umzubauen, scheitert typischerweise an den fehlenden Tests,zudem ist der Quellcode oft überhaupt schlecht testbar.
In diesem Vortrag wird anhand von praktischen Codebeispielen gezeigt,wie man zunächst ein automatisiertes Sicherheitsnetz aufspannt.Anschließend werden komplexere Refactorings durchgeführt, ohnejedoch zu viele Baustellen gleichzeitig aufzureißen. Die Mikado-Methodehilft dabei, den Überblick zu behalten und in möglichst kleinen undnachvollziehbaren Schritten vorzugehen. Das Ziel ist das Aufbrechenstark gekoppelter Abhängigkeiten, um so neue Tests hinzufügen zukönnen. Zudem wird der Code besser lesbar sein und lässt sich so auchleichter warten und wiederverwenden.
2
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH
Ihr Sprecher
Trainer, Berater, Entwickler
3
Falk Sippach (@sippsack)
Architektur
Agile Softwareentwicklung
CodequalitätCo-Organisator
Commiter DukeCon
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 4
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
https://twitter.com/GeertjanW/status/796021888745144320
3
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 5
Legacy Code
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 6
Code ändern? Nur wie?
Brownfield-Projekt. Code von anderen.Fehlende Dokumentation, kaum Tests.Änderungen geraten außer Kontrolle.
4
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 7
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 8
Code
without tests
is bad code.Michael Feathers
“
5
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 9
Legacy code is valuable
code that we feel afraid to
change.
J. B. Rainsberger
Foto von PublicDomainPictures, CC0 Public Domain Lizenz, https://pixabay.com/de/menschen-abdeckung-schrei-314481/
“
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 10
Gründe für Refactoring
VerstehenFehler behebenNeues Feature
Optimierung
6
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 11
Toolunterstützung bei einfachen Refactorings
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 12
7
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 13
The Mikado Method is a structured way to make
significant changes to complex code.
… for performing changes to a system that's too large for analyze-then-edit, which means basically
any production system in the world.
(Ola Ellnestam, Daniel Brolund: "The Mikado Method")
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 14
8
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 15
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 16
9
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 17
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 18
10
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 19
Was ist die Mikado-Methode?
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 20
Mikado Methode für Dummies
Möbel rücken
11
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 21
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 22
12
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 23
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 24
13
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 25
The Mikado Method can help you visualize, plan, and
perform business value–focused improvementsover several iterations and increments of work, without ever having a broken codebase during the process.
(Ola Ellnestam, Daniel Brolund: "The Mikado Method")
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 26
Ola Ellnestam, Daniel Brolund: "The Mikado Method"
Ablauf im Großen:
14
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 27
Konkrete Aufgabe, z. B. User Story.
Auf Papier schreiben.
Mondscheinzeit-berechnungslogikverbessern
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 28
Direkt eine einfache Lösung ausprobieren.
Experimentieren statt analyisieren.
Hilfe durch Compiler und Tests.
15
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 29
Auftretende Fehler haben die Ursache in weiteren Abhängigkeiten.
Zu Schritt 8, wenn keine Fehler.
Vorsicht bei Laufzeitfehlern (Nullpointer).
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 30
Direkt sofortige Lösungen zu den Fehlern finden.
Überanalyisieren vermeiden.
Weiter zugrundeliegende Einschränkungen
werden in späteren Iterationen behandelt.
16
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 31
Lösung aufzeichnen und mit Vorgänger verbinden.
Wissen über das System aufbauen.
Mondscheinzeit-berechnungslogikverbessern
Unit-Test für Mondscheinzeit-berechnung schreiben
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 32
Bei Fehlern immer zurückrollen.
Weitere Bearbeitung auf kaputten Zustand sehr fehleranfällig.
Zurückgerollte Informationen stecken im Graph.
17
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 33
Nächste Vorbedingung auswählen und zu Schritt 2.
Immer mit sauberen System starten.
Nächste Vorbedingung naiv implementieren …
Mondscheinzeit-berechnungslogikverbessern
Unit-Test für Mondscheinzeit-berechnung schreiben
Mondscheinzeit-berechnung in eine eigene Methode
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 34
Vorbedingung abhaken, wenn keine Fehler mehr.
Committen, wenn es Sinn ergibt.
18
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 35
Mikado-Goal und alle Vorbedingungen erfüllt?
Fertig!
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 36
Ziel festlegen
Aus-probieren
Visua-lisieren
Rückgängigmachen
Mikado Driven Refactoring
1 2
3
4
19
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 37
Ziel festlegen
=
Startpunkt der Änderung.
Erfolgskriterium für Ende.
1
Mondscheinzeit-berechnungslogikverbessern
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 38
Ausprobieren
=
Experimentieren.
Hypothesen prüfen.
Sehen, was kaputt geht.
2
20
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 39
Visualisieren
=
Ziel und notwendige Vorbedingungen aufschreiben.
Mikado Graph erstellen.
3
Mondscheinzeit-berechnungslogikverbessern
Unit-Test für Mondscheinzeit-berechnung schreiben
Mondscheinzeit-berechnung in eine eigene Methode
Temporäre Variable verschieben
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 40
Rückgängig machen
=
Vorherigen funktionierenden
Stand wiederherstellen.
4
21
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 41
Ziel festlegen
Vorbedingungen
Ablauf im Kleinen:
1
2
3
4
Rückspulen (Redo)
Fertig
Start
x-mal
<<
Mondscheinzeit-berechnungslogikverbessern
Unit-Test für Mondscheinzeit-berechnung schreiben
Mondscheinzeit-berechnung in eine eigene Methode
Temporäre Variable verschieben
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 42
package de.oio.refactoring.badtelefon;
public class Kunde {
double gebuehr = 0.0;
Tarif tarif;
public Kunde(int tarifArt) {
this.tarif = new Tarif(tarifArt);
}
public void account(int minuten, int stunde, int minute)
{
boolean mondschein = false;
double preis = 0;
// Mondscheinzeit ?
if (stunde < 9 || stunde > 18)
mondschein = true;
// Gespraechspreis ermitteln
switch (tarif.tarif) {
case Tarif.PRIVAT:
[…]
}
gebuehr += preis;
}
public double getGebuehr() {
return gebuehr;
}
}
package de.oio.refactoring.badtelefon;
public class Tarif {
public final static int PRIVAT = 0;
public final static int BUSINESS = 1;
public final static int PROFI = 2;
int tarif = 0;
public Tarif(int tarif) {
this.tarif = tarif;
}
}
package de.oio.refactoring.badtelefon;
import java.util.Arrays;import java.util.Random;
public class TarifeRunner {public static void main(String args[]) {
Random random = new Random();for(Integer tarif : Arrays.asList(Tarif.PRIVAT, Tarif.BUSINESS, Tarif.PROFI)) {
System.out.println(String.format("\nVerarbeitung von Tarif %s", tarif));Kunde k = new Kunde(tarif);[..]
}}
22
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 43
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 44
Mondscheinzeit-berechnungslogikverbessern
Unit-Test für Mondscheinzeit-berechnung schreiben
Mondscheinzeit-berechnung in eine eigene Methode
Temporäre Variable verschieben
Mikado-Ziel festlegen
Experimentieren
VisualisierenZurückrollen
Experimentieren
Visualisieren
Experimentieren
Visualisieren
Zurückrollen
Zurückrollen
Experimentieren
Zurückspulen
23
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH
Mondscheinzeit-berechnungslogikverbessern
Unit-Test für Mondscheinzeit-berechnung schreiben
Mondscheinzeit-berechnung in eine eigene Methode
Temporäre Variable verschieben
45
Vorbedingungen
Rückspulen (Redo)
<<
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 46
Reale Legacy Projekte
24
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 47
Einfach loslegen?
Es fehlen automatisierte Tests!
Machen wir auch nichts kaputt?
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 48
25
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 49
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 50
public static void main(String... args) throws Exception {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.retest.de");
while (true) {
List<WebElement> links = driver.findElements(By.tagName("a"));
links.get(random.nextInt(links.size())).click();
Thread.sleep(500);
List<WebElement> fields =
driver.findElements(By.xpath("//input[@type='text']"));
WebElement field = fields.get(random.nextInt(fields.size()));
field.sendKeys(randomString());
Thread.sleep(500);
}
}https://entwicklertag.de/frankfurt/2016/sites/entwicklertag.de.frankfurt.2016/files/slides/Bei%20uns%20testen%20lauter%20Affen_0.pdf
1
23
4
26
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 51
Foto von StockSnap: https://pixabay.com/de/codierung-gesch%C3%A4ft-arbeiten-macbook-699318/ (CC0 Public Domain Lizenz)
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 52
27
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 53
Fazit
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 54
Vorteile
Stabiles System trotz Änderungen.
Bessere Kommunikation und Zusammenarbeit.
Leichtgewichtig und fokussiert.
28
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 55
Wann nutzen?
Architektur im Betrieb verbessern.
Brownfield Entwicklung.
Refactoring Projekt.
1
2
3
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH
1
56
Architektur im Betrieb verbessern
In kleinen Schritten verbessern.
Im gleichen Branch neue Features kontinuierlich ausliefern.
29
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH
2
57
Brownfield Entwicklung
Häufige Situation.
Existierende Anwendungen verbessern.
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH
3
58
Refactoring Projekt
Langdauernde Verbesserung.
Eigener Branch.
30
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 59
Angst vorm Revert:
Reverting scheint wie Wegwerfen.
Aber Mikado-Graph enthält Infos.
Wissensaufbau/-transfer überSystem, Domäne, Technologie.
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 60
Stash (Git)
Patch-File (SVN, …)
Angst vorm Revert: Änderungen doch aufheben
31
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 61
Arbeitsmittel:
Whiteboard/Flipchart/Papier
Mindmap
Visio, yEd
1
2
3
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 62
1
32
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 63
2
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 64
3
33
Refactoring mit der Mikado-Methode© Orientation in Objects GmbH 65
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
info@oio.de
Vielen Dank für Ihre
Aufmerksamkeit!
34
Code Quality in Practice© Orientation in Objects GmbH