"संपूर्ण टीम" C ++ की विशेषताएं?


16

C ++ में, अपवाद जैसी विशेषताएं आपके पूरे कार्यक्रम को प्रभावित करती हैं: आप उन्हें या तो अपने पूरे कार्यक्रम में अक्षम कर सकते हैं , या आपको पूरे कोड में उनसे निपटने की आवश्यकता है। C ++ रिपोर्ट पर एक प्रसिद्ध लेख के रूप में :

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

चूंकि newअपवादों को भी फेंकता है, इसलिए प्रत्येक फ़ंक्शन को बुनियादी अपवाद सुरक्षा प्रदान करने की आवश्यकता होती है - जब तक कि यह केवल उन फ़ंक्शन को कॉल करता है जो बिना किसी अपवाद के फेंकने की गारंटी देते हैं - जब तक कि आप अपने पूरे प्रोजेक्ट में अपवादों को पूरी तरह से अक्षम न करें

इसलिए, अपवाद एक "संपूर्ण-कार्यक्रम" या "पूरी-टीम" सुविधा है, क्योंकि उन्हें उपयोग करने वाली टीम में सभी को समझना चाहिए। लेकिन सभी C ++ फीचर्स ऐसे नहीं हैं, जहाँ तक मुझे पता है।

एक संभावित उदाहरण यह है कि अगर मुझे टेम्प्लेट नहीं मिलते हैं, लेकिन मैं उनका उपयोग नहीं करता हूं, तो भी मैं सही C ++ लिख पाऊंगा - या नहीं। मैं भी sortपूर्णांक की एक सरणी पर कॉल कर सकते हैं और इसके अद्भुत गति लाभ wrt का आनंद ले सकते हैं। सी qsort(क्योंकि कोई फ़ंक्शन पॉइंटर नहीं कहा जाता है), बग को जोखिम में डाले बिना - या नहीं? ऐसा लगता है कि टेम्प्लेट "पूरी टीम" नहीं हैं।

क्या अन्य सी ++ फीचर्स हैं जो कोड को सीधे उपयोग नहीं करते हैं, और इसलिए "पूरी टीम" हैं? मैं विशेष रूप से सी में मौजूद नहीं सुविधाओं में दिलचस्पी रखता हूं

अपडेट : मैं विशेष रूप से उन सुविधाओं की तलाश कर रहा हूं, जहां कोई भाषा-लागू संकेत नहीं है जो आपको उनके बारे में पता होना चाहिए। पहले उत्तर में मुझे कांस्ट-करेक्शन का उल्लेख मिला, जो पूरी टीम भी है, इसलिए हर किसी को इसके बारे में जानने की जरूरत है; हालाँकि, AFAICS आपको केवल तभी प्रभावित करेगा जब आप किसी ऐसे फ़ंक्शन को कॉल करेंगे जो चिह्नित है const, और कंपाइलर आपको इसे नॉन-कास्ट ऑब्जेक्ट्स पर कॉल करने से रोकेगा, इसलिए आपको Google के लिए कुछ मिलेगा। अपवादों के साथ, आपको वह भी नहीं मिलता है; इसके अलावा, वे हमेशा जैसे ही आप उपयोग करते हैं new, इसलिए अपवाद अधिक "कपटी" होते हैं। चूंकि मैं इसे उद्देश्यपूर्ण रूप से वाक्यांश नहीं दे सकता, हालांकि, मैं किसी भी पूरी टीम की सुविधा की सराहना करूंगा।

अद्यतन 2 : C ++ सुविधा के बजाय मुझे "C ++ - विशिष्ट सुविधा" जैसी कुछ चीज़ों को लिखना चाहिए, जो कि मल्टीथ्रेडिंग जैसी चीज़ों को बाहर करने के लिए जो कि बड़ी संख्या में मुख्यधारा की प्रोग्रामिंग भाषाओं पर लागू होती हैं।

परिशिष्ट: यह प्रश्न वस्तुनिष्ठ क्यों है (यदि आप आश्चर्य करते हैं)

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

ऊपर, इसके बजाय, मैंने परिभाषित किया (जितना संभव हो उतना ठीक है) एक "पूरी टीम" भाषा की विशेषता क्या है, एक उदाहरण (अपवाद) प्रदान करें, साथ में C ++ के बारे में साहित्य में व्यापक समर्थन साक्ष्य प्रदान करें, और C ++ में पूरी-टीम सुविधाओं के लिए पूछें। अपवादों से परे।

चाहे आपको "पूरी टीम" सुविधाओं का उपयोग करना चाहिए, या क्या यह एक प्रासंगिक अवधारणा है, व्यक्तिपरक हो सकता है - लेकिन इसका मतलब है कि इस प्रश्न का महत्व हमेशा की तरह व्यक्तिपरक है।

जवाबों:


11

मैं 'संपूर्ण टीम' सुविधा के रूप में संगामिति को नामांकित करूंगा।

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


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

@ ब्लेज़रब्लड - C ++ 11 ने खुद की थ्रेडिंग लाइब्रेरी शुरू की, इसलिए हाँ, यह अब C ++ का हिस्सा है।
माइकल कोहेन 19

@MichaelKohne: मैंने यह दावा नहीं किया कि C ++ मल्टीथ्रेडिंग का समर्थन नहीं करता है। मैंने कहा कि थ्रेड्स सी ++ - विशिष्ट नहीं हैं, क्योंकि कई अन्य भाषाओं में उनके पास है। मैंने अभी नोट किया है कि वर्णित समस्याएं सूत्र के इंटरफ़ेस पर एक सूत्र के रूप में लागू होती हैं।
ब्लिसॉर्बलेड

मैं कहूंगा कि "दौड़ की स्थिति" इस मूल मुद्दे के लिए एक बेहतर शब्द है। यही है, प्रोग्रामर को समवर्ती रूपरेखा पर काम करने या उपयोग करने की आवश्यकता नहीं हो सकती है, लेकिन यदि वे कोई C ++ कोड लिखते हैं, और उनके कोड को संभवतः एक से अधिक थ्रेड से कॉल किया जा सकता है, तो उन्हें सामान्य रूप से दौड़ की स्थिति के बारे में सोचने की आवश्यकता है, उनके सभी कोड में लिखा है।
१३:३३

यह मुझे एक सहकर्मी के साथ गलतफहमी की याद दिलाता है जो वर्षों पहले हुआ था। एक सहकर्मी ने दूसरे सहकर्मी से पूछा: क्या यह (कुछ कार्य) धागा-सुरक्षित है? दूसरे सहकर्मी ने हां में जवाब दिया। सहकर्मी जो पूछते थे, वह कई धागों से इसका इस्तेमाल करने लगा, और उसे अप्रत्याशित परिणाम मिले (यह दुर्घटनाग्रस्त नहीं हुआ, लेकिन एक ही वस्तु पर कई ऑपरेशन लागू किए गए)। यह सहकर्मी निकला जिसने पूछा कि "थ्रेड-सेफ" का मानसिक मॉडल क्या नहीं है, और इस प्रतिक्रिया को गलत मान लिया कि "मैं जो चाहूं वह कर सकता हूं।"
रवांग

10

स्पष्ट उत्तर constशुद्धता है: चूंकि const/ volatileयोग्यता संक्रामक है, एक बार कोड का एक हिस्सा इसका उपयोग करना शुरू कर देता है, हर (प्रत्यक्ष या अप्रत्यक्ष रूप से) कॉलिंग कोड भी constसही होना चाहिए , या constस्पष्ट रूप से नेस को निकाल देना चाहिए ।

हालांकि, अपवादों के साथ, यह स्पष्ट रूप से एक अच्छी बात है । और भी अधिक, क्योंकि अपवाद सुरक्षा के विपरीत यह कड़ाई से संकलक द्वारा सत्यापित है।


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

10

संकेत दिए गए।

  • क्या सूचक स्टैक पर मेमोरी को इंगित करता है?
  • क्या सूचक ढेर पर स्मृति को इंगित करता है?
  • क्या सूचक एकल वस्तु की ओर इशारा करता है?
  • क्या सूचक एक सरणी की ओर इशारा करता है?
  • क्या सूचक किसी सरणी के बीच के स्थान की ओर इंगित करता है?
  • क्या सूचक वैध है?
  • क्या पॉइंटर मंगवाया है?
  • कोड क्या "सूचक" का मालिक है?
  • क्या संदर्भित वस्तु को मैन्युअल रूप से निपटाया जाना चाहिए? यदि हां, तो कैसे?

1
+1 विशेष रूप से सूचक स्वामित्व के बारे में प्रश्न के कारण। स्मार्ट पॉइंटर्स के बिना, स्वामित्व वास्तव में पूरी टीम में फैलता है।
JKor

3

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


1

केवल एक ही कांस्टेबल शुद्धता (ऊपर देखा गया) जो मन में आता है वह है स्ट्रीम (आईएनजी) राज्य। यदि आप C ++ कोड लिखते हैं, जहाँ आप ऑब्जेक्ट्स और सबोबजेक्ट्स का उपयोग करते हैं और ऑब्जेक्ट पदानुक्रम संभावनाएं हैं, तो आप अंततः प्रोग्राम के ऑपरेटर से / को डेटा भेजना या प्राप्त करना चाहेंगे। आप कर सकते हैं सरल स्ट्रीमिंग का कार्य है कि लिखना होगा संकलन और होगा शब्दार्थ सही हो ...

std::ostream& operator<< (std::ostream&, MyClass const&) {...}
std::istream& operator>> (std::istream&, MyClass&) {...}

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

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

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

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