Jawaban yang diterima baik-baik saja jika Anda hanya memiliki 3 kasus, dan logika untuk masing-masing kasus tersebut sederhana.
Tetapi jika logika untuk setiap kasus lebih rumit, atau ada lebih banyak kasus, opsi yang jauh lebih baik adalah menggunakan rantai tanggung jawab. pola desain .
Anda membuat BaseValidator
yang berisi referensi ke a BaseValidator
dan metode ke validate
dan metode untuk memanggil validasi pada validator yang direferensikan.
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;
}
}
Kemudian Anda membuat sejumlah subclass yang diwarisi dari BaseValidator
, mengganti validate
metode dengan logika yang diperlukan untuk setiap validator.
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);
}
}
Kemudian menggunakannya sederhana, buat instance masing-masing validator Anda, dan setel masing-masing menjadi root yang lain:
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)) { ... }
Intinya, setiap kasus validasi memiliki kelasnya sendiri yang bertanggung jawab untuk (a) menentukan apakah validasi cocok dengan itu terjadi, dan (b) mengirimkan validasi untuk orang lain dalam rantai jika tidak.
Harap dicatat bahwa saya tidak terbiasa dengan C ++. Saya sudah mencoba mencocokkan sintaks dari beberapa contoh yang saya temukan online, tetapi jika ini tidak berhasil, perlakukan lebih seperti kodesemu. Saya juga memiliki contoh Python yang berfungsi lengkap di bawah ini yang dapat digunakan sebagai dasar jika diinginkan.
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))
Sekali lagi, Anda mungkin menganggap ini berlebihan untuk contoh spesifik Anda, tetapi ini menciptakan kode yang jauh lebih bersih jika Anda berakhir dengan serangkaian kasus yang jauh lebih rumit yang perlu dipenuhi.
if
pernyataan kompleks . Selain itu, karena ini adalah flag boolean, Anda dapat membuat model setiap skenario sebagai konstanta dan memeriksanya.