Se houver um método
bool DoStuff() {
try {
// doing stuff...
return true;
}
catch (SomeSpecificException ex) {
return false;
}
}
deveria ser chamado IsStuffDone()
?
Ambos os nomes podem ser mal interpretados pelo usuário: se o nome é DoStuff()
por que ele retorna um valor booleano? Se o nome for IsStuffDone()
, não está claro se o método executa uma tarefa ou apenas verifica seu resultado.
Existe uma convenção para este caso? Ou uma abordagem alternativa, como esta é considerada defeituosa? Por exemplo, em idiomas que possuem parâmetros de saída, como C #, uma variável de status booleana pode ser passada para o método como uma e o tipo de retorno do método void
.
EDIT: No meu problema particular, o tratamento de exceções não pode ser delegado diretamente ao chamador, porque o método faz parte de uma implementação de interface. Portanto, o chamador não pode ser acusado de lidar com todas as exceções de diferentes implementações. Não está familiarizado com essas exceções. No entanto, o chamador pode lidar com uma exceção personalizada, como StuffHasNotBeenDoneForSomeReasonException
sugerido na resposta e no comentário do npinti .
boolean
vez de quebrar ou passar a exceção quase sempre está errado.
BadlyDesignedMethodInSeriousNeedOfRefactoring
? E para responder à sua pergunta sobre as exceções - eu deixaria o chamador lidar com elas ou as capturaria e, em seguida, lançaria uma exceção personalizada que significa "esse método não funciona". Compartilhe e curta.
if (FirstMethodSucceeds(problem) or SecondMethodSucceeds(problem) or ...) Hurray(); else UniversalSolve(problem);
. Fazer o mesmo com exceções (personalizadas?) Seria inutilmente mais complicado.