Null Object

Aus php bar
Wechseln zu: Navigation, Suche

Das Null Objekt ist ein Entwurfsmuster aus der Softwareentwicklung. Ein Null Objekt ist eine Implementierung einer Schnittstelle ohne Funktionalität. Somit kann reagiert werden, wenn ein Objekt zum entsprechenden Zeitpunkt noch nicht instanziert wurde und somit ein Null-Object als Stellvertreter ohne Funktion geladen wird. Zudem werden Ausnahmebehandlungen für fehlende Objekte reduziert.

Ausgangssituation

Wir haben eine Klasse SimpleMailer welche die Schnittstelle Mailer implementiert.

1 


Basierend auf der PHP mail Funktion erstellen wir eine Klasse die unsere Mailer Schnittstelle implementiert. Entsprechend unserer Schnittstellen werden nur vier Setter und eine Methode zum versenden implementiert.

1 span class="st0">"From: {$this->_from}"
2 			);
3 	}
4 }


Mit der nächsten Klasse wird das Mailer Objekt vorkonfiguriert und bietet eine Methode zum Versenden einer Nachricht an eine bestimmte E-Mail Adresse.

1 span class="st0">"[nachricht] Hallo!""Das ist eine Nachricht.""admin@example.com"


Die Anwendung ist denkbar einfach:

1 span class="st0">'client@example.com');


Problem

Jetzt besteht aber das Problem, daß wir nicht immer ein funktionales SimpleMailer Objekt verfügbar machen können. Wenn wir keines an unseren Notifier übergeben, würde in der Methode notify ein Fehler auftreten, da auf ein nicht definiertes Objekt zugegriffen wird. Eine mögliche Lösung für dieses Problem könnte so aussehen:

1 span class="co1">//...
2 "[nachricht] Hallo!""Das ist eine Nachricht.""admin@example.com"//...
3 


Implementierung

Bei komplexeren Anwendungen werden viele If Abfragen aber schnell unübersichtlich. Außerdem könnte es ja sein, daß wir die Notifier Klasse gar nicht verändern wollen oder gar können. Änderungen im vorhandenen Code bringen oft viele Probleme mit sich. Deswegen versuchen wir, so wenige Änderungen wie möglich vorzunehmen. An dieser Stelle definieren wir uns für die Mailer Schnittstelle ein Null Objekt. Dieses beinhaltet leere Setter und eine send Methode, die lediglich false zurück gibt. Das Null Objekt konsumiert alle Zugriffe und führt keine weiteren Aktionen aus.

1 


Jetzt übergeben wir dem Notifier eine Instanz des NullMailer.

1 span class="st0">'client@example.com');


Um nun den Notifier ohne eine funktionale Mailer Instanz lauffähig zu machen, haben wird nur ein simples Null Objekt erstellt und dieses übergeben. So vermeiden wir über eine elegante Herangehensweise Ausnahmebehandlungen und können auch leicht Funktionalität aus einer Anwendung herausnehmen.

Mit dem Muster haben wir jedoch ein kleines Problem eingeführt. Manchmal ist es einfach notwendig festzutellen, ob wir ein Null Objekt oder ein funktionales Objekt vorliegen haben. In unserem Fall möchten wir wissen, ob wir überhaupt Mails versenden können. Für diesen Fall wird eine weitere Schnittstelle benötigt, die diese Information preisgibt.

1 


Nun erweitern wir die Mailer Schnittstelle mit der neuen Schnittstelle:

1 span class="co1">//...
2 }


Und ändern dementsprechend die Mailer Klassen:

1 span class="co1">//...
2 //...
3 //...
4 //...
5 }


Nun erweitern wir den Notifier um eine Methode, die unsere Information liefert.

1 span class="co1">//...
2 //...
3 }


Falls der Notifier nicht verändert werden kann, kann man diese Methode auch über einen Adapter einfügen. Jetzt haben wir die Möglichkeit abzufragen ob wir Mails versenden können oder nicht, im Code könnte das so aussehen:

1 span class="st0">'user@example.com'"Benachrichtigungssystem ist deaktiviert!";