2008-11-25 17 views
5

Ich sah vor kurzem this youtube tutorial auf dem Null-Objekt Design-Muster. Auch wenn es einige Fehler gab: So wie das NullCar, das nichts macht, eine Endlosschleife erzeugt, wurde das Konzept gut erklärt. Meine Frage ist, was tun Sie, wenn die Objekte, die Null sein können, Getter haben und in Ihrem Code verwendet werden? Woher weißt du, welcher Wert standardmäßig zurückgegeben wird? Oder sollte ich dieses Muster in allen Objekten implementieren? Was ist, wenn ich Saiten oder Primitive zurückgeben muss? Ich spreche aus einer Java-Perspektive.Null Objekt Designmuster Frage

BEARBEITEN: werde ich nicht mit Nullobjekten handeln, die für die Überprüfung auf Standardwerte getestet werden? Wenn nicht, warum nicht?

Antwort

4

Soweit ich es verstanden habe, ist die Idee, dass der Wert des Null-Objekts so nah wie möglich an "nichts" ist. Das bedeutet leider, dass Sie es selbst definieren müssen. Als Beispiel benutze ich persönlich "", wenn ich keinen Null-String übergeben kann, ist die Null-Objektnummer für mich -1 (meistens weil die meisten Datenbanksequenzen standardmäßig bei 1 beginnen und wir diese für die Item-ID verwenden: ja lot so -1 ist tot Werbegeschenk es ist ein Null-Objekt), mit Listen/Karten/Sets ist es Collections.EMPTY_SET, EMPTY_MAP oder EMPTY_LIST und so weiter und so fort. Wenn ich eine benutzerdefinierte Klasse habe, aus der ich ein Null-Objekt erstellen muss, entferne ich alle tatsächlichen Daten daraus und sehe, wohin das geht, und wende dann an, was ich gerade erwähnt habe, bis es "leer" ist.

Sie "wissen" also nicht, welchen Wert Sie standardmäßig zurückgeben, Sie müssen es nur selbst bestimmen.

8

Das Ziel eines Null-Objekts besteht darin, Nullreferenzen im Code zu vermeiden. Die von Null-Objekt-Gettern zurückgegebenen Werte hängen von Ihrer Domäne ab. Null oder leere Zeichenfolge sind normalerweise angemessen.

Wenn wir das Null-Objekt-Muster ins wirkliche Leben transponieren, ist das, was Sie fragen, ähnlich zu fragen "wie alt ist niemand?".

Vielleicht kann Ihr Design verbessert werden, da Sie anscheinend nicht dem tell, don't ask Prinzip folgen.

BEARBEITEN: Die Null Object design pattern wird normalerweise verwendet, wenn ein Objekt Verhalten an ein anderes Objekt delegiert (wie in Strategie oder State Design Patterns); wie Tom Hawtin - Tackline kommentiert, verwenden Sie Special Case Objects für Objekte, die Werte zurückgeben.

+0

Ich denke, es wäre genauer zu kommentieren, dass der Kontext für das Null-Objekt-Muster besser mit "sagen, nicht fragen" -Typen erfüllt ist. Bei Werten, die zurückgeliefert werden, sind Sie eher auf Special-Case-Objekte ausgerichtet. Möglicherweise. –

+2

Wow, ein Zen-Tao als Programmierhinweis ... :-) – PhiLho

2

Was tun Sie, wenn die Objekte, die null sein können, getters haben und in Ihrem Code verwendet werden? Woher weißt du, welcher Wert standardmäßig zurückgegeben wird?

Woher wissen Sie, welche Klassen zu implementieren sind? Dies ist eine Designfrage, die von der Anwendung abhängt.

Im Allgemeinen ist der Zweck des NullObject-Musters, ein Replace Conditional with Polymorphism Refactoring in dem Spezialfall zu unterstützen, in dem die Bedingung ein Vergleich mit dem Nullwert der Programmiersprache ist.

Eine korrekte Implementierung des Beispiels im Video würde erfordern, dass die Methode driveCar an die Klassen Car delegiert wird. Die Klassen SlowCar und FastCar würden die Schleife wahrscheinlich über eine gemeinsame Implementierung in einer Basisklasse ausführen, und NullCar würde sofort zurückkehren.

In einem Java-Kontext wäre das NullCar.speed-Attribut wahrscheinlich ein unboxed Int. Es ist also keine Option, es auf null zu setzen.Ich würde wahrscheinlich das Attribut hinter Accessor verstecken, und NullCar.getSpeed eine Ausnahme auslösen. Jeder Client-Code, der einen Test zum Vermeiden dieser Ausnahme benötigt, würde stattdessen in die Fahrzeugklassen wechseln.

Delegieren alle Operationen, die direkt auf einem Geschwindigkeitswert abhängen verfügbar zu sein, ist eine Anwendung des Tell Don't Ask Prinzips des objektorientierten Designs von philippe erwähnt

0

Was der Integrationspunkt im Code of Null-Entwurfsmuster enthalten sein sollte? Ich denke, dass DAO-Objekte der fist-level-Client für dieses Entwurfsmuster sind, da sie eine Entität in der Datenbank suchen und sie einfach zurückgeben.

Die NULL-Prüfung dieser Objekte verschmutzt den Code in der Service- oder Befehlsebene, auf den sie tatsächlich zugreifen und verwendet werden.

Bitte kommentieren.

0

Es sollte das Nullobjekt für die Klasse zurückgeben, die Sie erhalten. Wenn Sie beispielsweise eine Klasse A mit einem Getter haben, der ein Objekt der Klasse B zurückgibt, sollte der entsprechende Getter NullANullB zurückgeben.