शायद आपने पिछले कुछ महीनों में लोगों को यह कहते हुए देखा होगा, लेकिन यह बहुत से लंबे समय तक अच्छे प्रोग्रामर के लिए जाना जाता है। मैं निश्चित रूप से यह कह रहा हूं कि लगभग एक दशक के लिए उपयुक्त है।
अवधारणा की बात यह है कि विरासत में एक बड़ा वैचारिक उपरि है। जब आप इनहेरिटेंस का उपयोग कर रहे होते हैं, तो हर एक मेथड कॉल में एक निहित प्रेषण होता है। यदि आपके पास गहरी विरासत वाले पेड़ हैं, या कई प्रेषण, या (और भी बदतर) दोनों हैं, तो यह पता लगाना कि किसी विशेष कॉल में विशेष विधि कहां भेजना है, एक शाही पीटीए बन सकता है। यह कोड को और अधिक जटिल के बारे में सही तर्क देता है, और यह डीबगिंग को कठिन बनाता है।
उदाहरण के लिए एक सरल उदाहरण देता हूं। मान लीजिए कि एक विरासत के पेड़ में गहरी, किसी ने एक विधि का नाम दिया foo
। फिर कोई और साथ आता है और foo
पेड़ के शीर्ष पर जोड़ता है , लेकिन कुछ अलग कर रहा है। (यह मामला कई विरासतों के साथ अधिक सामान्य है।) अब रूट क्लास में काम करने वाले व्यक्ति ने अस्पष्ट बाल वर्ग को तोड़ दिया है और शायद उसे इसका एहसास नहीं है। आपके पास यूनिट परीक्षणों के साथ 100% कवरेज हो सकता है और इस टूटना को नोटिस नहीं कर सकता क्योंकि शीर्ष पर मौजूद व्यक्ति चाइल्ड क्लास के परीक्षण के बारे में नहीं सोचेगा, और चाइल्ड क्लास के लिए परीक्षण शीर्ष पर बनाए गए नए तरीकों के परीक्षण के बारे में नहीं सोचते हैं। । (निश्चित रूप से इकाई परीक्षण लिखने के तरीके हैं जो इसे पकड़ लेंगे, लेकिन ऐसे भी मामले हैं जहां आप आसानी से परीक्षण नहीं लिख सकते हैं।)
इसके विपरीत जब आप रचना का उपयोग करते हैं, तो प्रत्येक कॉल पर यह आम तौर पर स्पष्ट होता है कि आप किस कॉल को भेज रहे हैं। (ठीक है, यदि आप नियंत्रण के व्युत्क्रम का उपयोग कर रहे हैं, उदाहरण के लिए निर्भरता इंजेक्शन के साथ, तो यह पता लगाना कि कॉल कहाँ जाता है, समस्याग्रस्त हो सकता है। लेकिन आमतौर पर यह पता लगाना अधिक सरल है।) यह इसके बारे में तर्क को आसान बनाता है। एक बोनस के रूप में, रचना एक दूसरे से अलग किए गए तरीकों में होती है। उपरोक्त उदाहरण वहाँ नहीं होना चाहिए क्योंकि चाइल्ड क्लास कुछ अस्पष्ट घटक को छोड़ देगा, और इस बारे में कभी कोई सवाल नहीं है कि क्या कॉल foo
अस्पष्ट घटक या मुख्य ऑब्जेक्ट के लिए करना था।
अब आप पूरी तरह से सही हैं कि विरासत और रचना दो अलग-अलग उपकरण हैं जो दो अलग-अलग प्रकार की चीजों की सेवा करते हैं। निश्चित उत्तराधिकार वैचारिक उपरि को वहन करता है, लेकिन जब यह काम का सही साधन है, तो यह कम वैचारिक उपरि का उपयोग नहीं करता है और इसका उपयोग न करने की कोशिश करता है। कोई भी नहीं जानता कि वे क्या कर रहे हैं, यह कहेंगे कि आपको विरासत का उपयोग कभी नहीं करना चाहिए। लेकिन यकीन मानिए यह सही काम है।
दुर्भाग्य से कई डेवलपर्स ऑब्जेक्ट ओरिएंटेड सॉफ़्टवेयर के बारे में सीखते हैं, वंशानुक्रम के बारे में सीखते हैं, और फिर जितनी बार संभव हो अपने नए कुल्हाड़ी का उपयोग करने के लिए बाहर जाते हैं। जिसका अर्थ है कि वे विरासत का उपयोग करने की कोशिश करते हैं जहां रचना सही उपकरण थी। उम्मीद है कि वे समय में बेहतर सीखेंगे, लेकिन अक्सर ऐसा कुछ हटाए गए अंगों के बाद तक नहीं होता है, आदि उन्हें सामने वाले को बताना कि यह एक बुरा विचार है सीखने की प्रक्रिया में तेजी लाने और चोटों को कम करने के लिए।