Принятый ответ хорошо, когда у вас есть только 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)) { ... }
По сути, каждый случай валидации имеетсвой собственный класс, который отвечает за (а) определение, соответствует ли валидация этому случаю, и (б) отправку валидации кому-либо еще в цепочке, если это не так.
Обратите вниманиегоЯ не знаком с 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))
Опять же, вы можете найти это перегиб для вашего конкретного примера, но он создает намного более чистый код, если вы в конечном итогес гораздо более сложным набором случаев, которые должны быть выполнены.