Der Kern der Frage lautet: "Wie gebe ich zwei unabhängige Informationen von einer Methode zurück, die ein einzelnes int zurückgibt? Ich möchte meine Rückgabewerte nie überprüfen, und Nullen sind schlecht. Verwenden Sie sie nicht."
Schauen wir uns an, was Sie weitergeben möchten. Sie übergeben entweder eine Ganzzahl oder eine Nicht-Ganzzahl- Begründung dafür, warum Sie die Ganzzahl nicht angeben können. Die Frage besagt, dass es nur zwei Gründe geben wird, aber jeder, der jemals eine Aufzählung gemacht hat, weiß, dass jede Liste wachsen wird. Es ist einfach sinnvoll, andere Gründe anzugeben.
Auf den ersten Blick scheint dies ein guter Fall für das Auslösen einer Ausnahme zu sein.
Wenn Sie dem Aufrufer etwas Besonderes mitteilen möchten, das nicht im Rückgabetyp enthalten ist, sind Ausnahmen häufig das geeignete System: Ausnahmen betreffen nicht nur Fehlerzustände und ermöglichen es Ihnen, eine Vielzahl von Kontexten und Begründungen zurückzugeben, um zu erklären, warum dies nur möglich ist heute nicht.
Und dies ist das EINZIGE System, mit dem Sie garantiert gültige Ints zurückgeben können und das garantiert, dass jeder int-Operator und jede Methode, die Ints akzeptiert, den Rückgabewert dieser Methode akzeptieren kann, ohne jemals nach ungültigen Werten wie null oder magischen Werten suchen zu müssen.
Aber Ausnahmen sind nur dann wirklich eine gültige Lösung, wenn dies, wie der Name schon sagt, ein Ausnahmefall ist und nicht der normale Geschäftsverlauf.
Und ein Try / Catch-and-Handler ist genau so wichtig wie ein Null-Check, gegen den überhaupt Einspruch erhoben wurde.
Und wenn der Anrufer das try / catch nicht enthält, muss der Anrufer das tun und so weiter.
Ein naiver zweiter Durchgang lautet: "Es ist eine Messung. Negative Entfernungsmessungen sind unwahrscheinlich." Für einige Messungen von Y können Sie also nur consts für haben
- -1 = unbekannt,
- -2 = unmöglich zu messen,
- -3 = weigerte sich zu antworten,
- -4 = bekannt aber vertraulich,
- -5 = variiert je nach Mondphase, siehe Tabelle 5a,
- -6 = vierdimensional, Maße im Titel angegeben,
- -7 = Dateisystem-Lesefehler
- -8 = reserviert für zukünftige Verwendung,
- -9 = Quadrat / Kubik, also ist Y dasselbe wie X,
- -10 = ist ein Monitorbildschirm, daher werden keine X- und Y-Messungen verwendet. Verwenden Sie X als Bildschirmdiagonale.
- -11 = schrieb die Messungen auf die Rückseite einer Quittung und es wurde in Unleserlichkeit gewaschen, aber ich denke, es war entweder 5 oder 17,
- -12 = ... du kommst auf die Idee.
Dies ist die Art und Weise, wie dies in vielen alten C-Systemen und sogar in modernen Systemen, in denen es eine echte Einschränkung für int gibt und Sie es nicht in eine Struktur oder eine Monade irgendeines Typs umbrechen können, getan wird.
Wenn die Messungen negativ sein können, vergrößern Sie einfach Ihren Datentyp (z. B. long int) und lassen die magischen Werte höher als den Bereich des int sein. Beginnen Sie im Idealfall mit einem Wert, der in einem Debugger deutlich angezeigt wird.
Es gibt gute Gründe, sie als separate Variable zu haben, anstatt nur magische Zahlen zu haben. Zum Beispiel strikte Typisierung, Wartbarkeit und Erfüllung der Erwartungen.
In unserem dritten Versuch betrachten wir Fälle, in denen es der normale Geschäftsverlauf ist, nicht int-Werte zu haben. Zum Beispiel, wenn eine Auflistung dieser Werte mehrere nicht ganzzahlige Einträge enthalten kann. Dies bedeutet, dass ein Ausnahmebehandler möglicherweise der falsche Ansatz ist.
In diesem Fall ist es ein guter Fall für eine Struktur, die das int und die Begründung übergibt. Wiederum kann diese Begründung nur eine Konstante wie die obige sein, aber anstatt beide im selben int zu halten, speichern Sie sie als verschiedene Teile einer Struktur. Anfangs haben wir die Regel, dass, wenn das Grundprinzip festgelegt ist, das int nicht festgelegt wird. An diese Regel sind wir aber nicht mehr gebunden; Bei Bedarf können wir auch Begründungen für gültige Zahlen liefern.
So oder so, jedes Mal, wenn Sie es aufrufen, benötigen Sie Boilerplate, um das Grundprinzip zu testen, um festzustellen, ob das int gültig ist. Ziehen Sie dann den int-Teil heraus und verwenden Sie ihn, wenn das Grundprinzip dies zulässt.
Hier müssen Sie Ihre Argumentation hinter "Don't Use Null" untersuchen.
Wie Ausnahmen soll Null einen Ausnahmezustand bedeuten.
Wenn ein Aufrufer diese Methode aufruft und den "rationalen" Teil der Struktur vollständig ignoriert, eine Zahl ohne Fehlerbehandlung erwartet und eine Null erhält, behandelt er die Null als Zahl und ist falsch. Wenn es eine magische Zahl erhält, behandelt es das als eine Zahl und ist falsch. Aber wenn es eine Null wird, wird es umfallen , wie es verdammt gut tun sollte.
Jedes Mal, wenn Sie diese Methode aufrufen, müssen Sie den Rückgabewert überprüfen. Sie behandeln jedoch die ungültigen Werte, ob bandintern oder bandextern, try / catch, überprüfen die Struktur auf eine "rationale" Komponente und überprüfen das int nach einer magischen Zahl suchen oder ein Int auf eine Null prüfen ...
Die Alternative, die Multiplikation einer Ausgabe zu behandeln, die ein ungültiges int und eine Begründung wie "Mein Hund hat diese Messung gefressen" enthalten könnte, besteht darin, den Multiplikationsoperator für diese Struktur zu überladen.
... und überladen Sie dann jeden anderen Operator in Ihrer Anwendung, der möglicherweise auf diese Daten angewendet wird.
... und dann alle Methoden überladen, die Ints benötigen könnten.
... Und all diese Überladungen müssen weiterhin Prüfungen auf ungültige Ints enthalten, damit Sie den Rückgabetyp dieser einen Methode so behandeln können, als wäre er zum Zeitpunkt des Aufrufs immer ein gültiger Int.
Die ursprüngliche Prämisse ist also in verschiedener Hinsicht falsch:
- Wenn Sie ungültige Werte haben, können Sie es nicht vermeiden, an jedem Punkt im Code, an dem Sie die Werte verarbeiten, nach diesen ungültigen Werten zu suchen.
- Wenn Sie etwas anderes als ein int zurückgeben, geben Sie kein int zurück, sodass Sie es nicht wie ein int behandeln können. Das Überladen von Operatoren lässt Sie so tun , als ob , aber das ist nur so, als ob.
- Ein Int mit magischen Zahlen (einschließlich NULL, NAN, Inf ...) ist nicht mehr wirklich ein Int, sondern die Struktur eines Armen.
- Durch das Vermeiden von Nullen wird der Code nicht robuster. Es werden lediglich die Probleme mit Ints ausgeblendet oder in eine komplexe Ausnahmebehandlungsstruktur verschoben.