Viele Dinge sind besser als null zurückzukehren.
- Eine leere Zeichenfolge ("")
- Eine leere Sammlung
- Eine "optionale" oder "vielleicht" Monade
- Eine Funktion, die leise nichts tut
- Ein Objekt voller Methoden, die leise nichts tun
- Ein aussagekräftiger Wert, der die falsche Prämisse der Frage zurückweist
(weshalb Sie an erster Stelle für null gehalten haben)
Der Trick besteht darin, zu erkennen, wann dies getan werden muss. Null ist wirklich gut darin, einem ins Gesicht zu jagen, aber nur, wenn man es abtippt, ohne es zu überprüfen. Es ist nicht gut zu erklären, warum.
Wenn Sie nicht explodieren müssen und nicht auf null prüfen möchten, verwenden Sie eine dieser Alternativen. Es mag seltsam erscheinen, eine Sammlung zurückzugeben, wenn sie nur 0 oder 1 Elemente enthält, aber es ist wirklich gut, wenn Sie sich im Stillen mit fehlenden Werten befassen.
Monaden klingen phantastisch, aber hier können Sie nur deutlich machen, dass die gültigen Größen für die Sammlung 0 und 1 sind. Wenn Sie sie haben, ziehen Sie sie in Betracht.
Alle diese Methoden machen Ihre Absicht besser klar als null. Das ist der wichtigste Unterschied.
Es kann hilfreich sein, zu verstehen, warum Sie überhaupt zurückkehren, anstatt einfach eine Ausnahme auszulösen. Ausnahmen sind im Wesentlichen ein Weg, eine Annahme abzulehnen (sie sind nicht der einzige Weg). Wenn Sie nach dem Schnittpunkt zweier Linien fragen, gehen Sie davon aus, dass sie sich schneiden. Sie könnten parallel sein. Sollten Sie eine Ausnahme "parallele Linien" auslösen? Nun, Sie könnten, aber jetzt müssen Sie diese Ausnahme woanders behandeln oder das System anhalten lassen.
Wenn Sie lieber bleiben möchten, wo Sie sind, können Sie die Ablehnung dieser Annahme in eine Art Wert verwandeln, der entweder Ergebnisse oder Ablehnungen zum Ausdruck bringen kann. Es ist nicht so komisch. Wir machen das die ganze Zeit in der Algebra . Der Trick besteht darin, diesen Wert aussagekräftig zu machen, damit wir verstehen, was passiert ist.
Wenn der zurückgegebene Wert Ergebnisse und Ablehnungen ausdrücken kann, muss er an Code gesendet werden, der beide verarbeiten kann. Polymorphismus ist hier wirklich mächtig. Anstatt Null-Checks einfach gegen Checks zu isPresent()
tauschen, können Sie Code schreiben, der sich in beiden Fällen gut verhält. Entweder durch Ersetzen leerer Werte durch Standardwerte oder durch stillschweigendes Nichtstun.
Das Problem mit null ist, dass es viel zu viele Dinge bedeuten kann. Es führt also nur zur Zerstörung von Informationen.
In meinem bevorzugten Null-Gedanken-Experiment möchte ich Sie bitten, sich eine komplexe Rube-Goldberg- Maschine vorzustellen , die codierte Nachrichten mit farbigem Licht signalisiert, indem sie farbige Glühbirnen von einem Förderband aufnimmt, in eine Steckdose schraubt und mit Strom versorgt. Das Signal wird durch die verschiedenen Farben der Lampen gesteuert, die auf dem Förderband platziert sind.
Sie wurden gebeten, dieses abscheulich teure Ding gemäß RFC3.14159 zu machen, das besagt, dass zwischen Nachrichten eine Markierung stehen sollte. Der Marker sollte überhaupt nicht hell sein. Es sollte genau einen Impuls dauern. Die gleiche Zeit, die ein einfarbiges Licht normalerweise ausstrahlt.
Sie können nicht einfach Leerzeichen zwischen den Nachrichten lassen, da der Apparat Alarme auslöst und anhält, wenn er keine Glühbirne zum Einstecken in die Fassung findet.
Jeder, der mit diesem Projekt vertraut ist, schaudert, wenn er die Maschine oder ihren Steuercode berührt. Es ist nicht leicht zu ändern. Wie geht's? Sie können eintauchen und loslegen. Möglicherweise aktualisieren Sie dieses scheußliche Design der Dinge. Ja, du könntest es so viel besser machen. Oder Sie sprechen mit dem Hausmeister und sammeln ausgebrannte Glühbirnen.
Das ist die polymorphe Lösung. Das System muss nicht einmal wissen, dass sich etwas geändert hat.
Es ist wirklich schön, wenn Sie das durchziehen können. Indem Sie eine sinnvolle Zurückweisung einer Annahme in einen Wert kodieren, müssen Sie die Frage nicht zwingen, sich zu ändern.
Wie viele Äpfel schuldest du mir, wenn ich dir 1 Apfel gebe? -1. Weil ich dir 2 Äpfel von gestern schuldig bin. Hier wird die Annahme der Frage "Sie schulden mir etwas" mit einer negativen Zahl abgelehnt. Auch wenn die Frage falsch war, enthält diese Antwort aussagekräftige Informationen. Indem die Frage auf sinnvolle Weise abgelehnt wird, ist sie nicht gezwungen, sich zu ändern.
Manchmal ist es jedoch der richtige Weg, die Frage zu ändern. Wenn die Annahme verlässlicher und dennoch nützlich ist, sollten Sie dies in Betracht ziehen.
Ihr Problem ist, dass Updates normalerweise von Spielern stammen. Sie haben jedoch festgestellt, dass ein Update erforderlich ist, das nicht von Player 1 oder Player 2 stammt. Sie benötigen ein Update, das besagt, dass die Zeit abgelaufen ist. Keiner der Spieler sagt dies. Was solltest du tun? Spieler null zu lassen, scheint so verlockend. Aber es zerstört Informationen. Sie versuchen, Wissen in ein Schwarzes Loch zu verschlüsseln.
Das Spielerfeld sagt dir nicht, wer gerade umgezogen ist. Du denkst, es tut es, aber dieses Problem beweist, dass es eine Lüge ist. Das Player-Feld zeigt an, woher das Update stammt. Dein abgelaufenes Update kommt von der Spieluhr. Meine Empfehlung ist, der Uhr die Ehre zu geben, die sie verdient, und den Namen des player
Feldes in so etwas wie zu ändern source
.
Auf diese Weise kann der Server, der heruntergefahren wird und das Spiel unterbrechen muss, ein Update senden, das die Ereignisse meldet und sich selbst als Quelle des Updates aufführt.
Bedeutet das, dass Sie niemals einfach etwas weglassen sollten? Nein. Aber Sie müssen sich überlegen, wie gut nichts wirklich einen einzigen bekannten guten Standardwert bedeuten kann. Nichts ist wirklich leicht zu überbeanspruchen. Sei also vorsichtig, wenn du es benutzt. Es gibt eine Denkschule, in der es darum geht, nichts zu bevorzugen . Es heißt Konvention über Konfiguration .
Ich mag das selbst, aber nur, wenn die Konvention in irgendeiner Weise klar kommuniziert wird. Es sollte kein Weg sein, die Neulinge zu trüben. Aber selbst wenn Sie das verwenden, ist null immer noch nicht der beste Weg, dies zu tun. Null ist ein gefährliches Nichts . Null gibt vor, etwas zu sein, das Sie verwenden können, bis Sie es verwenden, dann bläst es ein Loch in das Universum (bricht Ihr semantisches Modell). Wenn Sie nicht ein Loch in das Universum werfen, ist das das Verhalten, das Sie brauchen, warum spielen Sie damit herum? Benutze etwas anderes.