Das grundsätzliche Vorgehen ist also folgendes:
- erstmal ein Objekt erzeugen und
- checken, ob es valide ist
Funktionalen Programmierys stellen sich bei diesem Vorgehen die Nackenhaare auf. Warum denn ein invalides Objekt überhaupt erzeugen? Wir fühlen uns da an die Szene in Alien erinnert, wo das Alien ins Raumschiff gelassen wird und erst dann untersucht wird. (Es geht nicht gut aus.)
Die „Validator-Methode“ macht auch ein paar ganz konkrete Probleme:
- Die Validator-Annotationen konstituieren effektiv eine kleine eigene Programmiersprache, die man erst lernen muss.
- Die Annotationen koppeln den Code an das Validator-Framework.
- Valide und invalide Objekte haben denselben Typ, das Typsystem kann also nicht helfen, sie auseinanderzuhalten.
Validierung in der funktionalen Programmierung
Entsprechend verfolgen wir in der funktionalen Programmierung einen anderen Ansatz für Validierung. Der prominente funktionale Programmierer Yaron Minsky (Technikchef bei Jane Street) hat folgenden Ausspruch geprägt:
„Make illegal states unrepresentable.“
Minsky spricht nicht direkt von Validierung sondern von der Verwendung des Typsystems: In stark getypten Sprachen sollten wir unsere Typen so gestalten, dass möglichst nur konsistente, „legale“ Daten überhaupt erzeugt werden können.
Das nur mit dem Typsystem durchzusetzen ist nicht immer möglich, zum Beispiel bei Zahlen, die aus einem bestimmten Zahlenbereich kommen müssen. Oft benötigen wir zum Beispiel einen Typ für natürliche (also nicht-negative ganze) Zahlen, es gibt aber in vielen Sprachen als Typ für ganze Zahlen nur int
. Um sicherzustellen, dass es sich dabei um eine nicht-negative Zahl handelt, müssen wir deshalb etwas zur Laufzeit tun.
Aber auch zur Laufzeit können wir Minskys Credo folgen und verhindern, dass „invalide“ Objekte überhaupt erst erzeugt werden. Um das für den Position
-Typ von oben umzusetzen, schreiben wir statt der „offiziellen“ Konstruktor-Funktion Position:invoke
eine spezielle, validierende Konstruktor-Funktion (beziehungsweise „Factory-Methode“ im OO-Sprech) etwa so: