Refactoring
Hast du schon einmal das Wort »Spaghetti-Code« gehört?
Das ist gut! Heute wird es darum gehen, wie wir besseren Code schreiben. Also: Code, der besser ist, als Spaghetti-Code…
Das ist nicht schlimm… Vielleicht hast du schon einmal Spaghetti-Code gesehen, oder vielleicht sogar selbst geschrieben?
Unter Spaghetti-Code versteht man ja Code, der sich über viele Zeilen erstreckt, und wenig gegliedert ist.
Schlechter nicht unbedingt… doch du kannst, wenn du übersichtlichen Code schreibst, viele Probleme vermeiden.
Zum Beispiel kann es sein, dass du dein Programm in der Zukunft verändern möchtest. Allein dadurch, dass du selbst in zwei Wochen keine Ahnung mehr haben wirst, was du geschrieben hast, wirst du dich in unübersichtlichen Code schlechter wieder hineindenken können.
Außerdem lassen sich übersichtliche Programme oft auch besser erweitern. Sollen weitere Inhalte oder neue Features hinzugefügt werden, ist eine klare Struktur Gold wert!
Eine von vielen Möglichkeiten ist das sogenannte DRY-Prinzip.
DRY steht für Don’t Repeat Yourself – wiederhole dich nicht selbst. Wenn du dir die tippfaulste Person vorstellst, die du dir vorstellen kannst, dann möchte diese Person bestimmte Dinge nicht immer und immer wieder tippen, und überlegt sich, wie sich diese Wiederholungen vermeiden lassen.
Mir fallen als erstes zwei Dinge ein:
Wenn ich merke, dass ich die gleiche Logik immer und immer wieder schreibe, versuche ich, eine Methode zu schreiben, die diese Logik umsetzt.
(Mit Logik ist gemeint: immer der gleiche if
-else
-Block, immer die gleiche Berechnung, immer die gleiche for
-Wiederholung…)
Wenn ich merke, dass ich das gleiche Variablenset wieder und wieder hernehme, dann könnte ich diese Variablen vielleicht in eine Klasse schreiben, und die Objekte in einer Liste verwalten.
Wenn ich bestimmte Berechnungen (coole Programmierer_innen sagen auch: Business-Logik) mit diesem Variablenset anstelle, kann ich in diese Klasse gleich auch noch die passende Methode mit aufnehmen.
Eine gute Frage! Übersetzen ließe sich das mit »etwas wieder herstellen«. Für Code bedeutet das: wir verändern den Programmcode, um ihn übersichtlicher und schöner (Profis sagen: wartbarer) zu machen, ohne die Funktionalität des Programmes zu ändern.
Auf den ersten Blick vielleicht schon, aber auf den zweiten nicht: du wirst dich selbst belohnen mit einem System, das du und andere besser verstehen, und das du selbst leichter verwenden und erweitern kannst. Refactoring kann etwas sehr schönes sein!
Das stimmt! Zum Glück habe ich da etwas!
Das folgende Programm läuft, so wie es ist, wenn du es in die Online-IDE in eine Datei kopierst.
Deine Aufgabe wird sein, ein Refactoring zu machen. Probiere das Programm aus (es ist ein Java-Quiz), versuche nachzuvollziehen, was alles geschieht, und versuche dann, den furchtbaren Spaghetti-Code zu bändigen. Überlege, welche Objekte hier sinnvoll wären und wie diese in Klassen beschrieben werden könnten, und schreibe Methoden, wo immer sich Logik wiederholt.
Dies ist eine Lernaufgabe, d.h.: Nein, du bekommst keine Hilfe. Tausche dich aber, solltest du gar nicht weiter kommen, mit anderen aus.
Ich glaube, dann kann es losgehen. Hurra! Auf zum Refactoring!
// Variablen, die gebraucht werden
String frage;
String antwort;
String eingabe;
int punkteFrage = 2;
int punktePlayer = 0;
int gesamtPunkte = 0;
// Hier beginnt das Quiz
println("Herzlich Willkommen zum Informatik-Quiz!");
// Erste Frage
frage = "Auf welchem Platz des Tiobe-Index landete die Programmiersprache Java im Mai 2023?";
antwort = "3";
gesamtPunkte += punkteFrage;
eingabe = Input.readString(frage);
if (antwort.equals(eingabe)) {
println("Das ist richtig, gut gemacht!");
punktePlayer += punkteFrage;
} else {
println("Das ist leider falsch.");
}
// Zweite Frage
frage = "Seit wann gibt es die Programmiersprache Java?";
antwort = "1995";
gesamtPunkte += punkteFrage;
eingabe = Input.readString(frage);
if (antwort.equals(eingabe)) {
println("Das ist richtig, gut gemacht!");
punktePlayer += punkteFrage;
} else {
println("Das ist leider falsch.");
}
// Dritte Frage
frage = "Schreibe folgenden Variablennamen in Camel-Case-Schreibweise: ist_nicht_hier";
antwort = "istNichtHier";
gesamtPunkte += punkteFrage;
eingabe = Input.readString(frage);
if (antwort.equals(eingabe)) {
println("Das ist richtig, gut gemacht!");
punktePlayer += punkteFrage;
} else {
println("Das ist leider falsch.");
}
// Vierte Frage
frage = "Wie viele primitive Datentypen gibt es in Java?";
antwort = "8";
gesamtPunkte += punkteFrage;
eingabe = Input.readString(frage);
if (antwort.equals(eingabe)) {
println("Das ist richtig, gut gemacht!");
punktePlayer += punkteFrage;
} else {
println("Das ist leider falsch.");
}
// Fünfte Frage
frage = "Was denkst du, wenn du das Wort »Java« hörst? \na) Strand \nb) Programmieren";
antwort = "b";
gesamtPunkte += punkteFrage;
eingabe = Input.readString(frage);
if (antwort.equals(eingabe)) {
println("Das ist richtig, gut gemacht!");
punktePlayer += punkteFrage;
} else {
println("Das ist leider falsch.");
}
// Auswertung
println("Von " + gesamtPunkte + " Punkten hast du " + punktePlayer + " erreicht.");
println("Du erhältst den Titel…");
if (punktePlayer == gesamtPunkte) {
println("…SuperDuperSpitzenJavaKennerIn! Herzlichen Glückwunsch!");
} else if (punktePlayer > (gesamtPunkte / 3) *2) {
println("…ZiemlichPhänomenalJavaKennerIn! Gut gemacht!");
} else if (punktePlayer > (gesamtPunkte / 3)) {
println("…MäßigÜberragendJavaKennerIn!");
} else {
println("…[Titel ist noch in Arbeit] – vielleicht machst du das Quiz in der Zwischenzeit nochmal?");
}