दो तरीके हैं जिनमें अमूर्त आधार वर्गों का उपयोग किया जाता है।
आप अपनी सार वस्तु को विशेषज्ञता दे रहे हैं, लेकिन सभी ग्राहक इसके आधार इंटरफेस के माध्यम से व्युत्पन्न वर्ग का उपयोग करेंगे।
आप अपने डिजाइन में वस्तुओं के भीतर दोहराव को समाप्त करने के लिए एक सार आधार वर्ग का उपयोग कर रहे हैं, और ग्राहक अपने स्वयं के इंटरफेस के माध्यम से ठोस कार्यान्वयन का उपयोग करते हैं।
1 के लिए समाधान - रणनीति पैटर्न
यदि आपके पास पहली स्थिति है, तो आपके पास वास्तव में सार वर्ग में आभासी विधियों द्वारा परिभाषित एक इंटरफ़ेस है जिसे आपके व्युत्पन्न वर्ग कार्यान्वित कर रहे हैं।
आपको इसे एक वास्तविक इंटरफ़ेस बनाने पर विचार करना चाहिए, अपने अमूर्त वर्ग को ठोस बनाने के लिए, और इसके निर्माण में इस इंटरफ़ेस का एक उदाहरण लेना चाहिए। आपकी व्युत्पन्न कक्षाएं तब इस नए इंटरफ़ेस का कार्यान्वयन बन जाती हैं।
इसका मतलब है कि अब आप नए इंटरफ़ेस के नकली उदाहरण और अब के सार्वजनिक इंटरफ़ेस के माध्यम से प्रत्येक नए कार्यान्वयन का उपयोग करके अपने पहले के सार वर्ग का परीक्षण कर सकते हैं। सब कुछ सरल और परीक्षण योग्य है।
2 के लिए समाधान
यदि आपके पास दूसरी स्थिति है, तो आपका अमूर्त वर्ग सहायक वर्ग के रूप में काम कर रहा है।
इसमें शामिल कार्यक्षमता पर एक नज़र डालें। देखें कि क्या इसमें से कोई भी उन वस्तुओं पर धकेल दिया जा सकता है जिन्हें इस दोहराव को कम करने के लिए हेरफेर किया जा रहा है। यदि आपके पास अभी भी कुछ बचा है, तो इसे एक सहायक वर्ग बनाने के लिए देखें जो आपका ठोस कार्यान्वयन उनके निर्माता में लेता है और उनके आधार वर्ग को निकालता है।
यह फिर से ठोस वर्गों की ओर जाता है जो सरल और आसानी से परीक्षण योग्य हैं।
यथाविधि
जटिल वस्तुओं के एक सरल नेटवर्क पर सरल वस्तुओं के अनुकूल जटिल नेटवर्क।
एक्स्टेंसिबल टेस्टेबल कोड की कुंजी छोटे बिल्डिंग ब्लॉक और स्वतंत्र वायरिंग है।
अपडेट किया गया: दोनों के मिश्रण को कैसे संभालें?
इन दोनों भूमिकाओं के आधार वर्ग का प्रदर्शन संभव है ... अर्थात: इसका सार्वजनिक इंटरफ़ेस है, और सहायक विधियों की सुरक्षा की है। यदि यह मामला है, तो आप सहायक विधियों को एक वर्ग (परिदृश्य 2) में बदल सकते हैं और वंशानुक्रम के पेड़ को रणनीति पैटर्न में बदल सकते हैं।
यदि आपको लगता है कि आपके पास कुछ विधियां हैं, तो आपके आधार वर्ग के उपकरण सीधे और अन्य आभासी हैं, तो आप अभी भी वंशानुक्रम के पेड़ को एक रणनीति पैटर्न में बदल सकते हैं, लेकिन मैं इसे एक अच्छे संकेतक के रूप में भी ले जाऊंगा कि जिम्मेदारियों को सही ढंग से संरेखित नहीं किया गया है, और हो सकता है रिफैक्टिंग की जरूरत है।
अपडेट 2: स्टेपिंग स्टोन के रूप में एब्सट्रैक्ट क्लासेस (2014/06/12)
मेरे पास दूसरे दिन एक स्थिति थी जहां मैंने सार का उपयोग किया, इसलिए मैं यह जानना चाहूंगा कि क्यों।
हमारे पास हमारी कॉन्फ़िगरेशन फ़ाइलों के लिए एक मानक प्रारूप है। इस विशेष उपकरण में उस प्रारूप में सभी 3 विन्यास फाइल हैं। मैं प्रत्येक सेटिंग फ़ाइल के लिए एक दृढ़ता से टाइप की गई कक्षा चाहता था, ताकि निर्भरता इंजेक्शन के माध्यम से, एक वर्ग उस सेटिंग्स के बारे में पूछ सके, जिसकी वह परवाह करता था।
मैंने इसे अमूर्त आधार वर्ग के रूप में लागू किया है जो जानता है कि सेटिंग्स फ़ाइलों को पार्स कैसे किया जाता है और व्युत्पन्न वर्ग उन समान विधियों को उजागर करते हैं, लेकिन सेटिंग्स फ़ाइल के स्थान को समझाया।
मैं एक "SettingsFileParser" लिख सकता था कि 3 कक्षाएं लिपटे, और फिर डेटा एक्सेस विधियों को उजागर करने के लिए बेस क्लास के माध्यम से प्रत्यायोजित किया गया। मैंने अभी तक ऐसा नहीं करने का फैसला किया क्योंकि इससे 3 से अधिक वर्गों का प्रतिनिधित्व होगा, जिसमें कुछ भी नहीं था।
हालाँकि ... जैसा कि यह कोड विकसित होता है और इनमें से प्रत्येक सेटिंग वर्ग के उपभोक्ता स्पष्ट हो जाते हैं। प्रत्येक सेटिंग्स उपयोगकर्ता कुछ सेटिंग्स के लिए पूछेंगे और उन्हें किसी तरह से रूपांतरित करेंगे (जैसा कि सेटिंग्स पाठ हैं वे उन्हें संख्याओं आदि में परिवर्तित करने की वस्तुओं में लपेट सकते हैं)। जैसा कि ऐसा होता है, मैं इस तर्क को डेटा हेरफेर विधियों में निकालना शुरू करूंगा और उन्हें जोरदार टाइप की गई सेटिंग्स कक्षाओं में वापस धकेल दूंगा। यह सेटिंग्स के प्रत्येक सेट के लिए एक उच्च स्तरीय इंटरफ़ेस को जन्म देगा, जो कि अंततः 'सेटिंग' के साथ काम कर रहा है।
इस बिंदु पर दृढ़ता से टाइप की गई सेटिंग्स कक्षाएं अब "गेट्टर" विधियों की आवश्यकता नहीं होंगी जो अंतर्निहित 'सेटिंग' कार्यान्वयन को उजागर करती हैं।
उस बिंदु पर मैं अब उनके सार्वजनिक इंटरफ़ेस को सेटिंग्स एक्सेसर विधियों में शामिल नहीं करना चाहूंगा; इसलिए मैं इस वर्ग को इसे से प्राप्त करने के बजाय एक सेटिंग पार्सर वर्ग को इनकैप्सुलेट करने के लिए बदल दूंगा।
अमूर्त वर्ग इसलिए है: मेरे लिए इस समय प्रतिनिधिमंडल कोड से बचने का एक तरीका है, और कोड में एक मार्कर मुझे डिजाइन को बाद में बदलने के लिए याद दिलाने के लिए है। मुझे यह कभी नहीं मिल सकता है, इसलिए यह एक अच्छा समय हो सकता है ... केवल कोड ही बता सकता है।
मुझे यह किसी भी नियम के साथ सही लगता है ... जैसे "कोई स्थिर तरीके" या "कोई निजी तरीके नहीं"। वे कोड में एक गंध का संकेत देते हैं ... और यह अच्छा है। यह आपको उस अमूर्त की तलाश में रखता है जिसे आपने याद किया है ... और आपको अपने ग्राहक को इस समय में मूल्य प्रदान करने में सक्षम बनाता है।
मैं इस तरह के परिदृश्य को परिभाषित करने वाले नियमों की कल्पना करता हूं, जहां बनाए रखने योग्य कोड घाटियों में रहते हैं। जैसा कि आप नया व्यवहार जोड़ते हैं, यह आपके कोड पर बारिश लैंडिंग की तरह है। शुरू में आप इसे कहीं भी रख देते हैं .. फिर आप रिफ्लेक्टर को अच्छी डिज़ाइन की ताकतों के इर्द-गिर्द तब तक के लिए धक्का देने की अनुमति देते हैं जब तक कि यह सब घाटियों में खत्म न हो जाए।