एक बात के लिए, if/else
ब्लॉक के बड़े क्लंप आसानी से परीक्षण योग्य नहीं हैं । प्रत्येक नई "शाखा" एक और निष्पादन पथ को जोड़ती है और इस प्रकार चक्रीय जटिलता को बढ़ाती है । यदि आप अपने कोड का पूरी तरह से परीक्षण करना चाहते हैं, तो आपको सभी निष्पादन पथों को कवर करना होगा, और प्रत्येक शर्त के लिए आपको कम से कम एक और परीक्षा लिखने की आवश्यकता होगी (यह मानते हुए कि आप छोटे, केंद्रित परीक्षण लिखें)। दूसरी ओर, वे कक्षाएं जो आमतौर पर रणनीतियों को लागू करती हैं, केवल 1 सार्वजनिक पद्धति को उजागर करती हैं, जो परीक्षण करना आसान है।
तो, नेस्टेड के साथ if/else
आप अपने कोड के एक हिस्से के लिए कई परीक्षणों के साथ समाप्त करेंगे, जबकि रणनीति के साथ आपके पास कई सरलतम रणनीतियों में से प्रत्येक के लिए कुछ परीक्षण होंगे। उत्तरार्द्ध के साथ, बेहतर कवरेज करना आसान है, क्योंकि निष्पादन पथ को याद रखना कठिन है।
के रूप में तानाना , कल्पना करें कि आप एक रूपरेखा है, जहां उपयोगकर्ताओं को अपने स्वयं के व्यवहार इंजेक्षन करने में सक्षम होना चाहिए लिख रहे हैं। उदाहरण के लिए, आप कुछ प्रकार की कर गणना ढाँचा बनाना चाहते हैं, और विभिन्न देशों की कर प्रणालियों का समर्थन करना चाहते हैं। उन सभी को लागू करने के बजाय, आप केवल फ्रेमवर्क उपयोगकर्ताओं को कुछ विशेष करों की गणना करने के तरीके को लागू करने का मौका देना चाहते हैं।
यहाँ रणनीति पैटर्न है:
- आप एक इंटरफ़ेस परिभाषित करते हैं, उदाहरण के लिए
TaxCalculation
, और आपका ढांचा करों की गणना करने के लिए इस प्रकार के उदाहरणों को स्वीकार करता है
- फ्रेमवर्क का एक उपयोगकर्ता एक वर्ग बनाता है जो इस इंटरफ़ेस को लागू करता है और इसे आपके फ्रेमवर्क में भेजता है, इस प्रकार गणना का कुछ भाग करने का एक तरीका प्रदान करता है।
आप इसके साथ ऐसा नहीं कर सकते if/else
, क्योंकि इसके लिए रूपरेखा के कोड को बदलने की आवश्यकता होगी, जिस स्थिति में यह अब एक ढांचा नहीं होगा। चूंकि फ्रेमवर्क को अक्सर संकलित रूप में वितरित किया जाता है, इसलिए यह एकमात्र विकल्प हो सकता है।
फिर भी, भले ही आप कुछ नियमित कोड लिखें, लेकिन रणनीति फायदेमंद है क्योंकि यह आपके इरादों को स्पष्ट करता है। यह कहता है "यह तर्क प्लग करने योग्य और सशर्त है", यानी कई कार्यान्वयन हो सकते हैं जो उपयोगकर्ता के कार्यों, कॉन्फ़िगरेशन या यहां तक कि प्लेटफॉर्म के आधार पर भिन्न हो सकते हैं।
रणनीति पैटर्न का उपयोग करने से पठनीयता में सुधार हो सकता है , क्योंकि एक वर्ग जो कुछ विशेष रणनीति को लागू करता है, आमतौर पर एक वर्णनात्मक नाम होना चाहिए, उदाहरण के लिए USAIncomeTaxCalculator
, if/else
ब्लॉक "नामहीन" हैं, सर्वोत्तम मामलों में केवल टिप्पणी की गई है, और टिप्पणियां झूठ हो सकती हैं। इसके अलावा, मेरे व्यक्तिगत स्वाद को फ्राई करें, बस if/else
एक पंक्ति में 3 ब्लॉक पढ़ने योग्य नहीं हैं, और यह नेस्टेड ब्लॉक के साथ बहुत खराब हो जाता है।
खुला / बंद सिद्धांत , यह भी बहुत प्रासंगिक है, क्योंकि जैसा कि मैंने ऊपर के उदाहरण में वर्णित, रणनीति आप उन भागों (पुनर्लेखन "संशोधन के लिए बंद किया गया" के बिना अपने कोड ( "विस्तार के लिए खुला") के कुछ हिस्सों में एक तर्क का विस्तार करने की अनुमति देता है )।