Die Verwendung der Option überall ist ein wenig peinlich. Mache ich etwas falsch?

7

Als Ergebnis von Artikeln, die ich über die Klasse Option gelesen habe, die Ihnen hilft, die NullPointerException zu vermeiden, habe ich angefangen, sie überall zu verwenden. Stellen Sie sich so etwas vor:

%Vor%

und später, wenn ich es verwende:

%Vor%

So etwas zu tun, fühlt sich für mich nicht "richtig" an. Ich habe auch bemerkt, dass .get veraltet ist. . Sind das Sachen, die ihr mit Options macht, oder gehe ich in die falsche Richtung?

    
Geo 19.03.2010, 11:34
quelle

5 Antworten

15

Es ist im Allgemeinen keine gute Idee, Option zurückzugeben und dann getOrElse zu verwenden, um einen Sentinel-Wert zu erzeugen, der "nicht gefunden" bedeutet. Das ist, was Option dafür bestimmt ist: zu signalisieren, dass ein Wert nicht gefunden wird!

Option zeigt wirklich seine Stärke, wenn es in Verbindung mit funktionalen Programmierkonstrukten wie map und foreach verwendet wird. Dies ist am wirksamsten, wenn es um mehrere Optionen geht. Angenommen, ich schreibe eine Methode, die eine Zeichenfolge annimmt und mir eine Datei zurückgibt, aber nur, wenn die Datei existiert und eine Datei ist, die kein Verzeichnis ist:

%Vor%

Bisher ist die Verwendung von null einfacher - zumindest bis Sie vergessen haben, dass Sie null erhalten und eine NPE erhalten. Wie auch immer, lass uns jetzt versuchen, es zu benutzen.

%Vor%

Schau, was passiert ist! Im ersten Fall mussten wir logische Tests von Hand durchführen und temporäre Variablen erstellen. Pfui! Im zweiten Fall hat map die ganze Drecksarbeit für uns erledigt: None wurde auf None abgebildet und Some(file) wurde auf Some(fileinputstream) abgebildet. Einfach!

Aber es wird noch besser. Vielleicht möchten wir die Größe einer ganzen Reihe von Dateien finden:

%Vor%

Warte, was ist hier los - was ist mit all dem None ? Müssen wir nicht aufpassen und irgendwie damit umgehen? Nun, hier kommt flatMap ins Spiel: Es vereint alle Antworten in einer einzigen Liste. None ist eine Antwort der Länge Null, also ignoriert sie es. Some(f) hat eine Antwort - f - so wird es in die Liste eingefügt. Dann verwenden wir eine Falte, um alle Längen zu addieren - jetzt, da alle Elemente in der Liste gültig sind. Ziemlich nett!

    
Rex Kerr 19.03.2010, 14:30
quelle
12

Es ist eine gute Idee, den Wert von Option nicht aufzulösen, sondern anzuwenden Logik auf das, was darin enthalten ist:

%Vor%

Im Grunde wird ein File verarbeitet, wenn einer gefunden wird und nichts anderes geschieht (und entspricht Thomas 'erstem for Verständnis, weil for zu einem Aufruf von foreach kompiliert wird). Es ist eine prägnante Version von:

%Vor%

Das Tolle daran ist, dass Sie Operationen verketten können, etwa wie folgt:

%Vor%     
oxbow_lakes 19.03.2010 12:30
quelle
7

In den meisten Fällen würden Sie den Mustervergleich verwenden

%Vor%

Wenn Sie nur an der Datei interessiert sind, wenn sie da ist, können Sie einen for expression

verwenden %Vor%

Sie können dann für Ausdrücke ketten, die auf mehreren Ebenen in Containern funktionieren

%Vor%

Alternativ können Sie isDefined verwenden und erhalten:

%Vor%

get ist in Scala 2.8.0.Beta-1 nicht veraltet.

    
Thomas Jung 19.03.2010 11:45
quelle
2

Hier ist eine Alternative:

%Vor%

Wenn Sie jedoch etwas tun müssen, wenn die Datei existiert, und etwas anderes, wenn dies nicht der Fall ist, ist eine match -Anweisung besser geeignet:

%Vor%

Das ist ziemlich genau das gleiche wie eine if Anweisung, aber ich mag, dass es die Natur besser verkettet, zB für Option , wo ich auch einen Wert extrahieren möchte.

    
Daniel C. Sobral 19.03.2010 12:49
quelle
1

Meistens wiederholen Sie, was alle sagen, aber ich denke, es gibt mindestens 4 verschiedene Situationen, denen Sie begegnen werden, wenn Sie eine Nullable-Var wie folgt haben:

1. Die Datei darf nicht null sein

%Vor%

Wird eine Ausnahme auslösen, wenn Sie versuchen, die Datei tatsächlich zu verwenden. Fail schnell, yay!

2. Die Datei ist null, aber in diesem Fall haben wir einen vernünftigen Standardwert:

%Vor%

3. Zwei Zweige der Logik, basierend darauf, ob die Datei existiert:

%Vor%

4. No-Op, wenn die Datei null ist, alias stillschweigend. Ich denke nicht, dass mir das im wirklichen Leben sehr oft vorzuziehen ist:

%Vor%

Oder vielleicht deutlicher?

%Vor%     
Adam Rabung 19.03.2010 15:14
quelle

Tags und Links