Nie ma absolutnie żadnego powodu, aby powrócić true
do sukcesu, jeśli nie powrócisz false
w przypadku niepowodzenia. Jak powinien wyglądać kod klienta?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
W takim przypadku dzwoniący potrzebuje bloku try-catch, ale wtedy może lepiej napisać:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
Zatem true
wartość zwracana jest całkowicie nieistotna dla osoby dzwoniącej. Więc po prostu zachowaj metodę void
.
Zasadniczo istnieją trzy sposoby projektowania trybów awaryjnych.
- Zwraca wartość prawda / fałsz
- Użyj
void
wyjątku „wyrzuć” (zaznaczone)
- zwraca pośredni obiekt wynikowy .
Powrót true
/false
Jest to używane w niektórych starszych interfejsach API, głównie typu C. Wady są obviuos, nie masz pojęcia, co poszło nie tak. PHP robi to dość często, co prowadzi do takiego kodu:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
W kontekstach wielowątkowych jest jeszcze gorzej.
Zgłaszaj (zaznaczone) wyjątki
To dobry sposób na zrobienie tego. W niektórych momentach możesz spodziewać się niepowodzenia. Java robi to z gniazdami. Podstawowym założeniem jest, że połączenie powinno się powieść, ale wszyscy wiedzą, że niektóre operacje mogą się nie powieść. Wśród nich są połączenia gniazd. Dzwoniący zostaje zmuszony do obsługi awarii. jest to ładna konstrukcja, ponieważ zapewnia, że osoba dzwoniąca rzeczywiście poradzi sobie z awarią, i daje mu elegancki sposób radzenia sobie z awarią.
Zwraca wynikowy obiekt
To kolejny dobry sposób na poradzenie sobie z tym. Jest często używany do analizowania lub po prostu do sprawdzania poprawności.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Ładna, czysta logika dla dzwoniącego.
Trwa dyskusja, kiedy użyć drugiego przypadku, a kiedy trzeciego. Niektóre osoby uważają, że wyjątki powinny być wyjątkowe i że nie należy projektować z uwzględnieniem wyjątków i prawie zawsze będą korzystać z trzeciej opcji. W porządku Ale sprawdziliśmy wyjątki w Javie, więc nie widzę powodu, aby z nich nie korzystać. Używam sprawdzonych wyrażeń, gdy podstawowym założeniem jest, że wywołanie powinno zostać zakończone (jak użycie gniazda), ale niepowodzenie jest możliwe, i używam trzeciej opcji, gdy jest bardzo niejasne, że wywołanie powinno zostać zwiększone (jak sprawdzanie poprawności danych). Ale są na ten temat różne opinie.
W twoim przypadku wybrałbym void
+ Exception
. Oczekujesz, że przesyłanie pliku się zwiększy, a kiedy to zrobi, będzie wyjątkowe. Ale dzwoniący jest zmuszony obsłużyć ten tryb awarii i możesz zwrócić wyjątek, który poprawnie opisuje, jaki rodzaj błędu wystąpił.