허용되는 대답은 3 개의 케이스 만 있고 각각의 논리가 간단한 경우에 좋습니다.
그러나 각 사례에 대한 논리가 더 복잡하거나 더 많은 사례가있는 경우 훨씬 더 나은 옵션은 책임 사슬 설계 패턴 을 사용하는 것 입니다.
에 BaseValidator
대한 참조 BaseValidator
와에 대한 메서드 validate
및 참조 된 유효성 검사기에서 유효성 검사를 호출하는 메서드를 포함하는을 만듭니다 .
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;
}
}
그런 다음에서 상속하는 여러 하위 클래스를 만들어 각 유효성 검사기에 필요한 논리로 메서드를 BaseValidator
재정의합니다 validate
.
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);
}
}
그런 다음 사용하는 것은 간단하고 각 유효성 검사기를 인스턴스화하고 각각을 다른 유효성 검사기의 루트로 설정합니다.
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)) { ... }
본질적으로, 각각의 검증 케이스 (A)에 대한 책임이 자신의 클래스 결정을 가지고 검증과 일치하는 경우 그 사례 하고 (b) 그렇지 않은 경우 체인의 다른 사람에게 유효성 검사를 보내는 .
저는 C ++에 익숙하지 않습니다. 온라인에서 찾은 일부 예제의 구문을 일치 시키려고 시도했지만 이것이 작동하지 않으면 의사 코드처럼 처리하십시오. 또한 원하는 경우 기본으로 사용할 수있는 완전한 작동 Python 예제가 아래에 있습니다.
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))
다시 말하지만, 특정 예제에 대해이 과잉을 발견 할 수 있지만 충족해야하는 훨씬 더 복잡한 케이스 세트가 끝나면 훨씬 더 깨끗한 코드가 생성됩니다.
if
문 대신 테이블을 사용 합니다. 또한 이들은 부울 플래그이므로 각 시나리오를 상수로 모델링하고 이에 대해 확인할 수 있습니다.