2010-01-26 19 views
10

यह मुझे काफी समय लगा कितना महत्वपूर्ण है और सूक्ष्म चर होने को एहसास है कि:C++ भाषा डिजाइन के कारण विशिष्ट पैटर्न

1) ढेर

2) अपने विनाशकर्ता कहा जाता है पर मौजूद हैं, जब वे बाहर गिर स्कोप

हैं।

ये दो बातें की अनुमति देने जैसी बातों:

ए) आरए II

बी) refcounted जीसी

काफी दिलचस्प है, (1) & (2) सी की तरह "निम्न" भाषाओं में उपलब्ध नहीं हैं /सभा; न ही रूबी/पायथन/जावा जैसे "उच्च" भाषाओं में (चूंकि जीसी वस्तुओं के अनुमानित विनाश को रोकता है)।

मैं उत्सुक हूं - भाषा डिजाइन विकल्पों के कारण, आप अन्य तकनीकों के बारे में क्या जानते हैं, बहुत सी ++ विशिष्ट हैं।

धन्यवाद!

संपादित करें: यदि आपका उत्तर है "यह सी ++ & इस अन्य लैंगेज में काम करता है", यह भी ठीक है। बातें मैं के बारे में जानने के लिए चाहते हैं के समान हैं:

कुछ सुविधाओं की जरूरत नहीं करने के लिए (जीसी) की तरह का चयन करके, हम (आरए II + वस्तुओं की predicable destructing) की तरह अन्य सुविधाओं प्राप्त करें। चुनकर सी ++ के किन क्षेत्रों में अन्य विशेषताएं हैं जो अन्य "उच्च स्तर" लैंगुग्स हैं, सी ++ पैटर्न प्राप्त करने के लिए प्रबंधन करता है कि उन उच्च स्तर के लैंगुग व्यक्त नहीं कर सकते हैं।

+0

मैं नहीं मानता कि सी ++ है जी सी, सी # निश्चित रूप से करता है, लेकिन यह एक अलग जानवर है। – Hogan

+1

हां, आरएआईआई के माध्यम से संसाधन प्रबंधन (बिना गिनती के या बिना) वास्तव में जीसी नहीं है, यह अधिक सामान्य है। –

+0

प्लस यह पूर्व निर्धारित समय पर होता है, जीसी गैर-निर्धारिती है। – Hogan

उत्तर

3

मुझे वास्तव में विशेषता कक्षाएं पसंद हैं। सी ++ (स्कैला के रूप में अन्य भाषाओं में बिल्कुल विशिष्ट नहीं है), लेकिन यह आपको वस्तुओं को अनुकूलित करने की अनुमति देता है, मूल रूप से संचालन के एक सेट को निर्दिष्ट करने के लिए जो एक प्रकार का समर्थन करना चाहिए। कल्पना करें कि tr1::hash के अर्थ में आप "हैशर" चाहते हैं। हैश को कुछ प्रकार के लिए परिभाषित किया गया है, लेकिन दूसरों के लिए नहीं। आप एक वर्ग कैसे बना सकते हैं जिसमें हैश को आपके इच्छित सभी प्रकारों के लिए परिभाषित किया गया हो? आप एक कक्षा घोषित कर सकते हैं जैसे:

template < typename T> 
struct hashing_tratis 
{ 
    typedef std::tr1::hash<T> hashing_type; 
}; 

, जो कि आप एक वर्ग की अपेक्षा करते हैं जिसमें सही हैशिंग_type का उपयोग करने के लिए परिभाषित किया गया है। हालांकि, हैश परिभाषित किया गया है नहीं, कहते हैं, myType के लिए है, तो आप लिख सकते हैं:

template <> 
struct hashing_traits<myType> 
{ 
    typedef class_that_knows_how_to_hash_myType hashing_type; 
}; 

इस तरह, यह है कि आप किसी भी प्रकार के (myType सहित) है कि आप अपने प्रोग्राम में हैश का उपयोग करें करने के लिए कोई तरीका होना चाहिए लगता है।आप एक हैशिंग विशेषता बनाकर "सार्वभौमिक" हैशर लिख सकते हैं:

template <typename T> 
struct something { 
    typename hashing_traits<T>::hashing_type hasher; 
    .... // here hasher is defined for all your relevant types, and knows how to hash them 
+0

प्रतिबिंब का समर्थन करने वाली भाषाएं बोझिल गुण वर्ग के बिना ऐसा कर सकती हैं। वे कक्षा से पूछते हैं कि क्या यह एक इंटरफेस का समर्थन करता है और इसे कॉल करता है। पहले ऑर्डर फ़ंक्शन समर्थन वाले भाषाओं में भी वही संभव है। – jmucchiello

+1

jmucchiello: ठीक है, बिल्कुल नहीं। क्या होता है, उदाहरण के लिए, जब आप कक्षा या इंटरफ़ेस के लिए पूछते हैं कि यह ऑब्जेक्ट लागू नहीं होता है? आपको एक अनुकूलक के लिए "खोज" करना होगा। सी ++ में टाइप पैरामीटरेशन इस विशेषता निर्माण को एक सजातीय इंटरफ़ेस के साथ अनुमति देता है। –

2

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

टेम्पलेट्स और संकलन-समय बतख टाइपिंग के साथ आप दोनों दुनिया के सर्वश्रेष्ठ प्राप्त करते हैं: फ़ंक्शन या कक्षा के विकास के समय में प्रकार निर्दिष्ट करने की लचीलापन और संकलन समय पर उन्हें जानने की सुरक्षा और प्रदर्शन।

+0

प्रश्न विशेष रूप से सी ++ के बारे में है। –

+1

@Neil: मैं बस यह इंगित कर रहा हूं कि यह ** पूरी तरह से ** विशिष्ट नहीं है, हालांकि सी ++ सबसे लोकप्रिय भाषा है जिसमें यह तकनीक उपलब्ध है। – dsimcha

1

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

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

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

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

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

+0

एक अच्छा टेम्पलेटेड पुल पैटर्न कार्यान्वयन क्यों खराब प्रदर्शन कर सकता है तो एक vtables पर आधारित? इसके अलावा, पुल न केवल मॉड्यूल का सवाल हैं, एक परत-आधारित दृष्टिकोण के साथ जटिलता छुपाएं भाषा के बावजूद इसका मुख्य मूल्य है। –

+0

कंप्यूटर विज्ञान। –

+1

संकेत का एक अतिरिक्त स्तर प्रदर्शन को प्रभावित नहीं करता है जितना यह GRASP अच्छी आदतों में मदद करता है। और आप सवाल का जवाब नहीं दे रहे हैं। –

2
  • हमेशा फोन करने वाले स्मृति आवंटन/आवंटन रद्द करने के लिए जिम्मेदार है, जो कि कोड है कि में जावा/सी # इस प्रकार दिखाई देगा इसका मतलब है:

    :

    MyClass doSomething(MyClass someInstance); 
    

    C/C++ में इस तरह दिखता है

  • सॉकेट बंद करने के लिए विनाशकर्ता का उपयोग करना, फ़ाइल हैंडल, आदि
+1

या 'boost :: shared_ptr doSomething (const MyClass और कुछInstance);' –

+1

यदि आप चाहते हैं कि कॉलर आवंटन/मुक्त के लिए ज़िम्मेदार हो, तो आपको संदर्भों का उपयोग करना चाहिए: शून्य करना कुछ (कॉन्स मायक्लास और in_param, myclass और out_param); आप कहीं भी out_param आवंटित करने और इसे पास करने के साथ कुछ नहीं कह सकते हैं। – jmucchiello

+0

दरअसल, आपके कोड का उपयोग करने वाले सभी आवंटन/डेलोक के लिए पूर्ण ज़िम्मेदारी लेने का एक बेहतर अभ्यास है। आप इसे स्मार्ट पॉइंटर्स का उपयोग करके (1) कर सकते हैं जो आपके आवंटित संसाधनों को तब मुक्त कर देगा जब कोई और उपयोग नहीं किया जाता है और (2) प्रतिलिपि बनाकर ऑब्जेक्ट लौटकर और उस प्रतिलिपि को नष्ट करते समय इसे कॉपी करते हैं। –

0

कुछ भाषाओं का समर्थन multiple dispatch (double dispatch के साथ सबसे आम है) सी ++ करता है, तो आप इसे स्थिर या गतिशील रूप से कर सकते हैं।
इसके साथ आप बिना किसी कारण के, या उनके ठोस प्रकार के परीक्षण के बिना एक दूसरे पर बातचीत कर सकते हैं।

+0

मैं लगभग सभी भाषाओं (सीएलओएस की तरह कुछ को छोड़कर जो इसे मूल रूप से समर्थन करता हूं) को छोड़कर सी ++ करता है - आपको इसे स्वयं कोड करना होगा। –

+0

सी # 4.0 यह करता है! – Hogan

+0

@ होगन: ओह, मुझे इसे देखना है। हालांकि मुझे लगता है कि केवल गतिशील रूप से? –

1

पीआईएमपीएल मुहावरे है। यह ब्रिज पैटर्न के समान काम करता है।

और Expression Template, जो सी ++ के अभिव्यक्ति मूल्यांकन में देरी करता है।

इन दोनों कार्यों में भी इस सवाल का पता लगाने: More C++ Idioms और Effective C++ (स्कॉट Meyers, 2005)

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