Мені часто доводиться повертати булевий метод із методу, який використовується в декількох місцях, щоб містити всю логіку навколо цього методу в одному місці. Необхідно знати весь метод (внутрішнього) виклику - успішна операція чи ні.
Я використовую Python, але питання не обов'язково стосується цієї мови. Є лише два варіанти, які я можу придумати
- Зробіть виняток, хоча обставини не є винятковими, і не забудьте зловити цей виняток у кожному місці, де називається функція
- Поверніть буле, як я роблю.
Це дійсно простий приклад, який демонструє те, про що я говорю.
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()
Хоча це функціонально, мені дуже не подобається такий спосіб робити щось, воно "пахне", а іноді може спричинити за собою багато вкладених ifs. Але я не можу придумати простіший спосіб.
Я можу звернутися до більш філософії LBYL і використовувати os.path.exists(filename)
до спроби видалення, але немає гарантій, що файл тим часом не був заблокований (це малоймовірно, але можливо), і я все одно повинен визначити, чи вдале було видалення чи ні.
Це "прийнятна" конструкція, і як ні, що було б кращим способом розробити це?