Bad Smell: Magic Numbers

Eine sehr schlecht Angewohnheit eines Softwareentwicklers ist die Verwendung von Magic Numbers. Von Magic Numbers ist genau dann die Rede, wenn für den Betrachter des Codes auf Anhieb nicht erkennbar ist, welchen genauen Sinn die Verwendung des vorliegenden Zahlenwertes hat. Wenn man Glück hat, besteht ein Kommentar welcher den Zahlwert beschreibt, aber selbst dieser wird oft vergebens gesucht.

Hierzu ein konkretes Beispiel:
In diesem einfachen Beispiel wird ein Calendar Objekt mit dem Datum in genau sieben Tagen erstellt (calendar.add(..)). In der ersten Darstellung ist nicht ansatzweise zu erahnen, was genau in der add Methode passiert. Hier wäre das mindeste wohl gewesen, wenn der Entwickler einen aussagekräftigen Kommentar hinterlegt hätte. Bad Smell!

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(6, 7);

Schlimmer noch wäre es, wenn der Zahlenwert 7 zu einem späteren Zeitpunkt im Code nochmals verwendet wird und diese beiden Werte abhängig voneinander sind. In diesem Fall müssten sogar beide Werte nachträglich gepflegt werden, wenn plötzlich das Datum statt in 7, in 14 Tagen erstellt werden soll. Schaut man sich den Code Monate oder gar Jahre später erst wieder an, fällt dieser Zusammenhang höchstwahrscheinlich gar nicht erst auf und es kommt bei einer Veränderung zu unerwünschten Nebeneffekten der Anwendung. Das unnötige Verstreichen einiger Zeit durch debuggen ist hier vorprogrammiert.

Betrachten wir uns die nachfolgende Umsetzung. In diesem Beispiel fällt direkt auf, welcher tiefere Sinn hinter der add Methode steckt. Verdeutlicht wird dies über zwei Konstanten. Die selbst angelegte DAYS_IN_FUTURE sowie die in der Calendar Klasse befindliche Calendar.DAY_OF_YEAR Konstante.

final int DAYS_IN_FUTURE = 7;
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, DAYS_IN_FUTURE);

Durch die Verwendung der Konstante wird der Lesefluss prompt erleichtert. Ohne den Code zu analysieren wird direkt klar, was an dieser Stelle passiert.

Ein Blick hinter die Kulissen: In der Konstante DAY_OF_YEAR steckt der nicht veränderbare Wert 6. Im Ergebnis werden demnach die selben Werte wie in dem ersten Beispiel gesetzt, bloß in Konstanten gekapselt.

public final static int DAY_OF_YEAR = 6;

An diesem recht einfachen Beispiel ist bereits zu erkennen, wie wichtig die Vermeidung von Magic Numbers innerhalb der Softwareentwicklung ist.