7

एनवीआई (Non-Virtual Interface) और Template Method पैटर्न के बीच क्या अंतर है?सी ++: एनवीआई और टेम्पलेट विधि पैटर्न के बीच अंतर?

वे बहुत समान प्रतीत होते हैं और मैंने दोनों को पढ़ा है कि वे मूल रूप से वही हैं और वे टेम्पलेट के साथ किसी भी तरह से सामान्य रूप से भिन्न हैं।

+1

मैं संदर्भ के रूप में विकिपीडिया लिंक का उपयोग नहीं करता, ताले का उपयोग अपवादों के सामने भंगुर है ... –

उत्तर

11

एनवीआई एक मुहावरे है, टेम्पलेट विधि एक पैटर्न है। एनवीआई सी ++ में गतिशील प्रेषण का उपयोग कर टेम्पलेट विधि पैटर्न का कार्यान्वयन है; गतिशील प्रेषण को खत्म करने के लिए टेम्पलेट मेटाप्रोग्रामिंग का उपयोग कर सी ++ में टेम्पलेट विधियां बनाना भी संभव है।

एक पैटर्न एक मुहावरे से अधिक सामान्य है, और भाषा पैटर्न को लागू करने के लिए विभिन्न मुहावरे का उपयोग कर सकती है।

+1

तो आप कह रहे हैं कि एनवीआई मूल रूप से टेम्पलेट विधि पैटर्न का एक भाषा विशिष्ट कार्यान्वयन है और इससे परे कोई वास्तविक अंतर नहीं है? एक ही परिणाम प्राप्त करने के लिए आप सी ++ टेम्पलेट का उपयोग कैसे करेंगे? –

+0

@ रॉबर्ट एस बार्न्स जहां तक ​​मैं देख सकता हूं, टेम्पलेट विधि के रूप में सी ++ टेम्पलेट्स का उपयोग करने का कोई स्पष्ट तरीका नहीं है। टेम्पलेट विधि कहती है, 'ऐसा करें, फिर यह दूसरी चीज करें', और जब आप एक या दूसरे चीजों के लिए एक मजेदार बना सकते हैं, तो सी ++ टेम्पलेट्स आपको टाइप पैरामीटर के साथ कोई वास्तविक संबंध नहीं है। –

+0

मुझे लगता है कि मैं अभी भी समझ नहीं रहा हूं कि आप यहां क्या मतलब रखते हैं: "गतिशील प्रेषण को खत्म करने के लिए टेम्पलेट मेटाप्रोग्रामिंग का उपयोग करके सी ++ में टेम्पलेट विधियां बनाना भी संभव है।" –

8

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

  • वर्ग अपरिवर्तनशीलताओं
  • समारोह ठेके
  • दोहराए परिचालन (प्रवेश) की तरह (पैरामीटर पारित कर दिया और उत्पन्न वापसी मान से अधिक दावे)
  • उत्पन्न अपवाद से अधिक
  • नियंत्रण (बुरा विचार है, हालांकि;))

हालांकि, कार्यान्वयन वास्तव में काफी, भिन्न हो सकती है उदाहरण NVI का एक और उदाहरण के लिए कार्यान्वयन Pimpl के साथ गठबंधन करने के लिए है:

class FooImpl; 

class Foo 
{ 
public: 
    enum type { Type1, Type2 }; 

    Foo(type t, int i, int j); 

    int GetResult() const; 

private: 
    FooImpl* mImpl; 
}; 

और कार्यान्वयन के लिए:

struct FooImpl 
{ 
    virtual ~FooImpl(); 
    virtual int GetResult() const; 
}; 

class FooType1: public FooImpl 
{ 
public: 
    FooType1(int i, int j); 
    virtual int GetResult() const; 
private: 
    /// ... 
}; 

मैं हमेशा पाया है कि यह बात बेहतर जानकारी दी। क्या आपने इसे समझ लिया है?

मुख्य बिंदु यह है कि virtual एक कार्यान्वयन विवरण है। और इंटरफ़ेस में कार्यान्वयन विवरण का खुलासा करना एक बुरा विचार है, क्योंकि आप उन्हें बदलना चाहते हैं।

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

उपरोक्त एनवीआई + पिंपल संयोजन का उपयोग करके, कक्षा 12 में कोई भी virtual बिल्कुल (निजी भी नहीं) है। मेमोरी लेआउट पिछड़ा और आगे संगत है। हमने बाइनरी संगतता प्राप्त की है।

यहाँ, हम एक बार में कई पैटर्न का उपयोग करें:

  • टेम्पलेट विधि
  • रणनीति
  • फैक्टरी (जो कार्यान्वयन पर हम पाते हैं तय करने के लिए)
(के बाद से हम अपनी इच्छा से सूचक स्वैप कर सकते हैं)
+0

+1। – neuro

+0

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

+0

यह लागू करने के लिए एक आसान नीति भी है: सार्वजनिक वर्चुअल इंटरफ़ेस प्रदान करने वाले पिंपल जैसी कक्षाओं के लिए विशेष मामलों को बनाने वाले व्यक्ति के विपरीत कोई सार्वजनिक वर्चुअल फ़ंक्शन नहीं। – stinky472

संबंधित मुद्दे