हानिकारक माना जाता है? [बन्द है]


27

मैं अभी -std=c++0xजीसीसी में ध्वज के साथ अपने खुद के कुछ कोड संकलित कर रहा हूं, जैसा कि मैं चाहता हूं कि सभी युवा लोग जो कर रहे हैं, उसे जारी रखें (बशर्ते कि वे मेरे लॉन में रहें), और मैं चेतावनी के भार के साथ समाप्त हुआ auto_ptrपदावनत होने के बारे में। बेशक, मुझे पता था कि auto_ptrC ++ 0x में पदावनत किया गया था, लेकिन ...

क्या समय और मेहनत की बर्बादी नहीं है? वंचित न करने के कारण (उदाहरण के लिए auto_ptr के साथ):

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

  • auto_ptr थोड़ा पागल है, लेकिन यह वास्तव में टिन पर क्या कहता है।

  • अगर हम वास्तव में चीजों को हटाना चाहते हैं, तो मैं नामांकित करता हूं printf()। लेकिन जरा कल्पना कीजिए कि क्या होगा? auto_ptrबहुत सारे दोस्त नहीं हैं, लेकिन कम से कम मेरे सी ++ कोड में इसका उपयोग अधिक से अधिक किया जाता है printf, जिसका उपयोग बिल्कुल नहीं किया जाता है।

  • समिति के पास यह अधिकार प्राप्त करने का एक बुरा रिकॉर्ड है - उन्होंने नेमस्पेस स्कोप में स्थिर पदावनत कर दिया, और अब ऐसा लगता है कि यह अनिर्दिष्ट हो गया है - अगर auto_ptrएक समान वापसी हुई तो मुझे आश्चर्य नहीं होगा

  • अंत में, समिति जो भी कहती है, संकलक कार्यान्वयनकर्ता उनकी उपेक्षा करते हैं - वे बस अपने ग्राहकों के कोड को तोड़ने का जोखिम नहीं उठा सकते हैं, वे सभी कर सकते हैं जो चिड़चिड़ापन चेतावनी जारी कर सकते हैं।

तो मेरा सवाल है - क्या आप डिप्रेशन (किसी भी चीज़ के बारे में नहीं, सिर्फ auto_ptrs से नहीं, और सिर्फ C ++ में) एक अच्छा विचार मानते हैं, और यदि ऐसा है, तो क्यों?


2
@ एलक्यूक्यू - मैंने इसे "क्यों कुछ भी मूल्यह्रास करें" के रूप में पढ़ा लेकिन auto_ptrएक उदाहरण के रूप में उपयोग किया।
ChrisF

4
क्या यह टिन पर कहता है "यदि आपका दिल टूट जाएगा अगर लगभग किसी भी तरह के कंटेनर में इस्तेमाल किया जाता है"? उपयोग करें unique_ptrऔर खुश रहें।
केट ग्रेगोरी

13
@ नील - आपकी भाषा थोड़ी भड़काऊ है और (प्रतिबिंब पर) यह एक गंभीर सवाल की तुलना में अधिक शेख़ी के रूप में सामने आती है। यदि आप चाहते हैं कि यह खुला रहे तो आप इसे "टोन डाउन" करना चाहते हैं।
ChrisF

4
@ नील - मैं सराहना करता हूं कि आपने इसे विनोदी के रूप में इरादा किया था, लेकिन जैसा कि मैंने कहा, प्रतिबिंब पर यह मेरे विचार से अधिक "रैंटी" आया।
ChrisF

10
यदि आप कभी भी पदावनति से छुटकारा पाने की योजना बनाते हैं, तो आपको वास्तव में इसे पहले पदावनत करना चाहिए। मौजूदा भाषाओं / एपीआई के बहुत सारे अन्यथा टूट जाएगा। पदावनति के साथ आप उनके पदावनत अवकास से छुटकारा पाने के लिए उन्हें कुछ समय दे सकते हैं।
जोकिम सॉर

जवाबों:


32

अपव्यय के कारण (सामान्य रूप से):

  • यह स्पष्ट रूप से लोगों को इंगित करता है कि कुछ बुरा अभ्यास है (और उम्मीद है कि एक विकल्प सुझाता है)।
  • संचय अवधि लोगों को संकलक को हटाने से पहले अपने कोड को बदलने का मौका देती है।

मैं अंतिम बिंदु के बारे में भी असहमत हूं। कंपाइलर समिति की उपेक्षा नहीं करते हैं, और वे अंततः हटाए गए चीजों को हटाते हैं (उदाहरण के लिए >?=और <?=जीसीसी में - उन्हें फिर से हटा दिया गया *)।

मुझे लगता है कि महत्वपूर्ण बिंदु यह है: कुछ चीजों को विभिन्न कारणों से हटा दिया जाना चाहिए, और मुझे लगता है कि ऐसा करने के लिए पदावनति केवल एकमात्र तरीका है। इस विशिष्ट मामले में, auto_ptrइसे हटा दिया जाना चाहिए क्योंकि यह इसके द्वारा अलग किया गया है unique_ptr। ओवर बदलना काफी आसान है, और लोगों के पास ऐसा करने के लिए बहुत समय होगा।

(*) हाँ मुझे पता है कि वे एक्सटेंशन हैं और मानक नहीं हैं, लेकिन मुद्दा यह है कि संकलक विक्रेता अंततः चीजों को हटा देते हैं एक बार जब वे डिप्रेशन में प्रवेश करते हैं, तो कोड अभी भी उन पर निर्भर करता है या नहीं।


6
ऑफटॉप के लिए खेद है, लेकिन मैं विरोध नहीं कर सकता: वे >?=और <?=ऑपरेटर क्या थे ?
Brandizzi

7
पुराने जीसीसी में आप लिख सकते हैं a >?= b;कि किसके लिए शॉर्टहैंड था if (a > b) a = b;और इसी तरह <?=
पीटर एलेक्जेंडर

2
ऊ ... मैं देख सकता हूं कि उन्होंने इसे क्यों जोड़ा। और फिर उन्होंने इसे क्यों हटा दिया। "साफ" सुविधाओं के लिए पदावनति आवश्यक हो सकती है जो केवल यह बताती है कि जनता के लिए जारी किए जाने के बाद वे कितनी समस्याग्रस्त हैं।
फिल

25

किसी भी पर्याप्त रूप से जटिल एपीआई में कुछ समय के लिए उपयोग किए जाने के बाद तक खामियों की खोज नहीं की जाएगी। हमारे विकल्प:

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

पदावनति इन विकल्पों में से सबसे पवित्र है।


12

नाह। पदावनति वास्तव में एक अच्छी बात हो सकती है। यह पुराने बेकार सामान के साथ फंसने से प्रौद्योगिकियों को रखता है।

बस सी ++ क्षेत्र में, मुझे याद है कि Microsoft के "फीचर" में स्टेटमेंट के लिए वेरिएबल डिक्लेरेशन को सही ढंग से सपोर्ट नहीं करना है। यह लगभग एक दशक तक चला और बहुत सारे कोड को गैर-पोर्टेबल बना दिया। यह एक "सुविधा" है मुझे खुशी है कि पदावनत कर दिया गया।

आमतौर पर, Apple की आदत है कि 80 के दशक के बाद से पुराने पुराने एपीआई को "डिप्रेकेटेड" के रूप में चिह्नित करने के लिए 5-7 साल के लिए उन्हें खाली करने से पहले। मैं सिर्फ WWDC में एक Apple इंजीनियर के साथ प्राचीन क्विक सी एपीआई के कुछ पदावनत करने के बारे में बात कर रहा था, और यह सुनकर बहुत खुशी हुई कि वे ऐसा कर रहे हैं, क्योंकि 1990 के आसपास विकसित एक मॉडल के लिए निरंतर समर्थन पूरी तरह से बाधा डाल रहा था कि कोई क्या करने में सक्षम होगा। आधुनिक 64-बिट मल्टीकोर सीपीयू पर करने के लिए।

व्यवहार में, यह कंपाइलर लेखकों को एक लंबे समय के लिए auto_ptr डंप करने के लिए ले जा रहा है, और वे शायद एक या दो दशक के लिए कुछ पीछे-संगतता मोड का समर्थन करेंगे, लेकिन यह एक अच्छी बात है।


11

अगर हम वास्तव में चीजों को हटाना चाहते हैं, तो मैं प्रिंटफ को नामांकित करता हूं ()

printfएक उपयोगी कार्य है। यह चीजों को iostreams की तुलना में कम प्रारूपित करने की अनुमति देता है। और यह एक सी फ़ंक्शन है। C ++ मौजूद है और इसका उपयोग किया जाता है, क्योंकि यह सी के साथ संगत है, इसलिए यह printfकम उपयोगी लगता है।

तो, किसी और विरोधी अपव्यय के लिए ऊपर है?

समिति को वर्तमान पदावनति के वर्तमान अर्थों में से कुछ समस्याओं के बारे में पता है। डिप्रेसेशन का अर्थ देखें ।


5

भाषाओं और एपीआई को आगे बढ़ना है। भले ही कुछ पुरानी सुविधा के आधार पर एक टन कोड हो सकता है, लेकिन कुछ करने का एक नया और बेहतर तरीका हो सकता है और पुरानी सुविधा का समर्थन करने की लागत बहुत अधिक है।

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

और अगर यह एक पुराना प्रोग्राम है जिसे आप अपडेट नहीं करना चाहते हैं, तो कुछ भी आपको पुराने एपीआई (या इस मामले में संकलक) का उपयोग करने से नहीं रोक रहा है।


1

यह खड़ा है, पदावनति के कम से कम दो अर्थ हैं।

  • इसे भविष्य के संस्करण में हटा दिया जाएगा
  • हमने बेहतर विकल्प बनाए और अब यह सुविधा बेमानी है (लेकिन पूरी तरह से बेकार नहीं)। भाषा सीखने के दौरान नए लोग इसे छोड़ देंगे; हालाँकि, इसे जल्द ही हटाया नहीं जाएगा।

मुझे लगता है कि स्टेटिक बाद की श्रेणी में आता है, लेकिन केवल समय ही बताएगा कि क्या ऑटो_प्रटर वास्तव में हटाए जाने के योग्य है या अगर इसे भाषा में रखना बेहतर है।


0

डेप्रिसिएशन हानिकारक नहीं है यदि किसी विकल्प पर जाना 1 कार्य दिवस में किया जा सकता है: उदा। सरल खोज / पुराने फ़ंक्शन को नए के साथ बदलना, या संगतता परत को स्थापित करना आसान है।

अगर आपको डेप्रिसिएशन की वजह से सॉफ्टवेयर के बड़े हिस्से को फिर से लिखने की जरूरत है, तो यह हानिकारक है।

एक अच्छा उदाहरण शायद PHP का mysql API होगा, मूल रूप से आपको बस सभी mysql_ * को mysqli_ * से बदलना होगा और उन्हें एक लिंक आईडी प्रदान करना होगा और यह हो गया है।

एक बुरा उदाहरण है डिप्रेशन और रिमूवल glBegin, glEnd, और OpenGL से सभी मैट्रिक्स कम्प्यूटिंग सामान, यदि आप चाहते हैं कि आपका कोड OpenGL3 या इसके बाद के संस्करण पर काम करता है, तो आपको ओवरफ़्लो बफ़र्स का उपयोग करने के लिए पूरे रेंडरिंग कोड को फिर से लिखना होगा।


-1

मुझे लगता है कि यह लोगों को यह बताने का एक अच्छा तरीका है कि एक बेहतर तरीका है। मैं सिर्फ एक समारोह में गायब होने के बजाय एक अच्छा पदावनति पसंद करता हूं।

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