Costumo encontrar-me retornando um booleano de um método, usado em vários locais, para conter toda a lógica em torno desse método em um único local. Todo o método de chamada (interno) precisa saber é se a operação foi bem-sucedida ou não.
Estou usando Python, mas a pergunta não é necessariamente específica para essa linguagem. Existem apenas duas opções em que posso pensar
- Crie uma exceção, embora as circunstâncias não sejam excepcionais, e lembre-se de capturar essa exceção em todos os lugares em que a função for chamada
- Retorne um booleano como estou fazendo.
Este é realmente um exemplo simples que demonstra do que estou falando.
import os
class DoSomething(object):
def remove_file(self, filename):
try:
os.remove(filename)
except OSError:
return False
return True
def process_file(self, filename):
do_something()
if remove_file(filename):
do_something_else()
Embora seja funcional, eu realmente não gosto dessa maneira de fazer algo, "cheira" e às vezes pode resultar em muitos ifs aninhados. Mas não consigo pensar em uma maneira mais simples.
Eu poderia recorrer a uma filosofia mais LBYL e usá-lo os.path.exists(filename)
antes de tentar excluir, mas não há garantias de que o arquivo não será bloqueado nesse meio tempo (é improvável, mas possível) e ainda preciso determinar se a exclusão foi bem-sucedida ou não.
Esse é um design "aceitável" e, se não, qual seria a melhor maneira de projetar isso?