Często zwracam wartość logiczną z metody używanej w wielu lokalizacjach, aby zawrzeć całą logikę wokół tej metody w jednym miejscu. Wszystkie (wewnętrzne) metody wywoływania muszą wiedzieć, czy operacja się powiodła, czy nie.
Używam Pythona, ale pytanie niekoniecznie jest specyficzne dla tego języka. Są tylko dwie opcje, o których mogę myśleć
- Zgłaszaj wyjątek, chociaż okoliczności nie są wyjątkowe, i pamiętaj, aby wychwycić ten wyjątek w każdym miejscu, w którym wywoływana jest funkcja
- Zwróć wartość logiczną, tak jak ja.
To jest naprawdę prosty przykład, który pokazuje, o czym mówię.
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()
Chociaż jest funkcjonalny, naprawdę nie podoba mi się ten sposób robienia czegoś, „pachnie”, a czasami może powodować wiele zagnieżdżonych ifów. Ale nie mogę wymyślić prostszego sposobu.
Mógłbym przejść do bardziej filozofii LBYL i użyć go os.path.exists(filename)
przed próbą usunięcia, ale nie ma gwarancji, że plik nie zostanie w międzyczasie zablokowany (jest mało prawdopodobne, ale możliwe) i nadal muszę ustalić, czy usunięcie zakończyło się powodzeniem, czy nie.
Czy jest to „akceptowalny” projekt, a jeśli nie, jaki byłby lepszy sposób zaprojektowania tego?