Don’t Repeat Yourself (DRY) – Wissenshäppchen #1
IT-Berufe-Podcast - Ein Podcast von Stefan Macke - Montags
Kategorien:
In der ersten Episode meiner „Wissenshäppchen“ widme ich mich einem der wichtigsten Prinzipien der Softwareentwicklung: Don’t Repeat Yourself (DRY). Doppelter Code ist der Feind jedes Entwicklers! 🙂 Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. (DontRepeatYourself) Am Beispiel einer weit verbreiteten Programmierübung zeige ich den Weg von doppeltem zu „trockenem“ (DRY) Code. Inhalt * Doppelter Code ist ein Code Smell. * Er tritt meistens auf, wenn Entwickler Zeit sparen wollen und mit Copy/Paste arbeiten. * Doppelter Code führt zu Inkonsistenzen und damit zu Fehlern im Programm. * Er äußert sich durch Shotgun Surgery, das Anpassen mehrerer Stellen im Code für die Änderung eines einzigen Features. * Es existieren viele Refactorings, die doppelten Code vermeiden sollen. Die Aufgabe: FizzBuzz Das hier ist die Beschreibung des zu lösenden Problems: Print a list of the numbers from 1 to 100 to the console. For numbers that are multiples of 3 print „Fizz“ instead. For numbers that are multiples of 5 print „Buzz“ instead. For numbers that are both multiples of 3 and 5 print „FizzBuzz“ instead. These are the first 15 values the program should print: 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz Lösung der Azubis Die Implementierung der Azubis sieht dann meistens so aus: public static void main(String[] args) { for (int i = 1; i <= 100; i++) { if (i % 3 == 0 && i % 5 == 0) { System.out.println("FizzBuzz"); } else if (i % 3 == 0) { System.out.println("Fizz"); } else if (i % 5 == 0) { System.out.println("Buzz"); } else { System.out.println(i); } } } Diese Implementierung ist recht komplex (drei verschachtelte if-Statements) und enthält auch sehr viel doppelten Code: * Die auszugebenden Strings. Würden wir das Spiel auf Deutsch übersetzen, müssten wir die Strings an mehreren Stellen verändern. * Die Prüfung auf Fizz und Buzz (Modulo-Rechnung). Würden sich die Regeln ändern (z.B. 7 und 11 statt 3 und 5 oder zusätzlich Fizz bei „enthält die Ziffer 3“), müssten sie an mehreren Stellen angepasst werden. * Die Ausgabe auf der Konsole. Soll das Spiel in einer Webanwendung oder einer Windows-Applikation eingesetzt werden, müsste die Ausgabe an mehreren Stellen korrigiert werden. Refactorings Um die Komplexität und den doppelten Code zu entfernen, können verschiedene, relativ einfache Refactorings angewendet werden: * Werte in Variablen oder Konstanten auslagern, die nur einmalig definiert werden. * Variable für das Ergebnis einführen und diese nur einmalig ausgeben, anstatt jedes Ergebnis separat. * Ergebnisse der einzelnen Prüfungen verketten, anstatt doppelt zu prüfen. Schritt 1: Doppelte Werte in Variablen auslagern Fizz und Buzz sollen als Wert nur noch einmalig vorkommen. So sieht eine mögliche Lösung aus: public static void main(String[] args) { String fizz = "Fizz"; // <--- HIER String buzz = "Buzz"; // <--- HIER for (int i = 1; i <= 100; i++) { if (i % 3 == 0 && i % 5 == 0) {