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?
def m(): Unit // and implicitly know that exceptions can be thrown?
; def m(): Either[SomeErrorType, Unit] // this is odd
; 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.
Danke
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.
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. Option[T]
= & gt; Die Option kann nur codieren, dass die Operation einen Wert hatte oder nicht 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.
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.
Tags und Links scala