Câu trả lời được chấp nhận là tốt khi bạn chỉ có 3 trường hợp và trong đó logic cho mỗi trường hợp rất đơn giản.
Nhưng nếu logic cho mỗi trường hợp phức tạp hơn hoặc có nhiều trường hợp hơn, thì một lựa chọn tốt hơn nhiều là sử dụng chuỗi trách nhiệm mẫu thiết kế .
Bạn tạo một BaseValidator
chứa một tham chiếu đến a BaseValidator
và một phương thức validate
và một phương thức để gọi xác thực trên trình xác thực được tham chiếu.
class BaseValidator {
BaseValidator* nextValidator;
public:
BaseValidator() {
nextValidator = 0;
}
void link(BaseValidator validator) {
if (nextValidator) {
nextValidator->link(validator);
} else {
nextValidator = validator;
}
}
bool callLinkedValidator(bool v1, bool v2, bool v3, bool v4) {
if (nextValidator) {
return nextValidator->validate(v1, v2, v3, v4);
}
return false;
}
virtual bool validate(bool v1, bool v2, bool v3, bool v4) {
return false;
}
}
Sau đó, bạn tạo một số lớp con kế thừa từ BaseValidator
, ghi đè validate
phương thức với logic cần thiết cho mỗi trình xác thực.
class Validator1: public BaseValidator {
public:
bool validate(bool v1, bool v2, bool v3, bool v4) {
if (v1 && v2 && v3 && v4) {
return true;
}
return nextValidator->callLinkedValidator(v1, v2, v3, v4);
}
}
Sau đó, việc sử dụng nó rất đơn giản, khởi tạo từng trình xác thực của bạn và đặt từng trình xác thực này làm thư mục gốc của những trình xác thực khác:
Validator1 firstValidator = new Validator1();
Validator2 secondValidator = new Validator2();
Validator3 thirdValidator = new Validator3();
firstValidator.link(secondValidator);
firstValidator.link(thirdValidator);
if (firstValidator.validate(value1, value2, value3, value4)) { ... }
Về bản chất, mỗi trường hợp xác thực có lớp riêng của nó chịu trách nhiệm (a) xác định xem việc xác thực có khớp với trường hợp đó hay không và (b) gửi xác thực cho người khác trong chuỗi nếu không.
Xin lưu ý rằng tôi không quen thuộc với C ++. Tôi đã cố gắng khớp cú pháp từ một số ví dụ mà tôi tìm thấy trực tuyến, nhưng nếu điều này không hoạt động, hãy coi nó giống như mã giả hơn. Tôi cũng có một ví dụ Python hoạt động hoàn chỉnh bên dưới có thể được sử dụng làm cơ sở nếu được ưu tiên.
class BaseValidator:
def __init__(self):
self.nextValidator = 0
def link(self, validator):
if (self.nextValidator):
self.nextValidator.link(validator)
else:
self.nextValidator = validator
def callLinkedValidator(self, v1, v2, v3, v4):
if (self.nextValidator):
return self.nextValidator.validate(v1, v2, v3, v4)
return False
def validate(self, v1, v2, v3, v4):
return False
class Validator1(BaseValidator):
def validate(self, v1, v2, v3, v4):
if (v1 and v2 and v3 and v4):
return True
return self.callLinkedValidator(v1, v2, v3, v4)
class Validator2(BaseValidator):
def validate(self, v1, v2, v3, v4):
if (v1 and v2 and v3 and not v4):
return True
return self.callLinkedValidator(v1, v2, v3, v4)
class Validator3(BaseValidator):
def validate(self, v1, v2, v3, v4):
if (v1 and not v2 and not v3 and not v4):
return True
return self.callLinkedValidator(v1, v2, v3, v4)
firstValidator = Validator1()
secondValidator = Validator2()
thirdValidator = Validator3()
firstValidator.link(secondValidator)
firstValidator.link(thirdValidator)
print(firstValidator.validate(False, False, True, False))
Một lần nữa, bạn có thể thấy điều này quá mức cần thiết cho ví dụ cụ thể của bạn, nhưng nó tạo ra mã sạch hơn nhiều nếu bạn gặp phải một loạt trường hợp phức tạp hơn nhiều cần được đáp ứng.
if
câu lệnh phức tạp . Ngoài ra, vì đây là các cờ boolean, bạn có thể lập mô hình từng trường hợp như một hằng số và kiểm tra nó.