स्वीकृत जवाब ठीक है जब आपको केवल 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)) { ... }
संक्षेप में, प्रत्येक सत्यापन मामले का अपना वर्ग होता है जो (क) के लिए जिम्मेदार होता है यदि यह निर्धारित होता है कि सत्यापन मेल खाता है मामले से , और (b) यदि नहीं है तो श्रृंखला में किसी और को सत्यापन भेज रहा है।
कृपया ध्यान दें कि मैं C ++ से परिचित नहीं हूं। मैंने कुछ उदाहरणों से वाक्यविन्यास का मिलान करने का प्रयास किया है जो मुझे ऑनलाइन मिले, लेकिन अगर यह काम नहीं करता है, तो इसे छद्मकोड की तरह व्यवहार करें। मेरे पास नीचे काम करने वाला एक पूरा पायथन उदाहरण भी है, जिसे यदि चाहें तो आधार के रूप में इस्तेमाल किया जा सकता है।
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
कथन के बजाय एक तालिका का उपयोग करूंगा । इसके अतिरिक्त, जैसा कि ये बूलियन झंडे हैं, आप प्रत्येक परिदृश्य को एक स्थिर के रूप में मॉडल कर सकते हैं और इसके खिलाफ जांच कर सकते हैं।