मुझे वंशानुक्रम पर रचना क्यों पसंद करनी चाहिए?


109

मैं हमेशा यह पढ़ता हूं कि रचना को विरासत से अधिक पसंद किया जाना है। उदाहरण के लिए, प्रकार के विपरीत एक ब्लॉग पोस्ट , वंशानुक्रम पर रचना का उपयोग करने की वकालत करता है, लेकिन मैं यह नहीं देख सकता कि बहुरूपता कैसे प्राप्त होती है।

लेकिन मुझे इस बात का अहसास है कि जब लोग कहते हैं कि रचना पसंद करते हैं, तो उनका मतलब वास्तव में रचना और इंटरफ़ेस कार्यान्वयन का संयोजन है। आप विरासत के बिना बहुरूपता कैसे प्राप्त करेंगे?

यहां एक ठोस उदाहरण है जहां मैं विरासत का उपयोग करता हूं। रचना का उपयोग करने के लिए इसे कैसे बदला जाएगा, और मुझे क्या मिलेगा?

Class Shape
{
    string name;
  public:
    void getName();
    virtual void draw()=0;
}

Class Circle: public Shape
{
    void draw(/*draw circle*/);
}

57
नहीं है, जब लोग कहते हैं रचना वे वास्तव में मतलब है पसंद करते हैं पसंद करते हैं रचना, नहीं कभी नहीं कभी कभी विरासत का उपयोग । आपका पूरा प्रश्न एक दोषपूर्ण आधार पर आधारित है। उचित होने पर इनहेरिटेंस का उपयोग करें।
छिपकली


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

2
आप रचना का उपयोग करना चाहते हैं क्योंकि एक वर्ग सिर्फ दो त्रिकोणों की रचना है, वास्तव में मुझे लगता है कि दीर्घवृत्त के अलावा सभी आकृतियाँ केवल त्रिकोण की रचनाएं हैं। बहुरूपता संविदात्मक दायित्वों और विरासत से हटाए गए 100% के बारे में है। जब त्रिभुज को विषमता का एक समूह मिलता है, क्योंकि कोई इसे पिरामिड बनाने में सक्षम बनाना चाहता है, यदि आप त्रिभुज से विरासत में प्राप्त करते हैं, तो आप उस सब को प्राप्त करने जा रहे हैं, भले ही आप कभी भी अपने षट्भुज से 3 डी पिरामिड उत्पन्न नहीं करने जा रहे हों। ।
जिमी होफा

2
@BilltheLizard मुझे लगता है कि बहुत से लोग जो कहते हैं कि यह वास्तव में कभी भी कभी विरासत का उपयोग करने का मतलब नहीं है, लेकिन वे गलत हैं।
इम्बिसिस

जवाबों:


51

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

लेकिन उन वस्तुओं के बारे में जो समान नहीं हैं। एक कार और एक ग्रह की मॉडलिंग करना बहुत अलग होगा, और फिर भी दोनों हटो () व्यवहार को लागू करना चाह सकते हैं।

वास्तव में, आपने मूल रूप से अपने स्वयं के प्रश्न का उत्तर दिया था जब आपने कहा था "But I have a feeling that when people say prefer composition, they really mean prefer a combination of composition and interface implementation."। सामान्य व्यवहार इंटरफेस और एक व्यवहार समग्र के माध्यम से प्रदान किया जा सकता है।

जैसा कि बेहतर है, उत्तर कुछ व्यक्तिपरक है, और वास्तव में नीचे आता है कि आप अपने सिस्टम को कैसे काम करना चाहते हैं, क्या संदर्भ और वास्तु दोनों को समझ में आता है और परीक्षण और बनाए रखना कितना आसान होगा।


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

1
जो एक ग्रह और एक कार पर चाल () को बुलाएगा और इसे उसी पर विचार करेगा! यहां सवाल यह है कि उन्हें किस संदर्भ में स्थानांतरित करने में सक्षम होना चाहिए? यदि वे दोनों एक साधारण 2 डी गेम में 2 डी ऑब्जेक्ट हैं, तो वे इस कदम को विरासत में प्राप्त कर सकते हैं, अगर वे एक बड़े पैमाने पर डेटा सिमुलेशन में ऑब्जेक्ट थे तो हो सकता है कि उन्हें एक ही आधार से विरासत में लेने के लिए बहुत अधिक समझ में न आए और परिणामस्वरूप आपको एक का उपयोग करना होगा इंटरफेस
NikkyD

2
@SamusArin यह पता चलता ऊपर हर जगह है, और भाषाओं जो इंटरफेस का समर्थन में पूरी तरह से सामान्य माना जाता है। आपका क्या मतलब है, "एक भाषा की अभिव्यक्ति का शोषण"? यह वह जगह है जिसके लिए इंटरफेस हैं
एंड्रेस एफ।

@AndresF। मैं सिर्फ "ऑब्जेक्ट ओरिएंटेड एनालिसिस एंड डिज़ाइन विथ ऍप्लिकेशन्स" के माध्यम से पढ़ते हुए एक उदाहरण में "इंटरफ़ेस के माध्यम से बहुरूपता" के पार आया, जिसने ऑब्जर्वर पैटर्न का प्रदर्शन किया। मुझे तब अपने उत्तर का एहसास हुआ।
शाम

@AndresF। मुझे लगता है कि मेरी दृष्टि इस बारे में थोड़ी अंधी थी कि मैंने अपने अंतिम (पहले) प्रोजेक्ट में बहुरूपता का उपयोग कैसे किया। मेरे पास 5 रिकॉर्ड प्रकार थे जो सभी एक ही आधार से प्राप्त हुए थे। वैसे भी ज्ञानोदय के लिए धन्यवाद।
सैमिस

79

रचना का जिक्र सिर्फ बहुरूपता के बारे में नहीं है। यद्यपि यह इसका हिस्सा है, और आप सही हैं (कम से कम नाममात्र की भाषाओं में) जो लोग वास्तव में इसका मतलब है "रचना और इंटरफ़ेस कार्यान्वयन का संयोजन पसंद करते हैं।" लेकिन, रचना को पसंद करने के कारण (कई परिस्थितियों में) गहरा हैं।

बहुरूपता एक बात है कई तरीकों का व्यवहार करना। इसलिए, जेनेरिक / टेम्प्लेट एक "बहुरूपी" विशेषता हैं, जहाँ तक वे एक ही कोड को अपने व्यवहार को विभिन्न प्रकारों के लिए अलग-अलग करने की अनुमति देते हैं। वास्तव में, इस प्रकार का बहुरूपता वास्तव में सबसे अच्छा व्यवहार है और आमतौर पर पैरामीट्रिक बहुरूपता के रूप में संदर्भित किया जाता है क्योंकि भिन्नता को एक पैरामीटर द्वारा परिभाषित किया गया है।

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

एक तीसरे प्रकार का बहुरूपता उप-प्रकार बहुरूपता है । यहां एक दिए गए प्रकार पर परिभाषित एक प्रक्रिया, उस प्रकार के "उपप्रकार" के पूरे परिवार पर भी काम कर सकती है। जब आप एक इंटरफ़ेस लागू करते हैं या एक वर्ग का विस्तार करते हैं तो आप आमतौर पर एक उपप्रकार बनाने के लिए अपने इरादे की घोषणा कर रहे होते हैं। सही उपप्रकार Liskov के प्रतिस्थापन सिद्धांत द्वारा नियंत्रित होते हैं, जो कहता है कि यदि आप एक सुपरटेप में सभी वस्तुओं के बारे में कुछ साबित कर सकते हैं, तो आप इसे सबटाइप में सभी उदाहरणों के बारे में साबित कर सकते हैं। हालांकि, जीवन खतरनाक हो जाता है, क्योंकि सी ++ और जावा जैसी भाषाओं में, लोग आम तौर पर बिना लाइसेंस के होते हैं, और अक्सर उन वर्गों के बारे में अनिर्धारित धारणाएं होती हैं जो उनके उपवर्गों के बारे में सच हो सकती हैं या नहीं। यही है, कोड के रूप में लिखा है कि अगर यह वास्तव में है की तुलना में अधिक साबित होता है, जो मुद्दों की एक पूरी मेजबान पैदा करता है जब आप लापरवाही से सबटाइप करते हैं।

विरासत वास्तव में बहुरूपता से स्वतंत्र है। कुछ चीज़ "T" को देखते हुए, जिसका खुद के लिए एक संदर्भ है, वंशानुक्रम तब होता है जब आप "T" के स्थान पर "T" के संदर्भ में "S" के संदर्भ में स्वयं से एक नई चीज़ बनाते हैं। यह परिभाषा जानबूझकर अस्पष्ट है, क्योंकि वंशानुक्रम कई स्थितियों में हो सकता है, लेकिन सबसे आम एक ऐसी वस्तु को उपवर्गित कर रहा है, जिसमें thisपॉइंटर के साथ वर्चुअल फ़ंक्शन द्वारा बुलाया सूचक को प्रतिस्थापित करने का प्रभाव thisहोता है।

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

interface UsefulThingsInterface {
    void doThings();
    void doMoreThings();
}

...

class WayOfDoingUsefulThings implements UsefulThingsInterface{
     private foo stuff;
     public final int getStuff();
     void doThings(){
       //modifies stuff, such that ...
       ...
     }
     ...
     void doMoreThings(){
       //ignores stuff
       ...
     }
 }

आपको लगता है कि यह प्यारा है, और आपके पास "चीजें" करने का अपना तरीका है, लेकिन आप "अधिकता" करने की क्षमता हासिल करने के लिए विरासत का उपयोग करते हैं,

class MyUsefulThings extends WayOfDoingUsefulThings{
     void doThings {
        //my way
     }
}

और सब ठीक है और अच्छा है। WayOfDoingUsefulThingsइस तरह से डिज़ाइन किया गया था कि एक विधि को प्रतिस्थापित करने से किसी अन्य के शब्दार्थ में बदलाव नहीं होता है ... प्रतीक्षा के अलावा, नहीं, यह नहीं था। यह जैसा दिखता था, वैसा ही हुआ, लेकिन doThingsबदले हुए परिवर्तनशील अवस्था को बदल दिया। इसलिए, भले ही इसने किसी भी ओवरराइड-सक्षम फ़ंक्शन को कॉल न किया हो,

 void dealWithStuff(WayOfDoingUsefulThings bar){
     bar.doThings()
     use(bar.getStuff());
 }

जब आप इसे पास करते हैं तो अब यह उम्मीद से अलग कुछ करता है MyUsefulThings। इससे भी बुरा यह है कि आप यह भी नहीं जानते होंगे कि WayOfDoingUsefulThingsवे वादे किए गए थे। हो सकता है कि dealWithStuffके रूप में ही पुस्तकालय से आता है WayOfDoingUsefulThingsऔर getStuff()यहां तक कि पुस्तकालय द्वारा निर्यात नहीं कर रहा है (के बारे में सोच दोस्त कक्षाएं C ++ में)। इससे भी बदतर अभी भी, आप इसे साकार करने के बिना भाषा के स्थिर चेकों को हरा दिया है: dealWithStuffएक ले लिया WayOfDoingUsefulThingsसिर्फ यकीन है कि यह एक के लिए होता है बनाने के लिए getStuff()समारोह है कि एक निश्चित तरीके से व्यवहार किया।

रचना का उपयोग करना

class MyUsefulThings implements UsefulThingsInterface{
     private way = new WayOfDoingUsefulThings()
     void doThings() {
        //my way
     }
     void doMoreThings() {
        this.way.doMoreThings();
     }
}

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

एक बेहतर विश्व भाषाओं में स्वचालित रूप से एक delegationकीवर्ड के साथ बॉयलरप्लेट डाला जाएगा । अधिकांश नहीं, इसलिए एक नकारात्मक पक्ष बड़ी कक्षाएं हैं। यद्यपि, आप अपने आईडीई को आपके लिए प्रतिनिधि प्रतिनिधि लिखने के लिए प्राप्त कर सकते हैं।

अब, जीवन केवल बहुरूपता के बारे में नहीं है। आपको हर समय सबटाइप करने की आवश्यकता नहीं हो सकती है। बहुरूपता का लक्ष्य आमतौर पर कोड का पुन: उपयोग होता है लेकिन यह उस लक्ष्य को प्राप्त करने का एकमात्र तरीका नहीं है। अक्सर समय, कार्यक्षमता को प्रबंधित करने के तरीके के रूप में, उप-प्रकार के बहुरूपता के बिना रचना का उपयोग करना समझ में आता है।

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

  1. इसके लिए प्रतिबंध विरासत या डिजाइन
  2. रचना को प्राथमिकता दें

ऊपर दिए गए कारणों के लिए एक अच्छा मार्गदर्शक हैं, और किसी भी पर्याप्त लागत को लाइक नहीं करते हैं।


4
अच्छा जवाब। मैं इसे संक्षेप में बताऊंगा कि विरासत के साथ कोड के पुन: उपयोग को प्राप्त करने का प्रयास सादा गलत मार्ग है। वंशानुक्रम बहुत मजबूत बाधा है ("शक्ति" जोड़ने से गलत समानता है!) और विरासत में मिली कक्षाओं के बीच मजबूत निर्भरता पैदा करता है। बहुत अधिक निर्भरताएं = बुरा कोड :) तो वंशानुक्रम (उर्फ "जैसा व्यवहार करता है") आम तौर पर एकीकृत इंटरफेस (विरासत में मिली कक्षाओं की जटिलता को छिपाना) के लिए चमकता है, किसी भी चीज के लिए दो बार सोचते हैं या रचना का उपयोग करते हैं ...
MaR

2
यह एक अच्छा जवाब है। +1। कम से कम मेरी नजर में, ऐसा लगता है कि अतिरिक्त पेचीदगी के लिए पर्याप्त लागत हो सकती है, और इसने मुझे व्यक्तिगत रूप से थोड़ा संकोच करने के लिए पसंद करने वाली रचना से बाहर एक बड़ा सौदा करने के लिए बनाया है। खासकर जब आप इंटरफेस, कंपोज़िशन, और DI (मुझे पता है कि यह अन्य चीजों को जोड़ रहा है) के माध्यम से बहुत सारे यूनिट टेस्टिंग-फ्रेंडली कोड बनाने की कोशिश कर रहा है, तो किसी को बहुत अलग दिखने के लिए कई अलग-अलग फाइलों से गुजरना बहुत आसान लगता है कुछ विवरण। इसका उल्लेख अधिक बार क्यों नहीं किया गया है, तब भी जब केवल वंशानुक्रम डिजाइन सिद्धांत पर रचना से निपटना हो?
Panzercrisis

27

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

एक विशिष्ट उदाहरण खेल विकास की दुनिया से आता है। मान लीजिए कि आपके पास अपने सभी खेल संस्थाओं के लिए एक आधार वर्ग है - खिलाड़ी का अंतरिक्ष यान, राक्षस, गोलियां, आदि; प्रत्येक इकाई प्रकार का अपना उपवर्ग है। विरासत दृष्टिकोण में कुछ बहुरूपी तरीकों का उपयोग होता है, उदाहरण के लिए update_controls(), update_physics(), draw(), आदि, और उन्हें एक उपवर्ग के लिए लागू करते हैं। हालाँकि, इसका मतलब है कि आप असंबंधित कार्यक्षमता को युग्मित कर रहे हैं: यह अप्रासंगिक है कि कोई वस्तु इसे स्थानांतरित करने के लिए कैसा दिखता है, और आपको इसे खींचने के लिए इसके AI के बारे में कुछ भी जानने की आवश्यकता नहीं है। इसके बजाय संरचनागत दृष्टिकोण कई आधार वर्गों (या इंटरफेस) को परिभाषित करता है, उदाहरण के लिए EntityBrain(उपवर्ग एआई या खिलाड़ी इनपुट को लागू करता है), EntityPhysics(उपवर्ग आंदोलन भौतिकी को लागू करता है) और EntityPainter(उपवर्ग ड्राइंग का ख्याल रखता है), और एक गैर-बहुरूपता वर्ग।Entityप्रत्येक का एक उदाहरण है। इस तरह, आप किसी भी भौतिकी मॉडल और किसी AI के साथ किसी भी रूप को जोड़ सकते हैं, और चूंकि आप उन्हें अलग रखते हैं, इसलिए आपका कोड बहुत अधिक क्लीनर होगा। इसके अलावा, "मुझे एक राक्षस चाहिए जो स्तर 1 में गुब्बारे के राक्षस की तरह दिखता है, लेकिन स्तर 15 में पागल जोकर की तरह व्यवहार करता है" चले जाओ: आप बस उपयुक्त घटकों को लेते हैं और उन्हें एक साथ गोंद करते हैं।

ध्यान दें कि संरचनागत दृष्टिकोण अभी भी प्रत्येक घटक के भीतर विरासत का उपयोग करता है; हालांकि आदर्श रूप से आप यहां केवल इंटरफेस और उनके कार्यान्वयन का उपयोग करेंगे।

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


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

मुझे पता है कि आपका उत्तर बहुत पुराना है, लेकिन मैंने वही किया जो आपने मेरे खेल में बताया था और अब विरासत के दृष्टिकोण पर रचना के लिए जा रहे हैं।
स्नेहा

"मुझे एक राक्षस चाहिए जो दिखता है ..." यह कैसे समझ में आता है? एक इंटरफ़ेस कोई कार्यान्वयन नहीं देता है, आपको एक या दूसरे तरीके से लुक और व्यवहार कोड को कॉपी करना होगा
NikkyD

1
@NikkyD आप ले जाते हैं MonsterVisuals balloonVisualsऔर MonsterBehaviour crazyClownBehaviourएक ए Monster(balloonVisuals, crazyClownBehaviour), इंस्टेंस Monster(balloonVisuals, balloonBehaviour)और Monster(crazyClownVisuals, crazyClownBehaviour)लेवल 1 और लेवल 15 पर
इंस्टेंट

13

आपके द्वारा दिया गया उदाहरण वह है जहां विरासत स्वाभाविक पसंद है। मुझे नहीं लगता कि कोई भी दावा करेगा कि रचना हमेशा वंशानुक्रम की तुलना में एक बेहतर विकल्प है - यह सिर्फ एक दिशानिर्देश है जिसका अर्थ है कि कई अपेक्षाकृत सरल वस्तुओं को इकट्ठा करना बेहतर होता है क्योंकि बहुत अधिक विशिष्ट वस्तुओं का निर्माण होता है।

वंशानुक्रम विरासत के बजाय रचना का उपयोग करने का एक उदाहरण है। प्रतिनिधिमंडल आपको उपवर्ग के बिना वर्ग के व्यवहार को संशोधित करने देता है। एक वर्ग पर विचार करें जो नेटवर्क कनेक्शन प्रदान करता है, नेटस्ट्रीम। एक सामान्य नेटवर्क प्रोटोकॉल को लागू करने के लिए NetStream को उप-वर्ग में रखना स्वाभाविक हो सकता है, इसलिए आप FTPStream और HTTPStream के साथ आ सकते हैं। UpdateMyWebServiceHTTPStream, एक ही उद्देश्य के लिए एक बहुत विशिष्ट HTTPStream उपवर्ग बनाने के बजाय, यह अक्सर एक प्रतिनिधि के साथ HTTPStream के एक पुराने पुराने उदाहरण का उपयोग करना बेहतर होता है जो उस ऑब्जेक्ट से प्राप्त डेटा के साथ क्या करना है। एक कारण यह बेहतर है कि यह उन वर्गों के प्रसार को टालता है जिन्हें बनाए रखा जाना है, लेकिन जिसका आप कभी भी पुन: उपयोग नहीं कर पाएंगे।


11

आप सॉफ्टवेयर विकास प्रवचन में इस चक्र को बहुत देखेंगे:

  1. कुछ विशेषता या पैटर्न (इसे "पैटर्न X" कहते हैं) को किसी विशेष उद्देश्य के लिए उपयोगी माना जाता है। पैटर्न एक्स के बारे में गुण बताते हुए ब्लॉग पोस्ट लिखे गए हैं।

  2. प्रचार कुछ लोगों को लगता है कि आपको जब भी संभव हो पैटर्न X का उपयोग करना चाहिए ।

  3. अन्य लोग संदर्भों में प्रयुक्त पैटर्न X को देखने के लिए परेशान हो जाते हैं जहाँ यह उचित नहीं है, और वे यह कहते हुए ब्लॉग पोस्ट लिखते हैं कि आपको हमेशा पैटर्न X का उपयोग नहीं करना चाहिए और यह कुछ संदर्भों में हानिकारक है।

  4. बैकलैश के कारण कुछ लोगों का मानना ​​है कि पैटर्न X हमेशा हानिकारक होता है और इसका उपयोग कभी नहीं किया जाना चाहिए ।

आप देखेंगे कि यह प्रचार / बैकलैश चक्र GOTOएसक्यूएल से लेकर नो एसक्यूएल और लगभग , हाँ, विरासत के लगभग किसी भी विशेषता के साथ होता है । मारक को हमेशा संदर्भ पर विचार करना है

करने के बाद Circleउतरना से Shapeहै वास्तव में कैसे विरासत विरासत समर्थन OO भाषाओं में इस्तेमाल किया जा माना जाता है।

नियम का अंगूठा "वंशानुक्रम पर रचना पसंद करता है" वास्तव में संदर्भ के बिना भ्रामक है। जब वंशानुक्रम अधिक उपयुक्त हो तो आपको वंशानुक्रम पसंद करना चाहिए, लेकिन जब रचना अधिक उपयुक्त हो तो रचना को प्राथमिकता दें। वाक्य को हाइपर चक्र में चरण 2 पर लोगों की ओर निर्देशित किया गया है, जो सोचते हैं कि विरासत को हर जगह इस्तेमाल किया जाना चाहिए। लेकिन यह सिलसिला आगे बढ़ा है और आज लगता है कि कुछ लोगों को लगता है कि विरासत कुछ हद तक अपने आप में खराब है।

इसे हथौड़े की तरह सोचें, पेचकश की तरह। क्या आपको एक हथौड़ा पर एक पेचकश पसंद करना चाहिए? सवाल का कोई मतलब नहीं है। आपको काम के लिए उपयुक्त उपकरण का उपयोग करना चाहिए, और यह सब इस बात पर निर्भर करता है कि आपको किस कार्य के लिए आवश्यक है।

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