Tôi thường thấy mình trả lại một boolean từ một phương thức, được sử dụng ở nhiều vị trí, để chứa tất cả logic xung quanh phương thức đó ở một nơi duy nhất. Tất cả các phương thức gọi (nội bộ) cần biết là liệu thao tác có thành công hay không.
Tôi đang sử dụng Python nhưng câu hỏi không nhất thiết phải dành riêng cho ngôn ngữ đó. Chỉ có hai lựa chọn tôi có thể nghĩ ra
- Tăng một ngoại lệ, mặc dù các trường hợp không phải là ngoại lệ, và hãy nhớ bắt ngoại lệ đó ở mọi nơi mà hàm được gọi
- Trả lại một boolean như tôi đang làm.
Đây là một ví dụ thực sự đơn giản thể hiện những gì tôi đang nói.
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()
Mặc dù nó hoạt động, tôi thực sự không thích cách làm việc này, nó "có mùi", và đôi khi có thể dẫn đến rất nhiều ifs lồng nhau. Nhưng, tôi không thể nghĩ ra một cách đơn giản hơn.
Tôi có thể chuyển sang triết lý LBYL hơn và sử dụng os.path.exists(filename)
trước khi thử xóa nhưng không có gì đảm bảo tệp sẽ không bị khóa trong thời gian đó (không thể nhưng có thể) và tôi vẫn phải xác định xem việc xóa có thành công hay không.
Đây có phải là một thiết kế "chấp nhận được" và nếu không thì cách nào tốt hơn để thiết kế nó?