टाइप इंफ़ेक्शन क्यों उपयोगी है?


37

मैं कोड लिखने की तुलना में अधिक बार कोड पढ़ता हूं, और मैं मान रहा हूं कि औद्योगिक सॉफ्टवेयर पर काम करने वाले अधिकांश प्रोग्रामर ऐसा करते हैं। मुझे लगता है कि अनुमान के प्रकार का लाभ कम वाचालता और कम लिखित कोड है। लेकिन दूसरी ओर यदि आप अधिक बार कोड पढ़ते हैं, तो आप शायद पठनीय कोड चाहते हैं।

संकलक प्रकार को संक्रमित करता है; इसके लिए पुराने एल्गोरिदम हैं। लेकिन असली सवाल यह है कि मैं, प्रोग्रामर, कोड को पढ़ते समय अपने वेरिएबल के प्रकार का अनुमान क्यों लगाना चाहता हूं? क्या किसी के लिए यह सोचना तेजी से नहीं है कि टाइप क्या है?

संपादित करें: निष्कर्ष के रूप में मैं समझता हूं कि यह उपयोगी क्यों है। लेकिन भाषा सुविधाओं की श्रेणी में मैं इसे ऑपरेटर ओवरलोडिंग के साथ एक बाल्टी में देखता हूं - कुछ मामलों में उपयोगी है लेकिन दुरुपयोग होने पर पठनीयता को प्रभावित करता है।


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

एक बार जब मुझे कोड का टुकड़ा मिल जाएगा जिसकी मुझे तलाश है, तो मैं इसे जाँचना शुरू कर सकता हूं, लेकिन किसी भी समय आपको कोड की 10 से अधिक लाइनों पर ध्यान केंद्रित नहीं करना चाहिए, जिस बिंदु पर यह करने के लिए कोई परेशानी नहीं है अपने आप को इंकार करें क्योंकि आप मानसिक रूप से पूरे ब्लॉक को उठा रहे हैं, जिससे आप शुरू कर सकते हैं, और संभवत: ऐसा करने में आपकी मदद करने के लिए टूलिंग का उपयोग कर रहे हैं। कोड की 10 पंक्तियों के प्रकारों का पता लगाना, जिन पर आप ज़ोन करने की कोशिश कर रहे हैं, उनमें से शायद ही कभी आपका ज़्यादा समय लगता है, लेकिन यह वह हिस्सा है, जहाँ आपने पढ़ने से लेकर लिखने तक स्विच किया है, जो वैसे भी बहुत कम आम है।
जिमी हॉफ

याद रखें कि भले ही कोई प्रोग्रामर कोड को लिखने की तुलना में अधिक बार पढ़ता है, लेकिन इसका मतलब यह नहीं है कि कोड का एक टुकड़ा लिखित की तुलना में अधिक बार पढ़ा जाता है। बहुत से कोड अल्पकालिक हो सकते हैं या फिर कभी नहीं पढ़े जा सकते हैं, और यह बताना आसान नहीं होगा कि कौन सा कोड जीवित रहेगा और अधिकतम पठनीयता के लिए लिखा जाना चाहिए।
जेपीए

2
@ जिम्मीहोफा के पहले बिंदु पर विस्तार से, सामान्य रूप से पढ़ने पर विचार करें। क्या एक वाक्य को पढ़ना और पढ़ना आसान है, अकेले में समझें, जब अपने व्यक्तिगत शब्दों के भाग-भाषण पर ध्यान केंद्रित किया जाए? "(लेख) गाय (संज्ञा-एकवचन) कूद (क्रिया-अतीत) पर (पूर्वसर्ग) (लेख) चंद्रमा (संज्ञा)। (विराम-अवधि)"।
ज़ेव स्पिट्ज

जवाबों:


46

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

int x = 42;  // yes I see it's an int, because it's a bloody integer literal!

// Why the hell do I have to spell the name twice?
SomeObjectFactory<OtherObject> obj = new SomeObjectFactory<>();

और कभी-कभी यह पूरे प्रकार को समझने के लिए सिर्फ सादा कष्टप्रद होता है।

// this code walks through all entries in an "(int, int) -> SomeObject" table
// represented as two nested maps
// Why are there more types than actual code?
for (Map.Entry<Integer, Map<Integer, SomeObject<SomeObject, T>>> row : table.entrySet()) {
    Integer rowKey = entry.getKey();
    Map<Integer, SomeObject<SomeObject, T>> rowValue = entry.getValue();
    for (Map.Entry<Integer, SomeObject<SomeObject, T>> col : rowValue.entrySet()) {
        Integer colKey = col.getKey();
        SomeObject<SomeObject, T> colValue = col.getValue();
        doSomethingWith<SomeObject<SomeObject, T>>(rowKey, colKey, colValue);
    }
}

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

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

ऐसी कई भाषाएं हैं जो प्रकार के अनुमान का समर्थन करती हैं। उदाहरण के लिए:

  • सी ++। autoकीवर्ड चलाता अनुमान लिखें। इसके बिना, भेड़ के बच्चे के लिए या कंटेनरों में प्रविष्टियों के लिए वर्तनी को नरक बना दिया जाएगा।

  • सी#। आप चर की घोषणा कर सकते हैं var, जो सीमित प्रकार के अनुमानों को ट्रिगर करता है। यह अभी भी अधिकांश मामलों का प्रबंधन करता है, जहां आप टाइप इंट्रेंस चाहते हैं। कुछ जगहों पर आप टाइप पूरी तरह से छोड़ सकते हैं (उदाहरण के लिए लैम्ब्डा में)।

  • हास्केल, और एमएल परिवार में कोई भी भाषा। जबकि यहाँ इस्तेमाल किए जाने वाले प्रकार के इंट्रेंस का विशिष्ट स्वाद काफी शक्तिशाली है, फिर भी आप अक्सर कार्यों के लिए टाइप एनोटेशन देखते हैं, और दो कारणों से: पहला दस्तावेज़ीकरण है, और दूसरा एक चेक है जो टाइप इंट्रेंस वास्तव में आपके द्वारा अपेक्षित प्रकारों को मिला है। यदि कोई विसंगति है, तो किसी प्रकार की बग होने की संभावना है।


13
यह भी ध्यान दें कि C # में बिना नाम के गुमनाम प्रकार यानी प्रकार होते हैं, लेकिन C # में नाममात्र प्रकार की प्रणाली होती है, अर्थात नामों के आधार पर एक प्रकार की प्रणाली। प्रकार के अनुमान के बिना, उन प्रकारों का उपयोग कभी नहीं किया जा सकता है!
जोर्ग डब्ल्यू मित्तग

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

10
@ मैल्कम, हां, मेरे सभी उदाहरणों से वंचित हैं। वे एक बिंदु को चित्रित करने की सेवा करते हैं। जब मैंने intउदाहरण लिखा , तो मैं अधिकांश भाषाओं की (मेरी राय में बहुत समझदार व्यवहार) के बारे में सोच रहा था, जो कि प्रकार का अनुमान लगाते हैं। वे आम तौर पर intया Integerउस भाषा में जो कुछ भी कहते हैं, उसका अनुमान लगाते हैं। प्रकार के अनुमान की सुंदरता यह है कि यह हमेशा वैकल्पिक होता है; यदि आपको एक की आवश्यकता है तो आप अभी भी एक अलग प्रकार निर्दिष्ट कर सकते हैं। Entryउदाहरण के बारे में : अच्छी बात है, मैं इसे बदलूंगा Map.Entry<Integer, Map<Integer, SomeObject<SomeObject, T>>>। जावा में एलियास टाइप भी नहीं है :(
amon

4
@ m3th0dman यदि प्रकार समझने के लिए महत्वपूर्ण है, तो आप अभी भी स्पष्ट रूप से इसका उल्लेख कर सकते हैं। प्रकार का अनुमान हमेशा वैकल्पिक होता है। लेकिन यहाँ, colKeyदोनों का प्रकार स्पष्ट और अप्रासंगिक है: हम केवल इसके बारे में परवाह करते हैं कि यह दूसरे तर्क के रूप में उपयुक्त है doSomethingWith। अगर मुझे उस लूप को एक फ़ंक्शन में (key1, key2, value)निकालना था, जो एक इरेटेबल -ट्रिएप्स देता है, तो सबसे सामान्य हस्ताक्षर होगा <K1, K2, V> Iterable<TableEntry<K1, K2, V>> flattenTable(Map<K1, Map<K2, V>> table)। उस फ़ंक्शन के अंदर, वास्तविक प्रकार colKey( Integer, नहीं K2) बिल्कुल अप्रासंगिक है।
आमोन

4
@ m3th0dman यह एक व्यापक व्यापक कथन है, " सबसे " कोड के बारे में यह या वह है। उपाख्यानात्मक आँकड़े। प्रारंभ में दो बार टाइप लिखने में निश्चित रूप से कोई मतलब नहीं है View.OnClickListener listener = new View.OnClickListener():। यदि प्रोग्रामर "आलसी" था तब भी आपको इसका प्रकार पता होगा और इसे छोटा कर दिया var listener = new View.OnClickListener(यदि यह संभव था)। अतिरेक इस तरह की आम है - मैं एक guesstimate यहां जोखिम नहीं होगा - और हटाने यह है भविष्य पाठकों के बारे में सोच से स्टेम। हर भाषा की सुविधा का उपयोग सावधानी से किया जाना चाहिए, मैं यह सवाल नहीं कर रहा हूं।
कोनराड मोरव्स्की

26

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

और यह मेरा अनुभव यह है कि अक्सर , ठीक वैसी ही नहीं है (जो) महत्वपूर्ण। निश्चित रूप से आप कभी कभी घोंसला भाव: x + y * z, monkey.eat(bananas.get(i)), factory.makeCar().drive()। इनमें से प्रत्येक में उप-अभिव्यक्तियाँ होती हैं जो एक ऐसे मूल्य का मूल्यांकन करती हैं, जिसका प्रकार बाहर नहीं लिखा जाता है। फिर भी वे पूरी तरह से स्पष्ट हैं। हम प्रकार को अस्थिर करने के साथ ठीक हैं क्योंकि यह संदर्भ से अलग करने के लिए पर्याप्त आसान है, और इसे लिखने से अच्छा से अधिक नुकसान होगा (डेटा प्रवाह की समझ को अव्यवस्थित करें, मूल्यवान स्क्रीन और अल्पकालिक मेमोरी स्पेस लें)।

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

user = db.get_poster(request.post['answer'])
name = db.get_display_name(user)

क्या इससे कोई फर्क पड़ता है कि userएक इकाई वस्तु, एक पूर्णांक, एक स्ट्रिंग, या कुछ और है? अधिकांश प्रयोजनों के लिए, यह नहीं है, यह जानना पर्याप्त है कि यह एक उपयोगकर्ता का प्रतिनिधित्व करता है, HTTP अनुरोध से आता है, और इसका उपयोग उत्तर के निचले दाएं कोने में प्रदर्शित करने के लिए नाम लाने के लिए किया जाता है।

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


2
+1 यह स्वीकृत उत्तर होना चाहिए। यह दिल के लिए सही है कि प्रकार का अनुमान एक महान विचार क्यों है।
क्रिश्चियन हैटर

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

@cmaster और आप हमेशा उस प्रकार को आसानी से पता कर सकते हैं (अधिकांश IDEs आपको बताएंगे, और जानबूझकर एक प्रकार की त्रुटि के कारण कम-तकनीकी समाधान है और संकलक को वास्तविक प्रकार का प्रिंट देने देता है), यह अभी बाहर है इसलिए आपको आम मामले में परेशान नहीं करता है।

4

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

  Map<String,HashMap<String,String>> map = getMap();

लेकिन आप कह सकते हैं कि यह ठीक है मेरी आईडीई मेरी मदद करेगी, यह एक वैध बिंदु हो सकता है। हालाँकि, उदाहरण के लिए C # अनाम प्रकारों की सहायता के बिना कुछ सुविधाएँ नहीं होंगी।

 var person = new {Name="John Smith", Age = 105};

Linq Selectउदाहरण के लिए , प्रकार के अनुमान की मदद के बिना अब उतना अच्छा नहीं होगा

  var result = list.Select(c=> new {Name = c.Name.ToUpper(), Age = c.DOB - CurrentDate});

यह अनाम प्रकार बड़े करीने से चर के लिए अनुमान लगाया जाएगा।

मुझे वापसी के प्रकारों के बारे में टाइप नापसंद है Scalaक्योंकि मुझे लगता है कि आपकी बात यहाँ लागू होती है, यह हमारे लिए स्पष्ट होना चाहिए कि एक फ़ंक्शन क्या देता है ताकि हम एपीआई का अधिक धाराप्रवाह उपयोग कर सकें।


Map<String,HashMap<String,String>>? ज़रूर, यदि आप प्रकारों का उपयोग नहीं कर रहे हैं , तो उन्हें वर्तनी से बहुत कम फायदा होता है। Table<User, File, String>हालांकि अधिक जानकारीपूर्ण है, और इसे लिखने में लाभ है।
21

4

मुझे लगता है कि इसका उत्तर वास्तव में सरल है: यह अनावश्यक जानकारी को पढ़ने और लिखने से बचाता है। विशेष रूप से वस्तु उन्मुख भाषाओं में जहां आपके पास समान चिह्न के दोनों किनारों पर एक प्रकार है।

जो आपको यह भी बताता है कि आपको कब उपयोग करना चाहिए या नहीं करना चाहिए - जब जानकारी अनावश्यक नहीं होती है।


3
खैर, तकनीकी रूप से, जानकारी हमेशा बेमानी होती है जब मैनुअल हस्ताक्षर को छोड़ना संभव होता है: अन्यथा कंपाइलर उन्हें अनुमान लगाने में सक्षम नहीं होगा! लेकिन मेरा मतलब है कि आपका क्या मतलब है: जब आप किसी एक दृश्य में कई स्थानों पर एक हस्ताक्षर की नकल करते हैं, तो यह वास्तव में मस्तिष्क के लिए अतिरेक है , जबकि कुछ अच्छी तरह से रखी गई जानकारी आपको लंबे समय तक खोज करनी होगी, संभवतः एक साथ! अच्छे कई गैर-स्पष्ट परिवर्तन।
लेफ्टरनैबाउट

@leftaroundabout: प्रोग्रामर द्वारा पढ़े जाने पर निरर्थक।
जोमेनो सेप

3

मान लीजिए कि कोई एक कोड देखता है:

someBigLongGenericType variableName = someBigLongGenericType.someFactoryMethod();

यदि someBigLongGenericTypeवापसी के प्रकारों के बारे someFactoryMethodमें बताया जा सकता है, तो कोड पढ़ने वाले किसी व्यक्ति को यह देखने की संभावना होगी कि क्या प्रकार ठीक से मेल नहीं खाते हैं, और कितनी आसानी से कोई व्यक्ति जिसने विसंगति को नोटिस किया था वह पहचान सकता है कि यह जानबूझकर था या नहीं?

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


2

मैं देख रहा हूं कि पहले से ही बहुत से बढ़िया जवाब हैं। जिनमें से कुछ मैं दोहराता रहूंगा लेकिन कभी-कभी आप सिर्फ अपने शब्दों में ही बात करना चाहते हैं। मैं C ++ के कुछ उदाहरणों के साथ टिप्पणी करूंगा क्योंकि यही वह भाषा है जिसके साथ मेरी सबसे अधिक परिचितता है।

जो आवश्यक है वह कभी नासमझ नहीं है। अन्य भाषा सुविधाओं को व्यावहारिक बनाने के लिए टाइप इंट्रेंस आवश्यक है। C ++ में अप्रभावित प्रकारों का होना संभव है।

struct {
    double x, y;
} p0 = { 0.0, 0.0 };
// there is no name for the type of p0
auto p1 = p0;

सी ++ 11 ने लंबोदा को जोड़ा जो कि अप्राप्य भी हैं।

auto sq = [](int x) {
    return x * x;
};
// there is no name for the type of sq

टाइप इंस्पेक्शन भी टेम्पलेट को कम करता है।

template <class x_t>
auto sq(x_t const& x)
{
    return x * x;
}
// x_t is not known until it is inferred from an expression
sq(2); // x_t is int
sq(2.0); // x_t is double

लेकिन आपके प्रश्न थे "मैं क्यों, प्रोग्रामर, जब मैं कोड पढ़ता हूं, तो मेरे प्रकार के प्रकारों का पता लगाना चाहता हूं? क्या किसी के लिए यह पढ़ना ज्यादा तेजी से नहीं है कि यह सोचने के बजाय कि टाइप क्या है?"

प्रकार का अनुमान अतिरेक को दूर करता है। जब रीडिंग कोड की बात आती है तो कोड में अनावश्यक जानकारी होना कभी-कभी तेज और आसान हो सकता है, लेकिन अतिरेक उपयोगी जानकारी को ओवरडोज कर सकता है । उदाहरण के लिए:

std::vector<int> v;
std::vector<int>::iterator i = v.begin();

यह C ++ प्रोग्रामर के लिए मानक पुस्तकालय के साथ बहुत परिचित नहीं है कि यह पहचानने के लिए कि मैं एक पुनरावृत्ति है i = v.begin()जिससे स्पष्ट प्रकार की घोषणा सीमित मूल्य की है। इसकी उपस्थिति से यह उन विवरणों को अस्पष्ट करता है जो अधिक महत्वपूर्ण हैं (जैसे कि iवेक्टर की शुरुआत के लिए बिंदु)। @Amon द्वारा ठीक उत्तर महत्वपूर्ण विवरणों की ओवरशोडिंग का एक और बेहतर उदाहरण प्रदान करता है। इसके विपरीत प्रकार के प्रयोग से महत्वपूर्ण विवरणों को अधिक प्रमुखता मिलती है।

std::vector<int> v;
auto i = v.begin();

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

std::vector<int> v;
std::vector<int>::iterator i = v.begin();

इस मामले में कि मुझे कोड को डबल बदलने के लिए वेक्टर के मूल्य प्रकार को बदलने की आवश्यकता है:

std::vector<double> v;
std::vector<double>::iterator i = v.begin();

इस मामले में मुझे दो स्थानों पर कोड को संशोधित करना होगा। मूल कोड है:

std::vector<int> v;
auto i = v.begin();

और संशोधित कोड:

std::vector<double> v;
auto i = v.begin();

ध्यान दें कि मुझे अब केवल एक पंक्ति कोड बदलना होगा। इसे एक बड़े कार्यक्रम में शामिल करें और एक संपादक के साथ जितना हो सके उतने प्रकार के अनुमानों से परिवर्तनों को अधिक तेज़ी से बदल सकते हैं।

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

int pi = 3.14159;

अतिरेक इरादे को कठिन बना देता है। कुछ मामलों में टाइप इंफ़ेक्शन को पढ़ना और समझना आसान हो सकता है क्योंकि यह स्पष्ट प्रकार के विनिर्देशन की तुलना में सरल है। कोड के टुकड़े पर विचार करें:

int y = sq(x);

मामले में है कि sq(x)रिटर्न एक intहै, यह नहीं स्पष्ट है कि क्या yएक है intक्योंकि यह की वापसी प्रकार है sq(x)या क्योंकि यह सूट बयान है कि उपयोग y। यदि मैं अन्य कोड को बदल देता हूं , जो sq(x)अब वापस नहीं आता है int, तो यह उस रेखा से अनिश्चित है कि क्या प्रकार को yअद्यतन किया जाना चाहिए। एक ही कोड के साथ विरोधाभास लेकिन प्रकार का प्रयोग

auto y = sq(x);

इसमें आशय स्पष्ट है, yउसी प्रकार का होना चाहिए जिस प्रकार से लौटाया गया है sq(x)। जब कोड रिटर्न प्रकार बदलता है sq(x), तो yस्वचालित रूप से मिलान करने के लिए परिवर्तन का प्रकार ।

सी ++ में एक दूसरा कारण है कि उपरोक्त उदाहरण सरल प्रकार के अनुमान के साथ सरल है, प्रकार का अनुमान इंजेक्शन प्रकार के रूपांतरण का परिचय नहीं दे सकता है। यदि वापसी का प्रकार sq(x)नहीं है int, तो संकलक चुपचाप एक अंतर्निहित रूपांतरण सम्मिलित करता है int। यदि रिटर्न प्रकार sq(x)एक प्रकार का जटिल प्रकार है जो परिभाषित करता है operator int(), तो यह छिपा हुआ फ़ंक्शन कॉल मनमाने ढंग से जटिल हो सकता है।


C ++ में अप्राप्य प्रकारों के बारे में एक अच्छी बात बताई। हालाँकि, मुझे लगता है कि भाषा को ठीक करने का एक कारण यह है कि टाइप इंफ़ेक्शन जोड़ने का एक कारण कम है। आपके द्वारा प्रस्तुत किए जाने वाले पहले मामले में, प्रोग्रामर को केवल इस प्रकार का अनुमान लगाने से बचने के लिए एक नाम देना होगा, इसलिए यह एक मजबूत उदाहरण नहीं है। दूसरा उदाहरण केवल मजबूत है क्योंकि C ++ स्पष्ट रूप से लैम्ब्डा प्रकारों को निषिद्ध करता है, यहां तक ​​कि इसके उपयोग के साथ टाइप typeofकिए जाने वाले को भाषा द्वारा बेकार कर दिया जाता है। और यह उस भाषा का ही नुकसान है जिसे मेरी राय में तय किया जाना चाहिए।
सेमीस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.