Mi ritrovo spesso a restituire un valore booleano da un metodo, utilizzato in più posizioni, al fine di contenere tutta la logica attorno a quel metodo in un unico posto. Tutto il metodo di chiamata (interno) deve sapere se l'operazione è andata a buon fine oppure no.
Sto usando Python ma la domanda non è necessariamente specifica per quella lingua. Ci sono solo due opzioni che mi vengono in mente
- Solleva un'eccezione, sebbene le circostanze non siano eccezionali e ricorda di cogliere quell'eccezione in ogni luogo in cui viene chiamata la funzione
- Restituisci un booleano mentre lo sto facendo.
Questo è un esempio davvero semplice che dimostra di cosa sto parlando.
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()
Sebbene sia funzionale, non mi piace molto questo modo di fare qualcosa, "odora" e talvolta può provocare molti if annidati. Ma non riesco a pensare a un modo più semplice.
Potrei passare a una filosofia LBYL più e utilizzare os.path.exists(filename)
prima di tentare la cancellazione, ma non ci sono garanzie che il file non sia stato bloccato nel frattempo (è improbabile ma possibile) e devo ancora determinare se la cancellazione ha avuto successo o meno.
È un design "accettabile" e se no quale sarebbe un modo migliore di progettarlo?