Jeśli istnieje metoda
bool DoStuff() {
try {
// doing stuff...
return true;
}
catch (SomeSpecificException ex) {
return false;
}
}
czy raczej powinno się to nazywać IsStuffDone()
?
Obie nazwy mogą zostać błędnie zinterpretowane przez użytkownika: Jeśli nazwa jest DoStuff()
przyczyną, dla której zwraca wartość logiczną? Jeśli nazwa brzmi, IsStuffDone()
nie jest jasne, czy metoda wykonuje zadanie, czy tylko sprawdza jego wynik.
Czy istnieje konwencja w tej sprawie? Lub podejście alternatywne, ponieważ uważa się je za wadliwe? Na przykład w językach, które mają parametry wyjściowe, takie jak C #, boolowska zmienna statusu może być przekazana do metody jako jedna, a typem zwracanej metody będzie void
.
EDYCJA: W moim konkretnym problemie obsługa wyjątków nie może być bezpośrednio delegowana do programu wywołującego, ponieważ metoda jest częścią implementacji interfejsu. W związku z tym osoba dzwoniąca nie może być obciążona zajmowaniem się wszystkimi wyjątkami różnych implementacji. Nie zna tych wyjątków. Jednak osoba dzwoniąca może poradzić sobie z niestandardowym wyjątkiem, takim StuffHasNotBeenDoneForSomeReasonException
jak zasugerowano w odpowiedzi i komentarzu npinti .
boolean
zamiast owijania lub przekazywania wyjątku jest prawie zawsze błędne.
BadlyDesignedMethodInSeriousNeedOfRefactoring
? I aby odpowiedzieć na twoje pytanie dotyczące wyjątków - albo pozwól abonentowi je obsłużyć, albo złapię je, a następnie wyrzucę niestandardowy wyjątek, który oznacza, że „ta metoda nie działa”. Udostępnij i ciesz się.
if (FirstMethodSucceeds(problem) or SecondMethodSucceeds(problem) or ...) Hurray(); else UniversalSolve(problem);
. To samo z wyjątkami (niestandardowymi?) Byłoby bezużytecznie bardziej skomplikowane.