Code: Alles auswählen
public static boolean isLeap(int year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
Code: Alles auswählen
public static boolean isLeap(int year) {
return isDividableBy(4, year) && (!isDividableBy(100, year) || isDividableBy(400, year));
}
private static boolean isDividableBy(int what, int x) {
return x % what == 0;
}
Code: Alles auswählen
public static boolean isLeap(int year) {
boolean regularLeapYear = isDividableBy(4, year);
boolean hundredthYear = isDividableBy(100, year);
boolean fourHundredthYear = isDividableBy(400, year);
return regularLeapYear && (!hundredthYear || fourHundredthYear);
}
private static boolean isDividableBy(int what, int x) {
return x % what == 0;
}
Weiter finde ich auch schon den ersten Schritt unnötig. Wenn ich Code lese und eine Modulo-Operation sehe, deren Ergebnis anschliessend mit 0 verglichen wird, weiss ich, dass auf eine restlose Division geprüft wird. Das Einführen der isDividableBy-Methode führt nur zu einem weiteren Problem: wie benenne ich die beiden Parameter, welcher Parameter wird wofür verwendet?
Grundsätzlich verstehe ich das Ideal, Code hinschreiben zu wollen, der sich wie Prosa liest. Doch warum soll ich Prosa schreiben, wenn eine kurze Formel den Sachverhalt präziser ausdrückt? Dazu kommen weitere Probleme: Sollte die Funktion isDividable eine Eingabe-Prüfung haben? Vielleicht wird die eines Tages jemand ausserhalb meines Kontextes wieder verwenden. Wie benenne ich all die zusätzlichen Variablen?
Vielleicht habe einfach schon zu viel mit C herumgespielt, um für Java-Kreise genehmen Code zu schreiben, mir scheint aber, dass die Verbesserung des Dozenten eher gut gemeint als gut gemacht war. (Bei begeisterten Java-Programmierern habe ich manchmal den Eindruck, dass die lieber "add(2, 3)" als "2 + 3" hinschreiben würden.)
Ihr denkt euch vielleicht, dass diese ganze Analyse doch etwas heavy sei für so eine primitive Aufgabenstellung. Ich finde aber, dass solche Detailfragen oft grundsätzliche Meinungsverschiedenheiten offenbaren: z.B. die Definition von "sauberem" Code: Erhalte ich diesen durch zusätzliche Indirektion? Ist die ursprüngliche oder die "verbesserte" Lösung eleganter? (Von Performance soll hier mal nicht die Rede sein...)
Danke für eure Meinungen! (Ihr könnt ja noch dazu schreiben, ob ihr eher aus der Assembler- oder aus der Visual-Basic-Ecke kommt )