Ein Puzzleteilchen im letzten Projekt ist der DocFilter
. Seine Aufgabe ist, ein Notes-Dokument zu prüfen. Wenn das Dokument bestimmte Bedingungen erfüllt, dann akzeptiert das DocFilter-Objekt das Dokument. DocFilter
implementiert das Interface Filter
. NullFilter
ist eine andere Klasse, die Filter
implementiert. Ein NullFilter-Objekt akzeptiert alle Dokumente.
<Exkurs NullImplementierung>
Ich “programmiere gegen Interfaces”. Dabei erstelle ich oft eine Null-Implementierung – eine, die “nichts” tut, aber die ich verwenden kann, statt null
in Java zurückzugeben. NullPointerExceptions werden so vermieden.
</Exkurs NullImplementierung>
Ein NullFilter-Objekt ist im Testbetrieb sehr hilfreich, denn es ist kompliziert, ein Notes-Dokument zu erzeugen, das alle Bedingungen erfüllt. Anstelle dessen kann ich nun irgendeins benutzen.
Gretchenfrage: Wie geschieht der Wechsel zwischen DocFilter- und NullFilter-Objekt?
Möglichkeit 1: Ich ändere den Code. An der fraglichen Stelle wird ein DocFilter-Objekt erzeugt. Im Code für die Teststellung aktiviere ich eine Zeile, die das Filter-Objekt durch ein NullFilter-Objekt ersetzt.
Das hat zwei Nachteile: Erstens muss ich geänderten Code einsetzen – in Notes ist das einigermassen kompliziert. Zweitens bin ich nie sicher, ob gerade der “offizielle” Code aktiv ist oder der Code für die Teststellung.
Möglichkeit 2: Es gibt eine Konfiguration und darin einen Schalter namens debug
. Der Code an der fraglichen Stelle entscheidet anhand von debug
, welches Objekt erzeugt wird.
Das ist besser, weil ich nun in der Konfiguration nachschauen kann, statt im Code ‘rumzuwühlen. Aber das macht den Code an dieser Stelle – und an allen anderen, die ein ähnliches Problem haben – sehr häßlich.
Meine Antwort ist die: Die fragliche Stelle im Code entscheidet nicht, welches Objekt erzeugt wird. Statt dessen wird das Objekt in einem FilterProvider
erzeugt. Ein FilterProvider liest die Konfiguration zur Laufzeit ein und gibt das jeweils passende Objekt zurück. Andere Stellen im Code werden andere Provider-Klassen brauchen.
Ich arbeite lieber mit einem Faulen als mit einem Dummen zusammen. Einfach ist besser.