গ্রহণযোগ্য উত্তর ঠিক আছে যখন আপনি কেবল 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)) { ... }
সারাংশ, প্রত্যেক বৈধতা ক্ষেত্রে তার নিজস্ব শ্রেণী যা (ক) জন্য দায়ী নির্ধারণের হয়েছে থাকে বৈধতা ম্যাচ যে মামলার সাথে এবং (খ) শৃঙ্খলে থাকা অন্য কারও কাছে বৈধতা প্রেরণ
দয়া করে মনে রাখবেন যে আমি সি ++ এর সাথে পরিচিত নই। আমি অনলাইনে পাওয়া কয়েকটি উদাহরণ থেকে বাক্য গঠনটি মেলানোর চেষ্টা করেছি, তবে এটি যদি কাজ না করে তবে এটি আরও সিউডোকোডের মতো আচরণ করুন। নীচে আমার কাছে একটি সম্পূর্ণ কার্যকারী পাইথন উদাহরণ রয়েছে যা যদি পছন্দ হয় তবে ভিত্তি হিসাবে ব্যবহার করা যেতে পারে।
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স্টেটমেন্টের পরিবর্তে একটি টেবিল ব্যবহার করব । অতিরিক্ত হিসাবে, এগুলি বুলিয়ান পতাকা হিসাবে, আপনি প্রতিটি দৃশ্যের ধ্রুবক হিসাবে মডেল করতে পারেন এবং এর বিপরীতে চেক করতে পারেন।