पैटर्न का उपयोग केवल वहीं किया जाना चाहिए जहां वे सबसे अच्छा समाधान हो सकते हैं या एक अच्छे समाधान के निर्माण में मदद कर सकते हैं (क्या आप सहमत हैं?)।
मैं कार्यान्वयन विवरण के रूप में डिज़ाइन पैटर्न को सख्ती से देखता हूं। यदि आप अपने सार्वजनिक एपीआई और उस दस्तावेज को प्रोग्राम करते हैं, तो सामान्य तौर पर यह आपके लिए कोई मायने नहीं रखता (या आपको बहुत प्रभावित करता है) जहां आपके पास डिजाइन पैटर्न हैं। यही है, आप "मैं यहाँ एक पुल पैटर्न नहीं है, और मैं इसे ऊपर एक आगंतुक लागू करेंगे" मत जाओ। इसके बजाय, यह "इस वर्ग के विभिन्न ऑपरेटिंग सिस्टम पर अलग-अलग कार्यान्वयन होंगे इसलिए इसे एक पुल पैटर्न का उपयोग करके लागू किया जाएगा"। फिर, जब आप इसका उपयोग करते हैं, तो आप इसे एक पुल के रूप में लागू किए जाने के प्रति उदासीन होते हैं - क्योंकि आप सार्वजनिक एपीआई को देखते हैं, पुल के पैटर्न को नहीं।
शिथिल कपल्स, लचीले डिज़ाइन बनाने में वास्तव में कितना प्रयास करना चाहिए?
नियमों के एक सरल सेट का पालन करके ढीली युग्मन प्राप्त किया जा सकता है। यदि आप इनका सम्मान करते हैं, तो आपका कोड (अधिक) शिथिल युग्मित होगा, जैसा कि आप इसे लिखते हैं (यानी कोई भी प्रयास पहले से ही विकास प्रक्रिया का हिस्सा है)।
नियमों के बीच (एक विस्तृत सूची नहीं):
- ग्राहक कोड (कैसे वर्ग का उपयोग किया जाएगा) सोच (या लेखन) द्वारा अपने इंटरफेस को परिभाषित करें, न कि कक्षा क्या करेगी (यानी इंटरफ़ेस के लिए इच्छुक, कार्यान्वयन नहीं)
- "बताओ, मत पूछो"
- पहले से निर्मित भागों से वस्तुओं का निर्माण
- कंस्ट्रक्टर में पास करें जो वास्तविक वस्तुओं का आप उपयोग करेंगे (सदस्यों के लिए कारखानों नहीं, मापदंडों के कारखानों के लिए पैरामीटर, या ऐसा कुछ भी)।
- DRY (यदि आपके पास दो लाइनें हैं जो एक ही क्रम में दो स्थानों पर दिखाई देती हैं, तो उन्हें एक अलग फ़ंक्शन और इसी तरह निकालें)।
- यदि किसी ऑब्जेक्ट का निर्माण एक अधिक जटिल ऑपरेशन है, तो कारखाने के तरीके / वर्ग (यानी निर्माणकर्ता निकाय में नहीं) के रूप में मध्यस्थ भागों के निर्माण को लागू करें।
- YAGNI (पहले जैसी चीजें बनाएं, उनकी जरूरत है)।
इन नियमों का अलग-अलग तरीके से पालन किया जाता है, भाषा के आधार पर, आपकी टीम (जैसे TDD), समय बजट की कमी आदि के बाद विकास पद्धति।
उदाहरण के लिए, जावा में, अपने इंटरफ़ेस को एक के रूप में परिभाषित करने interface
और उस पर क्लाइंट कोड लिखने के लिए अच्छा अभ्यास है (फिर, एक कार्यान्वयन वर्ग के साथ इंटरफ़ेस को त्वरित करें)।
दूसरी ओर C ++ में, आपके पास इंटरफेस नहीं है, इसलिए आप केवल इंटरफ़ेस को एक सार आधार वर्ग के रूप में लिख सकते हैं; चूंकि C ++ में आप केवल इनहेरिटेंस का उपयोग करते हैं, जब आपको इसके लिए एक मजबूत आवश्यकता होती है (और जैसे कि अनावश्यक वर्चुअल फ़ंक्शंस के ओवरहेड से बचें), आप शायद इंटरफ़ेस को अलग से परिभाषित नहीं करेंगे, बस क्लास हेडर)।
जो लोग डिजाइन पैटर्न का विरोध करते हैं, वे कहते हैं कि इन पैटर्नों का उपयोग करने की लागत अक्सर लाभ से आगे निकल जाती है।
मुझे लगता है कि वे गलत कर रहे हैं। यदि आप शिथिल युग्मित (और DRY) कोड लिखते हैं, तो इसमें डिज़ाइन पैटर्न को एकीकृत करना न्यूनतम अतिरिक्त प्रयास के साथ आता है। अन्यथा, आपको एक डिज़ाइन पैटर्न लागू करने के लिए अपने कोड को अनुकूलित करना होगा।
आप परिवर्तन की बहुत सारी करने के लिए एक डिजाइन पैटर्न लागू करने के लिए है, तो आपकी समस्या है नहीं डिजाइन पैटर्न - यह आपके कोड अखंड जा रहा है आधार, और कसकर युग्मित है। यह एक खराब / उप-डिज़ाइन डिज़ाइन समस्या है, न कि डिज़ाइन पैटर्न की समस्या।
जो मैं जानना चाहता हूं, वह यह है कि मुझे वास्तव में अमूर्तता और डिजाइन के अतिरिक्त स्तर बनाने में कितना प्रयास करना चाहिए, केवल अपने आवेदन को OO सिद्धांतों का पालन करने की अनुमति देने के लिए जैसे ढीली युग्मन, एक इंटरफ़ेस के लिए प्रोग्राम करना, आदि क्या यह वास्तव में लायक है। यह? इसमें मुझे कितना प्रयास करना चाहिए?
आपके प्रश्न (अस्थिर) धारणा बनाते हैं कि ढीले युग्मन का एकमात्र लाभ डिजाइन पैटर्न को आसानी से लागू करने की क्षमता है। यह नहीं।
ढीले युग्मन के लाभों में से हैं:
- रिफैक्टरिंग और रिडिजाइन लचीलेपन
- कम बर्बाद किया गया प्रयास
- testability
- कोड का पुन: उपयोग करने की संभावना बढ़ गई
- डिजाइन सादगी
- डिबगर में कम समय बिताया
... और कुछ अन्य जो अभी मेरे दिमाग में नहीं आते हैं।