Đối với loại vấn đề này Martin Fowler đề xuất mẫu Đặc điểm kỹ thuật :
... mẫu thiết kế, theo đó các quy tắc kinh doanh có thể được kết hợp lại bằng cách kết nối các quy tắc kinh doanh lại với nhau bằng logic boolean.
Một mẫu đặc tả phác thảo một quy tắc kinh doanh có thể kết hợp với các quy tắc kinh doanh khác. Trong mẫu này, một đơn vị logic nghiệp vụ kế thừa chức năng của nó từ lớp Đặc tả tổng hợp trừu tượng. Lớp Đặc tả tổng hợp có một hàm gọi là IsSatisfiedBy trả về giá trị boolean. Sau khi khởi tạo, đặc tả được "xâu chuỗi" với các thông số kỹ thuật khác, làm cho các thông số kỹ thuật mới có thể dễ dàng duy trì, nhưng có khả năng tùy biến cao. Ngoài ra, khi khởi tạo, logic nghiệp vụ có thể, thông qua việc gọi phương thức hoặc đảo ngược điều khiển, trạng thái của nó bị thay đổi để trở thành đại biểu của các lớp khác như kho lưu trữ bền vững ...
Ở trên nghe có vẻ hơi cao (ít nhất là với tôi), nhưng khi tôi thử nó trong mã của mình, nó đã hoạt động khá trơn tru và hóa ra dễ thực hiện và đọc.
Theo cách tôi thấy, ý tưởng chính là "trích xuất" mã thực hiện kiểm tra thành (các) phương thức / đối tượng chuyên dụng.
Với netWorth
ví dụ của bạn , điều này có thể xem xét như sau:
int netWorth(Person* person) {
if (isSatisfiedBySpec(person)) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
}
#define BOOLEAN int // assuming C here
BOOLEAN isSatisfiedBySpec(Person* person) {
return Person != NULL
&& person->isAlive
&& person->assets != -1
&& person->liabilities != -1;
}
Trường hợp của bạn xuất hiện khá đơn giản để tất cả các kiểm tra có vẻ phù hợp với một danh sách đơn giản trong một phương thức. Tôi thường phải chia thành nhiều phương pháp để làm cho nó đọc tốt hơn.
Tôi cũng thường nhóm / trích xuất các phương thức liên quan đến "spec" trong một đối tượng chuyên dụng, mặc dù trường hợp của bạn có vẻ ổn mà không cần điều đó.
// ...
Specification s, *spec = initialize(s, person);
if (spec->isSatisfied()) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
// ...
Câu hỏi này tại Stack Overflow khuyến nghị một vài liên kết ngoài một liên kết được đề cập ở trên:
Ví dụ mẫu đặc tả . Cụ thể, các câu trả lời đề xuất Kích thước 'Tìm hiểu mẫu Đặc tả' để biết thêm về một ví dụ và đề cập đến bài báo "Thông số kỹ thuật" do Eric Evans và Martin Fowler viết .