Kabul edilen yanıt, yalnızca 3 vakanız olduğunda ve her birinin mantığının basit olduğu durumlarda iyidir.
Ancak her bir durumun mantığı daha karmaşıksa veya daha birçok durum varsa, çok daha iyi bir seçenek, sorumluluk zinciri tasarım modelini kullanmaktır.
Bir oluşturmak BaseValidator
bir başvuru içeriyor hangi BaseValidator
ve bir yöntem validate
ve başvurulan doğrulayıcı üzerinde doğrulama çağırmak için bir yöntem.
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;
}
}
Ardından BaseValidator
, validate
her bir doğrulayıcı için gerekli olan mantığı kullanarak yöntemi geçersiz kılarak, öğesinden miras alan bir dizi alt sınıf yaratırsınız.
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);
}
}
Daha sonra bunu kullanmak basittir, her bir doğrulayıcıyı somutlaştırın ve her birini diğerlerinin kökü olacak şekilde ayarlayın:
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)) { ... }
Temelde, her bir doğrulama vakasının, (a) doğrulamanın bu durumla eşleşip eşleşmediğini belirlemekten ve (b) yoksa doğrulamayı zincirdeki başka birine göndermekten sorumlu olan kendi sınıfı vardır .
Lütfen C ++ ile aşina olmadığımı unutmayın. Sözdizimini çevrimiçi bulduğum bazı örneklerden eşleştirmeye çalıştım, ancak bu işe yaramazsa, daha çok sözde kod gibi davranın. Ayrıca, tercih edilirse temel olarak kullanılabilecek eksiksiz bir çalışan Python örneğim de aşağıda var.
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))
Yine, bu aşırılığı kendi örneğiniz için bulabilirsiniz, ancak karşılanması gereken çok daha karmaşık bir dizi durumla karşılaşırsanız çok daha temiz bir kod oluşturur.
if
ifade yerine bir tablo kullanırdım . Ek olarak, bunlar boole bayrakları olduğundan, her senaryoyu bir sabit olarak modelleyebilir ve buna karşı kontrol edebilirsiniz.