Es gibt absolut keinen Grund, true
bei Erfolg zurückzukehren, wenn Sie nicht false
bei Misserfolg zurückkehren. Wie soll der Client-Code aussehen?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
In diesem Fall braucht der Aufrufer sowieso einen Try-Catch-Block, aber dann kann er besser schreiben:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
Der true
Rückgabewert ist also für den Aufrufer völlig irrelevant. Behalten Sie also einfach die Methode bei void
.
Im Allgemeinen gibt es drei Möglichkeiten zum Entwerfen von Fehlermodi.
- Rückgabe wahr / falsch
- Verwenden Sie
void
die (aktivierte) Ausnahme, werfen Sie sie
- Rück ein Zwischenergebnis - Objekt.
Rückgabe true
/false
Dies wird in einigen älteren, meist C-artigen APIs verwendet. Die Nachteile liegen auf der Hand, Sie haben keine Ahnung, was schief gelaufen ist. PHP macht das ziemlich oft, was zu folgendem Code führt:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
In Multithreading-Kontexten ist dies sogar noch schlimmer.
Wirf (aktivierte) Ausnahmen
Dies ist ein guter Weg, um es zu tun. An einigen Stellen können Sie mit einem Ausfall rechnen. Java macht das mit Sockets. Die Grundannahme ist, dass ein Aufruf erfolgreich sein sollte, aber jeder weiß, dass bestimmte Vorgänge möglicherweise fehlschlagen. Steckdosenanschlüsse gehören dazu. Der Anrufer wird also gezwungen, den Fehler zu behandeln. Es ist ein ansprechendes Design, da es sicherstellt, dass der Anrufer den Fehler tatsächlich behandelt, und dem Anrufer eine elegante Möglichkeit bietet, mit dem Fehler umzugehen.
Ergebnisobjekt zurückgeben
Dies ist eine weitere gute Möglichkeit, damit umzugehen. Es wird oft zum Parsen oder einfach für Dinge verwendet, die validiert werden müssen.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Nette, saubere Logik auch für den Anrufer.
Es gibt einige Debatten darüber, wann der zweite und wann der dritte Fall zu verwenden ist. Einige Leute glauben , dass Ausnahmen sollten außergewöhnliche und dass Sie nicht mit der Möglichkeit von Ausnahmen im Auge entwerfen sollten, und werden so ziemlich immer die dritten Optionen. Das ist in Ordnung. Wir haben jedoch Ausnahmen in Java überprüft, sodass ich keinen Grund sehe, sie nicht zu verwenden. Ich verwende geprüfte Expetitionen, wenn die Grundannahme ist, dass der Aufruf erfolgreich sein sollte (wie das Verwenden eines Sockets), aber ein Fehler möglich ist, und ich verwende die dritte Option, wenn sehr unklar ist, ob der Aufruf erfolgreich sein sollte (wie das Validieren von Daten). Aber dazu gibt es unterschiedliche Meinungen.
In deinem Fall würde ich mit void
+ gehen Exception
. Sie erwarten, dass der Dateiupload erfolgreich ist, und wenn dies nicht der Fall ist, ist dies außergewöhnlich. Der Aufrufer ist jedoch gezwungen, diesen Fehlermodus zu verarbeiten, und Sie können eine Ausnahme zurückgeben, die genau beschreibt, welche Art von Fehler aufgetreten ist.