हम सामान्यीकरण पर रचना का पक्ष लेना कैसे जानते हैं हमेशा सही विकल्प होता है?


9

कोई वस्तु भौतिक रूप से मौजूद है या नहीं, हम इसे अलग-अलग तरीकों से चुन सकते हैं। हम कई मामलों में सामान्य रूप से सामान्यीकरण या रचना का उपयोग कर सकते हैं। हालाँकि, "सामान्यीकरण पर उपहास रचना [sic]" का गोएफ सिद्धांत हमें रचना का उपयोग करने के लिए मार्गदर्शन करता है। इसलिए, जब हम मॉडल करते हैं, उदाहरण के लिए, एक पंक्ति तो हम एक ऐसा वर्ग बनाते हैं जिसमें दो सदस्य पॉइंटए और टाइप प्वाइंट (रचना) के पॉइंटबी होते हैं, जो कि विस्तार बिंदु (सामान्यीकरण) के बजाय। यह सिर्फ एक सरलीकृत उदाहरण है कि हम कैसे मनमाने ढंग से रचना या मॉडल के लिए विरासत का चयन कर सकते हैं, इसके बावजूद कि ऑब्जेक्ट आमतौर पर बहुत अधिक जटिल होते हैं।

हमें कैसे पता चलेगा कि यह सही विकल्प है? यह कम से कम मायने रखता है क्योंकि गलत होने पर इसे करने के लिए एक टन रिफ्लैक्टरिंग हो सकती है?


9
आपका उदाहरण वास्तव में काम नहीं करता है क्योंकि आप यह नहीं कह सकते हैं कि एक रेखा एक बिंदु है, और इसलिए यह Liskov प्रतिस्थापन सिद्धांत को विफल करता है और उत्तराधिकार उचित नहीं है।
डीन हार्डिंग 16

@ डीन: जैसा कि आप शायद जानते हैं, उदाहरण के लिए केंद्रीय बिंदु नहीं है। रिकॉर्ड के लिए, एक रेखा को दो बिंदुओं के माध्यम से परिभाषित समीकरण के रूप में दर्शाया जा सकता है।
कार्नेकोड


1
@Songo: ऐसा लगता है कि आप इस बिंदु से पूरी तरह से चूक गए हैं।
कार्नेकोड

सामान्यीकरण के बजाय विशेषज्ञता का विस्तार नहीं है?
ट्यूलेंस कोरडोवा

जवाबों:


17

यह हमेशा सही विकल्प नहीं है। यह ज्यादातर मामलों में अनुकूल है । जब एक समग्र मॉडल को परिवर्तन या विस्तार की आवश्यकता होती है, तो यह काफी अधिक प्रतिरोधी होता है क्योंकि आप अनजाने में अन्य वर्गों को प्रभावित करने के डर के बिना रचना को बदल सकते हैं।

हम इसके बारे में कैसे जानते हैं? अनुभव से, और दूसरों के अनुभव से।

मैंने कई स्थितियों को देखा है जहां एक विशाल वर्ग पदानुक्रम एक साधारण अवधारणा के रूप में शुरू हुआ है, और यह वह जगह है जहां आपका प्रमुख रीफैक्टरिंग आवश्यक हो जाता है। इस बीच मैंने ऐसी स्थिति कभी नहीं देखी है जहां एक संरचना संरचना को विरासत में रिफैक्टिंग की आवश्यकता होती है।

लेकिन मेरे वास्तविक सबूत पर्याप्त नहीं होने चाहिए। बस इंटरनेट के आसपास देखो और लोगों की एक अच्छी संख्या में एक ही अनुभव किया है।


अच्छा लग रहा है; एक उत्थान ले लो।
कार्नेकोड

+1 के लिए "मैंने ऐसी स्थिति कभी नहीं देखी है जहां एक संरचना संरचना को विरासत में रिफैक्टिंग की आवश्यकता होती है।"
काज़ार्क

7

यदि आप "वंशानुक्रम पर अनुकूल रचना" से परे अंगूठे का एक मजबूत नियम चाहते हैं तो मैं कुछ इस तरह का सुझाव दे सकता हूं:

किसी वस्तु को विशेषज्ञता देने के दो तरीकों में से - वंशानुक्रम और संरचना - आपको विरासत का उपयोग केवल तभी करना चाहिए, जब आपको अपनी विशेषज्ञता वाले आधार वर्ग के लिए बहुरूपिक (प्रतिस्थापन योग्य) होने के लिए अपनी वस्तु की आवश्यकता हो।

हालाँकि, अंगूठे के सभी नियमों की तरह, एक बार जब आप नियम को समझ जाते हैं - तब आप नियम तोड़ने के लिए स्वतंत्र होते हैं :)


0

मैं यह नहीं देखता कि रचना और सामान्यीकरण कैसे विकल्प हैं और उद्धरण खोजने में विफल रहे ।
रचना और विरासत (विशेषज्ञता प्राप्त करने के लिए) हैं, और यह तर्क दिया जा सकता है, कि अमूर्त और सामान्यीकरण (प्रतिरूपता प्राप्त करने के लिए) हैं।

आप जो चाहते हैं वह आपका डिजाइन सरल और प्रशंसनीय है, जो दो गुण हैं जो स्वाभाविक रूप से काफी आसानी से मापा जाता है।
आपके मामले में, इसे विस्तारित करने के बजाय दो बिंदुओं की एक पंक्ति लिखना अधिक प्रशंसनीय लगता है, क्योंकि आप स्वाभाविक रूप से एक बिंदु की अवधारणा का विस्तार करने के बजाय दो बिंदुओं द्वारा एक रेखा को परिभाषित करेंगे।


क्या यह अधिक स्वाभाविक है? एक पंक्ति दो बिंदुओं से अधिक नहीं है क्योंकि यह एकल बिंदु विस्तारित है?
कार्नेकोड 12

2
मैंने कभी भी एक लाइन परिभाषा नहीं देखी है जिसमें यह तथ्य शामिल नहीं है कि यह 2+ अंकों से बना है। यहां तक ​​कि एक पंक्ति के समीकरण का उपयोग करते हुए यदि आपके संख्याओं के डोमेन में केवल 1 x मान है तो यह एक बिंदु है, एक पंक्ति नहीं।
ऋग्वेद

0

अनुकूल तब होता है जब दोनों उम्मीदवार योग्य होते हैं। प्रश्न में बताई गई समस्या इस खाते पर विफल हो जाती है, क्योंकि इसमें केवल एक रचना विकल्प होता है।

"रचना सामान्यीकरण का भी उपयोग कर सकती है"। क्या यह कथन हमारे लिए मायने रखता है? यदि नहीं, तो हम अभी तक 'पक्ष' नियम को समझने के लिए तैयार नहीं हैं।

हम क्यों एहसान कर रहे हैं कि रचना सामान्यीकरण की तुलना में अधिक विस्तार / flexiblity possiblities प्रदान करता है। यह विस्तार / फ्लेक्सिबिलिटी ज्यादातर रनटाइम / डायनेमिक लचीलेपन (जो इंटरफेस और कंपोज़िशन के संयोजन से हासिल की जाती है) को संदर्भित करता है।

लाभ तुरंत दिखाई नहीं देता है। लाभ को देखने के लिए आपको अगले अप्रत्याशित परिवर्तन अनुरोध की प्रतीक्षा करनी होगी। इसलिए ज्यादातर मामलों में जो सामान्यीकरण से चिपके रहते हैं, वे उन लोगों की तुलना में विफल हो जाते हैं जिन्होंने रचना को अपनाया है (बाद में उल्लेखित एक स्पष्ट मामले को छोड़कर)। इसलिए नियम। सीखने के दृष्टिकोण से यदि आप एक निर्भरता इंजेक्शन को सफलतापूर्वक लागू कर सकते हैं तो आपको पता होना चाहिए कि किस पर पक्ष लेना है और कब। नियम आपको निर्णय लेने में मदद करता है जब आप सुनिश्चित नहीं होते हैं कि किसे चुनना है। फिर से आपको किसी एक का पक्ष लेने के लिए पहली जगह में दोनों विकल्प देखने में सक्षम होना चाहिए।

सारांश: संरचना: युग्मन को केवल कुछ छोटी चीज़ों के साथ घटाया जाता है जिसे आप किसी बड़ी चीज़ में प्लग करते हैं, और बड़ी वस्तु बस छोटी वस्तु को वापस बुलाती है। जनरेशन: एक तीसरी पार्टी एपीआई के दृष्टिकोण से यह परिभाषित करना कि एक विधि को ओवरराइड किया जा सकता है यह परिभाषित करने की तुलना में एक मजबूत प्रतिबद्धता है कि एक विधि को बुलाया जा सकता है (निश्चित रूप से सामान्यीकरण के लिए जीत)। और यह कभी मत भूलो कि रचना के साथ आप सामान्य वर्ग के बजाय सामान्यीकरण का भी उपयोग कर रहे हैं। लेकिन पूरा श्रेय दुर्भाग्य से रचना को जाता है।


-4

आज मैंने लगभग 300 एलओसी लिखे। और मैं किसी भी सिद्धांत को याद नहीं कर सकता हूं जिसका मैं उल्लंघन कर सकता था और उल्लंघन नहीं किया था। रिफैक्टरिंग से मेरी आत्मा बच जाएगी, मुझे उम्मीद है।

यदि अमूर्त को 3 डी पार्टी एपी द्वारा निर्देशित किया जाता है - आमतौर पर विरासत का उपयोग करना सही होता है। घरेलू डिजाइन इकाई में या तो सार होना चाहिए, या सील होना चाहिए। सार इकाई में संभावित रूप से लगभग 3 उत्तराधिकारी होने चाहिए। मुझे एक-वर्चुअल-विधि एक्सटेंशन पॉइंट पसंद नहीं है। उपरोक्त सभी मेरे स्वाद के बारे में है। मैं इंटरफ़ेस एब्स्ट्रैक्शन के बारे में नहीं बोल रहा हूं, जो कि संपूर्ण अलग-अलग कहानी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.