Welcher Rückgabetyp sollte eine Scala-Methode haben, wenn sie Fehler zurückgeben / zurückgeben kann, aber den Rückgabetyp Einheit hat?

8

Wenn wir also eine Methode ausführen, die sowohl einen Fehler liefert als auch einen Wert zurückgibt, können wir den Rückgabewert unserer Methode als Either[SomeErrorType, ReturnType] kodieren. Aber viele Male führen wir eine Methode für ihre Nebenwirkungen aus, daher ist der Rückgabetyp Unit .

Ich könnte natürlich ein Either[SomeErrorType, Unit] zurückgeben, aber das sieht definitiv seltsam aus.

Ich könnte auch ein Option[SomeErrorType] zurückgeben, aber es sieht nicht wirklich viel besser aus (und bricht eine möglicherweise vorhandene Symmetrie mit anderen Either[SomeErrorType, NonUnitReturnType] s.

Was ist Ihr Ansatz in diesen Fällen?

  1. def m(): Unit // and implicitly know that exceptions can be thrown? ;
  2. def m(): Either[SomeErrorType, Unit] // this is odd ;
  3. def m(): Option[SomeErrorType] // this is odd, as it makes it look as the return type of m () on a successful run is an error code.
  4. Andere, an die ich nicht denken kann?

Danke

    
devoured elysium 24.12.2016, 11:41
quelle

2 Antworten

10

Ich verwende Try[Unit] für diesen Fall.

Er codiert, dass das Ergebnis der Methode entweder erfolgreich ist oder fehlschlägt mit Exception , das weiterverarbeitet werden kann.

  • vs T => Unit Try hebt Fehler auf die Anwendungsebene, codiert in der Signatur, dass ein Fehler erwartet werden kann, und erlaubt der Anwendung, sie als Wert zu behandeln.
  • vs. Option[T] = & gt; Die Option kann nur codieren, dass die Operation einen Wert hatte oder nicht
  • vs. Either[SomeErrorType, Unit] = & gt; Try Es ist einfacher mit monadischen Konstruktionen zu arbeiten.

Ich habe so etwas verwendet, um Prüfungen durchzuführen. (imaginäres Beispiel)

%Vor%

wobei jede Prüfung das folgende Format hat: Entity => Try[Unit]

Dies gibt die entity zurück, wenn alle Prüfungen den ersten Fehler bestehen, der die Prüfung nicht bestanden hat.

    
maasg 24.12.2016 11:50
quelle
2

Eine weitere Option, die noch nicht erwähnt wurde, ist Validated von Katzen . Alle bisher erwähnten Optionen ( Try , Either , Option ) sind Monaden, während Validated ein anwendungsspezifischer Funktor ist. In der Praxis bedeutet dies, dass Sie Fehler von mehreren Methoden akkumulieren können, die Validated zurückgeben, und Sie können mehrere Validierungen parallel durchführen. Dies mag für Sie nicht relevant sein, und dies ist ein wenig orthogonal zur ursprünglichen Frage, aber ich denke, dass es in diesem Zusammenhang noch erwähnenswert ist.

Wie bei der ursprünglichen Frage ist die Verwendung von Unit return type für eine Nebeneffekt-Funktion völlig in Ordnung. Die Tatsache, dass diese Funktion auch einen Fehler zurückgeben kann, sollte Sie nicht stören, wenn Sie den Rückgabetyp "echt" (richtig, erfolgreich usw.) definieren. Wenn ich also aus Ihren ursprünglichen Optionen auswählen würde, würde ich nach Either[Error, Unit] gehen. Es sieht definitiv nicht komisch aus, und wenn jemand irgendwelche Nachteile darin sieht, würde ich sie gerne kennenlernen.

    
Haspemulator 24.12.2016 20:55
quelle

Tags und Links