คำตอบที่ยอมรับนั้นใช้ได้เมื่อคุณมีเพียง 3 กรณีและตรรกะของแต่ละกรณีนั้นง่ายมาก
แต่ถ้าตรรกะของแต่ละกรณีมีความซับซ้อนมากขึ้นหรือมีกรณีอื่น ๆ อีกมากมายตัวเลือกที่ดีกว่าคือการใช้รูปแบบการออกแบบห่วงโซ่ความรับผิดชอบ
คุณสร้างBaseValidator
ซึ่งมีการอ้างอิงถึง a 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))
อีกครั้งคุณอาจพบว่ามีการใช้งานมากเกินไปสำหรับตัวอย่างเฉพาะของคุณ แต่จะสร้างรหัสที่สะอาดกว่ามากหากคุณจบลงด้วยชุดคดีที่ซับซ้อนมากขึ้นซึ่งจำเป็นต้องพบ
if
คำสั่งที่ซับซ้อน นอกจากนี้เนื่องจากเป็นแฟล็กบูลีนคุณสามารถจำลองสถานการณ์แต่ละสถานการณ์เป็นค่าคงที่และตรวจสอบได้