Einige Programmiersprachen wie zB Scala haben das Konzept von Option
Typen (auch als Maybe
), die entweder einen Wert enthalten können oder nicht.
Nach dem, was ich über sie gelesen habe, werden sie allgemein als überlegene Lösung für dieses Problem angesehen null
, da sie den Programmierer ausdrücklich dazu zwingen, die Fälle zu berücksichtigen, in denen es möglicherweise keinen Wert gibt, anstatt nur zur Laufzeit in die Luft zu jagen.
Checked Exceptions in Java scheinen dagegen eine schlechte Idee zu sein, und Java scheint die einzige weit verbreitete Sprache zu sein, die sie implementiert. Die Idee, die dahinter steckt, ähnelt der Idee Option
, den Programmierer explizit zu zwingen, sich mit der Tatsache auseinanderzusetzen, dass eine Ausnahme ausgelöst werden könnte.
Gibt es zusätzliche Probleme mit aktivierten Ausnahmen, die Option
Typen nicht haben? Oder sind diese Ideen nicht so ähnlich, wie ich denke, und es gibt gute Gründe, die explizite Behandlung für Optionen und nicht für Ausnahmen zu erzwingen?
quelle
Either e a
Datentyp.Antworten:
Weil
Option
s zusammensetzbar sind. Es gibt viele nützliche MethodenOption
, mit denen Sie kurze Code zu schreiben, während immer noch eine genaue Kontrolle über die Strömung erlaubt:map
,flatMap
,toList
,flatten
und vieles mehr. Dies liegt an der Tatsache, dassOption
es sich um eine bestimmte Art von Monade handelt, einige Objekte, die wir sehr gut komponieren können. Hätten Sie diese Methoden nicht und müssten die Mustererkennung immer aktivierenOption
oderisDefined
häufig aufrufen , wären sie bei weitem nicht so nützlich.Während aktivierte Ausnahmen die Sicherheit erhöhen, gibt es nichts, was Sie mit ihnen tun können, außer sie zu fangen oder sie den Stapel in die Luft sprudeln zu lassen (mit dem hinzugefügten Boilerplate in der Typdeklaration).
quelle
try {/* bunch of complex code involving calls to 50 different methods that may throw SomeCheckedException */} catch(SomeCheckedException e) {/* operation failed, do something */}
undfromMaybe someDefaultValue (something >>= otherThing >>= ...50 other functions that may return Nothing...)
ist was genau? Abgesehen von der Tatsache, dass Ersteres mehr Details darüber liefert, was schief gelaufen ist.Ausnahmen und Vielleicht-Objekte befassen sich nicht mit der gleichen Art von Problemen, obwohl sie miteinander verbunden sind.
Ausnahmen
Ausnahmen leuchten wirklich, wenn Sie sich nicht vor Ort mit einer Ausnahmesituation auseinandersetzen müssen (die in einigen Fällen ein Fehler ist). Sie analysieren beispielsweise eine CSV-Datei und möchten sich vor Zeilen mit falscher Formatierung schützen. Die Stelle, an der Sie feststellen, dass etwas nicht stimmt, können einige Funktionsaufrufe außerhalb der Zeileniteration sein. Wenn Sie eine Ausnahme auf der tiefsten Ebene auslösen (wo Sie Informationen zum Formatierungsproblem erhalten), können Sie diese in der Schleife abfangen, den Fehler protokollieren und mit der nächsten Zeile fortfahren. Sie müssen im Rest des Codes nichts ändern.
Die aktivierte Ausnahme fügt viel Schmerz hinzu, da alle Zwischenfunktionen den Typ throwable deklarieren müssen. Die Funktion hat den ursprünglichen Zweck verfehlt, weshalb sie heutzutage nicht beliebt ist.
Vielleicht Gegenstände
Möglicherweise sollten Objekte ausgewählt werden, wenn Sie in der Lage sind, mit einem "Fehler" vor Ort umzugehen. In diesem Sinne sind sie ein Ersatz für einen Rückkehrcode + Pass-by-Referenz-API oder einen nullfähigen Typ.
Der Vorteil des Objekts "Vielleicht" besteht darin, dass Sie explizit erklären, dass möglicherweise etwas nicht stimmt. In haskell muss ein Nicht-Vielleicht-Objekt einen Wert haben, sonst wird das Programm nicht kompiliert.
Das Problem bei nullfähigen Typen ist, dass Sie die ganze Zeit auf null prüfen müssen, um absolut sicher zu sein. Der Status "Möglicherweise stimmt etwas nicht" ist der Standardstatus.
Das Problem mit Returncodes + Pass von ref apis ist, dass sie für die meisten Menschen weniger lesbar sind.
quelle
Denn mit können
Maybe
Sie die Behandlung des Fehlers verzögern, bis Sie den Wert tatsächlich benötigen (was einige Methodenaufrufe entfernt sein kann).Die aktivierte Ausnahme muss am Anrufort behandelt werden
Die einzige Ausnahme besteht darin, dass mehr Informationen darüber weitergegeben werden können, warum dies fehlgeschlagen ist (es sei denn, jemand entwickelt
MaybeError
im Fehlerfall eine mit einem Wurffeld).quelle
Maybe
Typen nicht mit Fehlern beim Umgang verwechseln . Eine Ausnahme wird verwendet, um einen Fehler zu melden, ein Optionstyp wird verwendet, um das Ergebnis einer Teilfunktion darzustellen. Eine teilweise FunktionsrückgabeNothing
ist kein Fehler.