Die Grundidee hinter diesem Thread ist, defensiv zu programmieren. Das heißt, Code gegen das Unerwartete. Es gibt eine Reihe verschiedener Antworten:
Adamski schlägt vor, das Null-Objektmuster zu betrachten, wobei diese Antwort für diesen Vorschlag abgestimmt wird.
Michael Valenty schlägt auch eine Namenskonvention vor, um dem Entwickler mitzuteilen, was zu erwarten ist.
ZeroConcept schlägt eine ordnungsgemäße Verwendung von Exception vor, wenn dies der Grund für NULL ist. Und andere.
Wenn wir die "Regel" festlegen, dass wir immer defensiv programmieren wollen, können wir sehen, dass diese Vorschläge gültig sind.
Wir haben aber zwei Entwicklungsszenarien.
Von einem Entwickler "verfasste" Klassen: Der Autor
Klassen, die von einem anderen (vielleicht) Entwickler "konsumiert" werden: dem Entwickler
Unabhängig davon, ob eine Klasse für Methoden mit einem Rückgabewert NULL zurückgibt oder nicht, muss der Entwickler testen, ob das Objekt gültig ist.
Wenn der Entwickler dies nicht kann, ist diese Klasse / Methode nicht deterministisch. Das heißt, wenn der "Methodenaufruf" zum Abrufen des Objekts nicht das tut, was er "ankündigt" (z. B. getEmployee), hat er den Vertrag gebrochen.
Als Autor einer Klasse möchte ich beim Erstellen einer Methode immer so freundlich und defensiv (und deterministisch) sein.
Da entweder NULL oder das NULL-OBJEKT (z. B. wenn (Mitarbeiter als NullEmployee.ISVALID)) überprüft werden muss und dies möglicherweise bei einer Sammlung von Mitarbeitern erforderlich ist, ist der Nullobjektansatz der bessere Ansatz.
Aber ich mag auch Michael Valentys Vorschlag, die Methode zu benennen, die null zurückgeben muss, z. B. getEmployeeOrNull.
Ein Autor, der eine Ausnahme auslöst, entfernt die Auswahl für den Entwickler, um die Gültigkeit des Objekts zu testen, was für eine Sammlung von Objekten sehr schlecht ist, und zwingt den Entwickler zur Ausnahmebehandlung, wenn er seinen konsumierenden Code verzweigt.
Als Entwickler, der die Klasse konsumiert, hoffe ich, dass der Autor mir die Möglichkeit gibt, die Nullsituation zu vermeiden oder zu programmieren, mit der ihre Klasse / Methoden konfrontiert sein könnten.
Als Entwickler würde ich also defensiv gegen NULL von einer Methode aus programmieren. Wenn der Autor mir einen Vertrag gegeben hat, der immer ein Objekt zurückgibt (NULL OBJECT immer) und dieses Objekt eine Methode / Eigenschaft hat, mit der die Gültigkeit des Objekts getestet werden kann, würde ich diese Methode / Eigenschaft verwenden, um das Objekt weiter zu verwenden , sonst ist das Objekt ungültig und ich kann es nicht verwenden.
Fazit ist, dass der Autor der Klasse / Methoden Mechanismen bereitstellen muss, die ein Entwickler in seiner defensiven Programmierung verwenden kann. Das heißt, eine klarere Absicht der Methode.
Der Entwickler sollte immer eine defensive Programmierung verwenden, um die Gültigkeit der von einer anderen Klasse / Methode zurückgegebenen Objekte zu testen.
Grüße
GregJF