इस तरह के मुद्दों के लिए मार्टिन फाउलर ने विशिष्टता पैटर्न प्रस्तावित किया :
... डिजाइन पैटर्न, जिसमें व्यावसायिक नियमों को बुलियन लॉजिक का उपयोग करके व्यावसायिक नियमों को एक साथ जोड़कर पुनर्संयोजित किया जा सकता है।
एक विनिर्देश पैटर्न एक व्यापार नियम की रूपरेखा देता है जो अन्य व्यावसायिक नियमों के साथ संयोजन योग्य है। इस पैटर्न में, व्यापार तर्क की एक इकाई अमूर्त समग्र समग्र विनिर्देश वर्ग से अपनी कार्यक्षमता विरासत में मिली है। कम्पोजिट स्पेसिफिकेशन क्लास में एक फ़ंक्शन होता है जिसे IsSatisfiedBy कहा जाता है जो बूलियन वैल्यू लौटाता है। तात्कालिकता के बाद, विनिर्देश अन्य विशेषताओं के साथ "जंजीर" है, जिससे नए विनिर्देशों को आसानी से बनाए रखा जा सकता है, फिर भी उच्च अनुकूलन योग्य व्यावसायिक तर्क। इसके अलावा तात्कालिकता पर व्यापार तर्क हो सकता है, विधि मंगलाचरण या नियंत्रण के उलट के माध्यम से, इसकी अवस्था बदल सकती है ताकि अन्य वर्गों के प्रतिनिधि बन सकें जैसे कि एक दृढ़ता भंडार ...
ऊपर थोड़ा उच्च-भौंकता है (कम से कम मेरे लिए), लेकिन जब मैंने इसे अपने कोड में आज़माया तो यह काफी सुचारू रूप से चला गया और लागू करने और पढ़ने में आसान हो गया।
जिस तरह से मैं इसे देखता हूं, मुख्य विचार "निकालने" कोड है जो चेक को समर्पित पद्धति (वस्तुओं) / वस्तुओं में करता है।
अपने netWorth
उदाहरण के साथ , यह इस प्रकार दिख सकता है:
int netWorth(Person* person) {
if (isSatisfiedBySpec(person)) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
}
#define BOOLEAN int // assuming C here
BOOLEAN isSatisfiedBySpec(Person* person) {
return Person != NULL
&& person->isAlive
&& person->assets != -1
&& person->liabilities != -1;
}
आपका मामला इतना सरल प्रतीत होता है कि सभी जाँचें एक ही विधि में एक सादे सूची में फिट होने के लिए ठीक लगती हैं। मुझे अक्सर इसे बेहतर पढ़ने के लिए अधिक विधियों में विभाजित करना पड़ता है।
मैं आमतौर पर समर्पित ऑब्जेक्ट में "स्पेक" संबंधित तरीकों को समूह / एक्सट्रैक्ट करता हूं, हालांकि आपका मामला इसके बिना ठीक दिखता है।
// ...
Specification s, *spec = initialize(s, person);
if (spec->isSatisfied()) {
return person->assets - person->liabilities;
}
log("person doesn't satisfy spec");
return -1;
// ...
स्टैक ओवरफ्लो में यह प्रश्न ऊपर उल्लेखित एक के अलावा कुछ लिंक की सिफारिश करता है:
विनिर्देश पैटर्न उदाहरण । विशेष रूप से, उत्तर डिमकास्ट्स को एक उदाहरण के पूर्वाभ्यास के लिए 'लर्निंग द स्पेसिफिकेशन पैटर्न' का सुझाव देते हैं और एरिक इवांस और मार्टिन फाउलर द्वारा लिखित "स्पेसिफिकेशन" पेपर का उल्लेख करते हैं ।