रचना तब होती है जब एक वर्ग (संभवतः आंतरिक) वर्ग को तत्काल क्रिया करके कुछ कार्यक्षमता प्रदान करता है जो पहले से ही उस वर्ग को विरासत में देने के बजाय इस कार्यक्षमता को लागू करता है।
इसलिए, उदाहरण के लिए, यदि आपके पास एक वर्ग है जो एक जहाज को मॉडल करता है, और अब आपको बताया जा रहा है कि आपके जहाज को एक हेलीपैड की पेशकश करनी चाहिए, तो अपने जहाज को एक हेलीपैड से निकालना स्वाभाविक नहीं है, (डुह!) इसके बजाय, आपके पास होना चाहिए! आपके जहाज में एक हेलीपैड कक्षा होती है और इसे किसी Ship.getHelipad()
विधि के माध्यम से उजागर किया जाता है ।
पुराने वर्षों में (एक या एक दशक पहले) लोग विरासत को समग्र कार्यक्षमता के लिए एक त्वरित और आसान तरीके के रूप में देखते थे, इसलिए "हेलिपैड से विरासत में प्राप्त जहाज" के कई उदाहरण थे, जो निश्चित रूप से बहुत ही लचर थे।
लेकिन "एहसान रचना पर एहसान" हुकुम को ध्यान से कहा गया है कि यह स्पष्ट है कि यह केवल एक सुझाव है, एक नियम नहीं है। तानाशाह का लेखक इतना सावधान था कि वह कुछ भी कहने से बचना चाहता था जैसे "तुम कभी विरासत का उपयोग नहीं करते, केवल रचना करते हैं"। यह मूल रूप से सॉफ्टवेयर इंजीनियरिंग समुदाय के ध्यान में ला रहा है कि विरासत का अत्यधिक उपयोग किया गया है, जबकि कई मामलों में, रचना विरासत से अधिक स्पष्ट, सुरुचिपूर्ण और बनाए रखने योग्य डिजाइन का उत्पादन करती है।
तो, अनिवार्य रूप से, "इनहेरिटेंस पर एहसान रचना" तानाशाही का सुझाव है कि जब भी आप का सामना "विरासत या रचना करने के लिए?" प्रश्न, आपको यह सोचना चाहिए कि सबसे उपयुक्त रणनीति क्या है, और सबसे अधिक संभावना यह है कि सबसे उपयुक्त रणनीति रचना होगी, उत्तराधिकार नहीं।
लेकिन चूंकि यह एक नियम नहीं है, इसलिए आपको यह भी ध्यान रखना चाहिए कि ऐसे कई मामले हैं जिनमें विरासत स्वाभाविक है। यदि आप वहाँ रचना का उपयोग करते हैं जहाँ आपको विरासत का उपयोग करना चाहिए था, तो कई बुराइयाँ आपके कोड को नष्ट कर देंगी।
जहाज के उदाहरण पर वापस जाने के लिए, यदि आपके जहाज को एक के साथ बातचीत करने के लिए एक इंटरफ़ेस की पेशकश करने की आवश्यकता है FloatingMachine
, तो इसे एक अमूर्त FloatingMachine
वर्ग से प्राप्त करना अधिक स्वाभाविक है , जो संभवतः एक अन्य अमूर्त Machine
वर्ग से प्राप्त हो सकता है ।
यहाँ रचना बनाम उत्तराधिकार प्रश्न के उत्तर के लिए अंगूठे का नियम है:
क्या मेरी कक्षा में इंटरफ़ेस का "संबंध" है जिसे उसे उजागर करने की आवश्यकता है? यदि हाँ, तो विरासत का उपयोग करें। यदि नहीं, तो रचना का उपयोग करें।
एक जहाज "एक फ्लोटिंग मशीन, और एक फ्लोटिंग मशीन" एक "मशीन" है। तो, विरासत उन लोगों के लिए पूरी तरह से ठीक है। लेकिन एक जहाज, निश्चित रूप से, एक हेलीपैड नहीं है। इसलिए यह हेलिपैड की कार्यक्षमता को बेहतर ढंग से रचता है।