क्या हमें भाषा की उन विशेषताओं से बचना चाहिए जो C ++ में हैं लेकिन जावा नहीं है?


110

मान लीजिए कि मैं परियोजना में पर्यावरण द्वारा सी ++ का उपयोग करने के लिए सीमित हूं। क्या यह कुछ भाषा सुविधाओं के उपयोग को रोकने के लिए अच्छा है जो C ++ के पास है, लेकिन जावा में नहीं है (जैसे: एकाधिक वंशानुक्रम, ऑपरेटर ओवरलोडिंग)?

मुझे लगता है कि कारण हैं:

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

क्या यह सच है?


7
यदि आप अपने सुझावों को देखते हैं तो आप एक कोडिंग मानक बनाने की बात कर रहे हैं। यह तथ्य कि आप एक मानक बना रहे हैं और उसका अनुसरण कर रहे हैं, वास्तव में वह है जो स्थिरता को बढ़ाने वाला है।
ब्रैंडिन

63
क्या जावा कोड को भी सुविधाओं तक सीमित रखा जाना चाहिए, जो C ++ भाषा में भी पाए जाते हैं? इसलिए उदाहरण के लिए जावा volatile, पैकेज-प्राइवेट क्लास मेंबर एक्सेस, रिफ्लेक्शन / इन्ट्रोस्पेक्शन, आखिरकार-ब्लॉक, चेक किए गए अपवाद, इत्यादि का उपयोग न करें? संपूर्ण प्रश्न प्रकार बहुत मायने नहीं रखता ... C ++ और Java सतही रूप से समान हैं, लेकिन अंततः बहुत भिन्न भाषाएं हैं।
हाइड

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

72
यदि आप जावा चाहते हैं, तो जावा का उपयोग करें। यदि आप C ++ का उपयोग करते हैं, तो C ++ सिंटैक्स के साथ जावा के कुछ भयानक, मुड़ नकल नहीं, C ++ का उपयोग करें। C ++ का उपयोग करना लेकिन अपने आप को जावा के फीचर सेट तक सीमित रखना आपको दोनों दुनिया के सबसे बुरे हिस्से देता है।
जेरी कॉफिन

11
आप आश्चर्यचकित होंगे कि अंतर कितनी तेजी से आपको (और कठोर ) काटेगा । जावा और C ++ में बहुत अलग चीजें SomeObject a = previousObject;करता है। जावा में यह एक संदर्भ की प्रतिलिपि बनाता है, जबकि C ++ में यह ऑब्जेक्ट को कॉपी करता है। जावा में, संशोधन भी पिछली वस्तु को प्रभावित करेगा। C ++ में, आपके पास दो अलग-अलग ऑब्जेक्ट हैं। a
क्लॉकवर्क-

जवाबों:


307

नहीं, यह बहुत ही भ्रामक और भ्रामक है।

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

6
हाल ही में डेवलपर्स द्वारा किसी भाषा में कोड की समीक्षा करने के बारे में एक सवाल था जिसे वे सामान्य रूप से नहीं लिखते हैं। मुझे लगता है कि यहां की समझदारी यहां लागू होती है: एक अच्छा डेवलपर किसी भी भाषा के बारे में कई बुनियादी गलतियां करेगा, लेकिन प्रत्येक भाषा में इतने सारे आधार होते हैं कि अधिकतम लाभ तब प्राप्त होता है जब भाषा के डेवलपर समीक्षा करते हैं। यह और भी सही है यदि आपका C ++ "केवल जावा सुविधाएँ" है।
corsiKa

5
+1 अपने दूसरे बिंदु के अलावा। ओपी को "C ++ बेस्ट प्रैक्टिसेस" के बारे में पढ़ने के लिए समय निकालना चाहिए ताकि यह तय किया जा सके कि उन्हें किन विशेषताओं का उपयोग करना चाहिए। C ++ के बारे में मेरी अंतिम जानकारी यह है कि फ्रेंड फ़ंक्शंस और मल्टीपल इनहेरिटेंस को बैड प्रैक्टिस माना जाता है । यदि आप उन्हें बुद्धिमानी से उपयोग करते हैं तो टेम्प्लेट और ऑपरेटर ओवरलोडिंग जैसी चीजें आईएमएचओ की अच्छी प्रथाएं हैं।
some_coder

4
@some_coder: यह सब जानने की बात है कि कब और कहां। जब मैं नीति-आधारित प्रोग्रामिंग करता हूं, तो मुझे अपने मेजबान वर्ग की संरचना का विस्तार करने के लिए (संभवतः कई) नीति वर्गों से विरासत में मिलती है, जिन सदस्यों को उन नीति वर्गों को कार्य करने की आवश्यकता होती है। यह सिर्फ यह है कि यह कैसे काम करता है। इसके अलावा, operator<<( ostream &, T const & )आमतौर पर के माध्यम से लागू किया जाता है friend। यह एक अच्छी भाषा की विशेषता के बारे में कंबल बयानों के साथ समस्या है और एक बुरा क्या है: वे अच्छी सलाह हैं, जब वे नहीं हैं ...
DevSolar

142

सिर्फ इसलिए कि सिंटैक्स सतह पर समान लगता है इसका मतलब यह नहीं है कि दो भाषाएं संगत हैं।

1, 4 और 5 वास्तव में एक ही प्रश्न हैं:

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

क्या होगा यदि आपके नेता तय करते हैं कि आप जावा के बजाय C # को पोर्ट करने जा रहे हैं? न केवल C # ऑपरेटरों को ओवरराइड करने का समर्थन करता है, बल्कि यह डिफ़ॉल्ट भी है - यदि आपको obj.Equals(obj2)इसके बजाय लोगों को उपयोग करने की आवश्यकता हो obj == obj2, तो लोग हर समय गलतियाँ करने जा रहे हैं। यहां तक ​​कि अगर आप केवल दो भाषाओं की सामान्य विशेषताओं के लिए रखते हैं, तो अलग-अलग अपेक्षाएं हैं , एक अलग संस्कृति है। यदि आप if (myField == null)C ++ में ऐसा कुछ करते हैं, तो लोग आपको तुरंत एक नौसिखिया देखने जा रहे हैं। यदि आप if (null == myField)C # में उपयोग करते हैं, तो लोग यह देखने जा रहे हैं कि आप वास्तव में C # मूल नहीं हैं - C डेवलपर्स ने "फ़्लिप" संस्करण का उपयोग करने का जो कारण सीखा है वह अब C # में मौजूद नहीं है।

आपके तर्क का उपयोग करते हुए, हमें मशीन कोड या असेंबली या COBOL के साथ फंस जाना चाहिए, क्योंकि कभी पास्कल जैसी चीज़ में क्यों बदल जाता है, जब यह सिर्फ नई सुविधाएँ जोड़ता है जो आपके प्रोग्रामर को सीखना होगा? हम कभी SQL जैसी किसी चीज़ का उपयोग क्यों करेंगे, जब उसमें लूप भी नहीं है ? जब हम SQL में लूप और X नहीं करते हैं तो हम SQL के अलावा कुछ और क्यों इस्तेमाल करेंगे ?

जावा प्रोग्रामर द्वारा C ++ कोड निश्चित रूप से बनाए नहीं रखा जा सकता है। मैं समझ नहीं पा रहा हूं कि आपको यह विचार कहां मिला है - जब आप C ++ को केवल उन सुविधाओं तक सीमित कर देते हैं जो जावा के समान ही काम करती हैं? आप विधि कॉल भी नहीं करने जा रहे हैं - फ़ंक्शन कॉल भी नहीं । फिर से, सिर्फ इसलिए कि दोनों लँगुआ घुंघराले ब्रेसिज़ का उपयोग करते हैं, इसका मतलब यह नहीं है कि भाषाएँ किसी भी तरह से विनिमेय हैं।

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

हम विभिन्न भाषाओं का उपयोग करते हैं क्योंकि वे हमें समस्याओं को हल करने के लिए उपकरणों का एक अलग सेट देते हैं। यदि आपको "हर जगह" कार्य करने वाले निष्पादन योग्य की आवश्यकता है, तो जावा के साथ जाएं। यदि आप ऐसा कोड चाहते हैं जो "हर जगह" संकलन करता है , तो C ++ ठीक काम करता है। यदि आप ऐसा कोड चाहते हैं जो समझने और पार्स करने में आसान हो, तो LISP या जो भी हो। लेकिन मैं आपको एक बात बता सकता हूं - एक भाषा में कोड लिखना जैसे कि आप इसे दूसरे में लिख रहे थे हमेशा एक गलती है, और आप पीड़ित होंगे। यह उल्लेख नहीं करने के लिए कि जब आप वास्तव में एक सी ++ आदमी को किराए पर लेते हैं, तो वह दूसरा चलाने जा रहा है जिसे वह "जावा-ईश संगत" कोड देखता है। और ... जावा पुरुष भी ऐसा ही करने जा रहा है। तुम्हें पता है, यहां तक ​​कि "जानना" दोनों सी ++ और जावा, मैं नरक की तरह भागूंगा :)

मुझे वास्तव में एक पास्कल डेवलपर द्वारा लिखे गए (सादे) सी कोड पर काम करना था, जो आपको लगता है कि ऐसा लगता है। उन्होंने #defineपास्कल की तरह दिखने और महसूस करने के लिए सी को फिर से परिभाषित करने के लिए उपयोग किया , "बेगिन ट्रांसलेट्स टू {" जैसी चीजों के साथ पूरा किया। परिणाम बल्कि पूर्वानुमेय था - कोड जो कि न तो सी और न ही पास्कल डेवलपर्स समझ सकता है, और बग से भरा हुआ है जो सी और पास्कल के शीर्ष पर पास्कल के "अमूर्त" लीक के परिणामस्वरूप थे और पास्कल और सी आज के दृष्टिकोण से लगभग समान हैं। यहाँ तक कि C <-> C ++ बहुत अधिक अंतर है, और यह अभी भी C ++ <-> Java जैसी किसी चीज़ के लिए मूंगफली है।


9
"यदि आप ऐसा कोड चाहते हैं जो समझने और पार्स करने में आसान हो, तो LISP या जो भी हो।" मैं इससे सहमत नहीं हूँ। लिस्प पार्स करने के लिए तुच्छ है, लेकिन ठीक इसी वजह से - क्योंकि यह ऐसे समय में बनाया गया था जब पार्सर्स और उन्हें प्रभावी रूप से बनाने के पीछे के सिद्धांतों का ज्ञान अभी भी अपनी प्रारंभिक अवस्था में था, और इसलिए वे घबरा गए और सबसे हास्यास्पद सरल बात के साथ चले गए संभवतः यह काम कर सकता है - आपको आधुनिक भाषाओं के बहुत से वाक्यगत लाभ नहीं मिलते हैं। तो यह पार्स करना आसान है, लेकिन समझना आसान नहीं है । एक कारण है कि लोग इसे "सुपरफ्लुएंस कोष्ठकों में खोया हुआ" कहते हैं।
मेसन व्हीलर

9
@MasonWheeler यह स्वाद का मामला है - सी प्रोग्रामर ने इसे बुलाया है, लिस्पर्स नहीं: पी। कोष्ठकों की गणना करें - आपके विशिष्ट C ++ प्रोग्राम में लगभग उतने ही हैं। वास्तविक अंतर उनकी स्थिति ( myFunc()बनाम (myFunc)) है, और इसका एक बहुत अच्छा कारण है। LISP- आधारित भाषाएँ अभी भी बहुत लोकप्रिय हैं, खासकर गणित / भौतिकी के लोगों के साथ। मुख्य बात यह है कि LISPy भाषाएँ आधुनिक C- शैली प्रोग्रामर के लिए बहुत अपरिचित हैं - लेकिन शायद ही इसे अनदेखा करने का कोई कारण हो। स्कीम, क्लोजर, और एक हद तक एमएल-आधारित भाषाएँ (OCaml, F # ...) वास्तव में बहुत लिस्प हैं।
लुआं

4
@ Luaan मैं आपको निश्चित रूप से बता सकता हूं कि LISP भौतिकी में लोकप्रिय नहीं है। क्षेत्र में दो प्रमुख भाषाएँ हैं फोरट्रान और C ++। FORTRAN 'लोकप्रिय' है क्योंकि इसमें बहुत सारे पुराने कोड लिखे गए थे, लेकिन लगभग सभी नए प्रोग्राम C ++ में लिखे गए हैं। एक शोध भौतिक विज्ञानी के रूप में, मैंने एक बार भी एलआईएसपी कार्यक्रम का सामना नहीं किया या सुना भी नहीं है। यह कहने के लिए कि वे मौजूद नहीं हैं, लेकिन भाषाएँ निश्चित रूप से लोकप्रिय नहीं हैं ।
जेम्स मटका

4
@ Luaan हमें और अधिक सॉफ्टवेयर डेवलपर्स की आवश्यकता हो सकती है या नहीं। हमें निश्चित रूप से अधिक सीएस स्नातकों की आवश्यकता नहीं है। यह कहने जैसा है कि "हमें अधिक संरचनात्मक इंजीनियरों की आवश्यकता है, इसलिए हमें अधिक सैद्धांतिक भौतिकी स्नातकों की आवश्यकता है।"
माइल्स रुट

4
@ user1717828 यह गलत लिख के रमणीय प्रभाव से बचने के है if (myField == null)के रूप में if (myField = null)है, जो ठीक C / C ++ संकलन होगा, लेकिन शायद नहीं तुम क्या इरादा है। दूसरी ओर, if (null = myField)एक त्रुटि फेंक देंगे, क्योंकि आप एक निरंतर को असाइन नहीं कर सकते।
वलेरिन

94

मैं आपके प्रश्नों का उत्तर क्रम से दूंगा।

  1. यदि जावा एक ऐसी सुविधा प्रदान नहीं करता है जो C ++ के पास है, तो इसका मतलब है कि यह सुविधा अच्छी नहीं है, इसलिए हमें इसका उपयोग करने से रोकना चाहिए।

हां, हार्ड ड्राइव पर जावा में मौजूद कोई भी फीचर एंथम नहीं है। इसे आपके कोड आधार से जला दिया जाना चाहिए। जो लोग नहीं मानते हैं, उनकी जांच की जाएगी, उनकी आत्माएं आरएडी देवताओं को गिरवी रखती थीं।

  1. C ++ विशिष्ट सुविधाओं के साथ C ++ कोड (जैसे: मित्र कार्य, एकाधिक उत्तराधिकार) केवल C ++ प्रोग्रामर द्वारा बनाए रखा जा सकता है या इसकी समीक्षा की जा सकती है, लेकिन अगर हम सिर्फ जावा की तरह C ++ लिखते हैं (C ++ भाषा विशिष्ट सुविधा के बिना), तो कोड को बनाए रखा जा सकता है या दोनों की समीक्षा की जा सकती है। सी ++ और जावा प्रोग्रामर।

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

  1. आपको किसी दिन जावा में कोड बदलने के लिए कहा जा सकता है

सच! लेकिन जावा पर रोक क्यों? आपको एक दिन कोड को मूल, कोडांतरक और / या पर्ल में बदलने के लिए कहा जा सकता है। जैसा कि वहाँ की हर भाषा में perl दुभाषिए हैं, बस अपने प्रोग्राम को एक लम्बी perl string के रूप में लिखें, और पसंद की भाषा में इस पर मार्शल तर्क दें।

अब जब आपको भाषाओं को बदलने की जरूरत है, तो केवल पर्ल स्ट्रिंग को लपेटने वाले कोड को फिर से लिखें।

  1. C ++ विशिष्ट विशेषताओं के बिना कोड आमतौर पर अधिक बनाए रखने योग्य है

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

  1. हर C ++ भाषा की विशिष्ट सुविधा (उदाहरण: एकाधिक वंशानुक्रम) में जावा में लागू होने के विकल्प होने चाहिए। यदि ऐसा नहीं होता है, तो इसका मतलब है कि डिज़ाइन पैटर्न या कोड आर्किटेक्चर समस्याग्रस्त है।

C ++ भाषा की विशिष्ट विशेषताओं का वास्तव में एक मूल्यवान उपयोग है। जैसा कि वे जावा नहीं हैं, वे एंथम हैं, और जो लोग इसका उपयोग करते हैं वे ब्रांडेड हेरेटिक्स हो सकते हैं। यदि C ++ में वे भाषा विशेषताएँ नहीं होतीं, तो आप उन लोगों को नहीं खोज पाएंगे जिन्हें आपको त्यागने की आवश्यकता है। C ++ लैंग्वेज फीचर्स की प्रॉब्लम सॉल्व करते हैं!


देखो, C ++ और Java में क्षमताओं का एक अलग सेट है। C ++ और Java के चौराहे पर प्रोग्रामिंग करने से कोड आता है जिसने दोनों भाषाओं के अधिकांश फायदों को दूर कर दिया है ।

जावा को आंशिक रूप से C ++ सुविधाओं के कुछ दुरुपयोग की प्रतिक्रिया के रूप में विकसित किया गया था। इसका मतलब यह नहीं है कि प्रतिक्रिया उचित थी, विशेष रूप से बाद में जब विशेषताएं परिपक्व हो गई हैं।

आप ऑपरेटर ओवरलोडिंग के साथ भयानक चीजें कर सकते हैं; लेकिन कोई भी भाषा भयानक कोड को भाषा में लिखे जाने से नहीं रोक सकती है, जब तक कि वह सभी कोड को भाषा में लिखे जाने से नहीं रोकता है।

और आप ऑपरेटर ओवरलोडिंग के साथ बहुत सुरुचिपूर्ण चीजें भी कर सकते हैं। साधारण चीजें, जैसे एक जटिल संख्या या मैट्रिक्स वर्ग जो जटिल संख्या या मैट्रिक्स की तरह काम करती है।

जावा में उपलब्ध C ++ सुविधाओं का उपयोग करने के बारे में सावधानी के साथ सावधानी बरतनी चाहिए। सिर्फ इसलिए कि आपके वर्तमान कौशल स्तर पर डेवलपर्स के आपके मौजूदा सेट को एक सुविधा समझ में नहीं आती है इसका मतलब यह नहीं है कि इसका उपयोग कभी नहीं किया जाना चाहिए; उसी समय, सिर्फ इसलिए कि आप एक सुविधा का उपयोग कर सकते हैं, इसका मतलब यह नहीं है कि आपको चाहिए। हालांकि, एक जावा-भारी दुकान में, बाधाओं का प्रतिरोध अधिक मजबूत होगा, क्योंकि यह गैर-जावा-एस्क सुविधाओं के खिलाफ होना चाहिए।

भाषाओं के बीच कोड का रूपांतरण एक रीराइट के साथ सबसे अच्छा किया जाता है, चाहे वे संरचनात्मक रूप से समान हों। इस तरह के पुनर्लेखन के बिना ऐसा करने का कोई भी प्रयास बुरी तरह विफल होने वाला है।

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

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

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

आधुनिक C ++ वह सब नहीं है जो जावा जावा की तरह भाषा का अनुकरण और अस्वीकार करता है। एक भाषा की सुविधाओं से बंद न हों; कोई "एक सच्ची भाषा" नहीं है। नई भाषाओं और उनकी विशेषताओं के बारे में जानें और उनकी विशिष्टता को अवशोषित करें।


1
-1, लंबे समय से घुमावदार और अस्पष्ट।
djechlin


28
+1, पूछे गए प्रश्नों का उचित विघटन और मुझे हंसी आती है :)
बिल्ली

11
+1। प्रफुल्लित लेकिन बात रखता है। वास्तव में इसे पढ़ने वाले लोगों के लिए अत्यधिक स्पष्ट है।
लुइस मूसली

14
"C ++ और जावा के चौराहे पर प्रोग्रामिंग करने से कोड में परिणाम होता है जिसने दोनों भाषाओं के अधिकांश लाभों को दूर कर दिया है।" बहुत सटीकता से! +1
Ajedi32

56

मैं सिर्फ आपके कारणों का जवाब देने वाला हूं:

  1. मुझे समझ में नहीं आता कि आप उस निष्कर्ष पर कैसे आए। अलग-अलग भाषाओं की अलग-अलग विशेषताएं होती हैं। गुंजाइश, भाषा की वास्तुकला, कभी-कभी रचनाकारों की वरीयताओं और कई और कारणों पर निर्भर करता है। किसी भाषा की कुछ विशेषताएं खराब हो सकती हैं, लेकिन आपका सामान्यीकरण सादा गलत IMHO है।
  2. जावा की तरह ही C ++ लिखने से भी बदतर कोड हो सकता है। जैसे आजकल C ++ 11 के साथ मैं नए / डिलीट का उपयोग करने से बचता हूं, लेकिन साझा पॉइंटर्स का उपयोग करता हूं। आपके परिदृश्य में मैं केवल नए / हटाए जाने पर निर्भर रहूंगा। यदि आपके प्रोग्रामर केवल जावा को समझते हैं, तो उन्हें प्रशिक्षित करें या बेहतर किराए पर लें।
  3. क्या ऐसा होने वाला है? आप पहले स्थान पर जावा में क्यों नहीं लिखते हैं? मुझे लगता है कि एक नई भाषा में खरोंच से कार्यक्रमों को फिर से लिखना आमतौर पर एक बुरा विचार है और आपको इस तरह के जोखिम के लिए वास्तव में अच्छे औचित्य की आवश्यकता होगी।
  4. यह सिर्फ एक धारणा है।
  5. अपने परिदृश्य या उपयोग के मामले में IMHO को अत्यधिक निर्भर करता है।

27
और जावा-प्रोग्रामर भी उपयोग नहीं करेंगे delete
पाओलो एबरमन

8
मुझे जावा प्रोग्रामर के बारे में पता नहीं होने के कारण मेमोरी लीक को ठीक करना पड़ा है delete। कम से कम एक मामले में मुझे जो याद आता है, उसमें से डायनामिक आवंटन ( new) की भी जरूरत नहीं थी।
एथन कमिंसकी

16
@EthanKaminski हाँ, यह है कि आप आसानी से एक C ++ नौसिखिया को कैसे स्पॉट कर सकते हैं, विशेष रूप से कोई है जो जावा पृष्ठभूमि या इसी तरह से आता है। सब कुछ के लिए नया प्रयोग बंद करो, अरे!
लुअन

1
@ Pa @loEbermann हाँ, और भी बुरा।
शमौन

1
"आपके परिदृश्य में, मैं केवल नए / हटाए जाने पर भरोसा करूंगा" - मजाकिया, मैंने सोचा होगा कि एक "जावा (जैसे) -सुविधा केवल" सी ++ मुहावरे का विशेष रूप से उपयोग करना होगा make_shared
काइल स्ट्रैंड

26

जावा में ऐसी विशेषताएं हैं जो C ++ किसी अंतर्निहित, तेज, विश्वसनीय कचरा संग्राहक, एकल-रूट ऑब्जेक्ट पदानुक्रम और शक्तिशाली आत्मनिरीक्षण की तरह नहीं करता है।

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

C ++ में अंत में ब्लॉक या कचरा संग्रह नहीं है। यदि आप जावा में मौजूद नहीं हैं, तो आप विध्वंसक का उपयोग नहीं करते हैं (मैं अंतिम रूप से गिनती नहीं करता हूं), आप संसाधन प्रबंधन (यानी सभी मैनुअल) के सी स्तर पर हैं, सिवाय इसके कि आप अपना सफाई समूह भी नहीं बना सकते हैं एक सफाई ब्लॉक में जो आपको गोटो में मिला है, क्योंकि जावा में गोटो नहीं है। क्या आप वास्तव में सोचते हैं कि स्थिरता में सुधार होता है?

जावा में एक अतिव्यापी वस्तु पदानुक्रम है जहां हर वर्ग अंततः वस्तु से निकलता है, और कुछ आदिम प्रकार ऐसे वर्गों में भी ऑटो-बॉक्स किए जा सकते हैं। यह ऑब्जेक्ट को एक बार पॉइंट करने के लिए ऑब्जेक्ट्स के कंटेनरों को लिखने में सक्षम बनाता है। जावा 5 ने जेनरिक की शुरुआत की, जो ऐसे कंटेनरों से छुटकारा दिलाते हैं, जो आवश्यक होते हैं, लेकिन फिर भी बहुत समान कोड को संकलित करते हैं।

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

एक सभ्य भाषा में कई विशेषताएं होती हैं जो एक साथ काम करने के लिए डिज़ाइन की जाती हैं। भाषा A से सुविधाओं को मना करने के कारण क्योंकि भाषा B के पास उन्हें नहीं है, आप भाषा A को अपंग कर रहे हैं, क्योंकि आप B से सुविधाओं को जोड़ने के लिए एक ही समय में नहीं हैं जो B को सुसंगत बनाते हैं।

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


27
अनुभवी सी ++ दिग्गज आमतौर पर Google कोडिंग दिशानिर्देशों को अस्वीकार करते हैं। आधुनिक C ++ वास्तव में बेहतर है क्योंकि यह उन विशेषताओं का उपयोग करता है। हां, यह इसे और भी अलग बनाता है।
Jan Hudec

17
ध्यान दें कि C ++ में अंत में ब्लॉक नहीं हैं, लेकिन इसमें RAII है, जो ज्यादातर मामलों के लिए बेहतर है। और, फिर से, अलग।
Jan Hudec

7
जावा के अधिकांश उपयोगों के लिए Objectबहुत अधिक है void*- फिर भी, yuck।
क्वेंटिन

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

2
मैं इस उत्तर को सही राह में होने के लिए उकसाऊंगा ("ऐसा मत करो"), लेकिन मैं मूल आधार नहीं खड़ा कर सकता कि जावा किसी भी तरह C ++ की तुलना में "अधिक उन्नत" है। सी ++ नहीं है की जरूरत है एक कचरा कलेक्टर या एक एकल जड़ वस्तु पदानुक्रम, उसी तरह जावा की जरूरत नहीं है ... अरे ... खेद मैं क्योंकि मैं कैसे, वाक्य पूरा करने के लिए पता नहीं है याद आती है जावा में नियतात्मक विनाशकर्ता, और finallyउनके लिए एक प्रतिस्थापन नहीं है। दोनों भाषाएँ बस मौलिक रूप से भिन्न हैं।
DevSolar

25

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

जावा और C ++ के बीच अंतर उन विवरणों की तुलना में बहुत गहरा है, जिन पर आपने ध्यान केंद्रित किया है।

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

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

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

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

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


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

संभवतः जहां आप कहते हैं "आवश्यकता हो सकती है", आपका वास्तव में मतलब है: "आवश्यकता नहीं हो सकती है"? ऐसा मानकर, तो मैं सहमत होना चाहूंगा।
जेरी कॉफिन

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

4
@supercat: OTOH, जावा को समर्थन करने वाले प्लेटफ़ॉर्म की संख्या नहीं बल्कि C ++ को देखते हुए, यह मुझे समस्या की तलाश में लगभग पूरी तरह से समाधान के रूप में प्रभावित करता है।
जेरी कॉफिन

थोड़ी देर के लिए, जावा एप्लेट के लिए ब्राउज़र समर्थन C ++ एप्लेट के लिए बेहतर था। जावास्क्रिप्ट (जावा से कोई संबंध नहीं) के लिए ब्राउज़र समर्थन, हालांकि, काफी सुधार हुआ है कि यह मूल रूप से दोनों से लिया गया है।
सुपरकैट

11

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

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

भविष्य में इस कोड को बनाए रखने के लिए किसी को काम पर रखने की कल्पना करें। यदि यह अच्छा C ++ कोड है, तो आप सक्षम C ++ डेवलपर को काम पर रख पाएंगे और उन्हें अपना रास्ता खोजने में सक्षम होना चाहिए। यदि यह "सी ++ में जावा" है, तो न तो सी ++ और न ही जावा डेवलपर्स को कोड को समझने में आसान समय होगा।


7

आपके सभी कारण अस्वीकृत हो सकते हैं:

यदि जावा एक ऐसी सुविधा प्रदान नहीं करता है जो C ++ के पास है, तो इसका मतलब है कि यह सुविधा अच्छी नहीं है, इसलिए हमें इसका उपयोग करने से रोकना चाहिए।

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

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

ओह यह हो सकता है? आइए देखें सरलतम C ++ कोड:

int len = mystring->size();

ओह, कोई "भाषा-विशिष्ट" सुविधाओं का उपयोग नहीं किया गया है, फिर भी यह जावा देवों द्वारा पहले से ही अस्वीकार्य है! क्योंकि जावा में आप के साथ "dereference" है। यहाँ पर यह "-> है।

आपको किसी दिन जावा में कोड बदलने के लिए कहा जा सकता है

या सी #। या हास्केल। या अजगर। या रूबी। या COBOL (हाँ, आप कर सकते हैं!)। आप भविष्य को कैसे बता सकते हैं?

C ++ विशिष्ट विशेषताओं के बिना कोड आमतौर पर अधिक बनाए रखने योग्य है।

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

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

लेकिन जावा में कई विरासत हैं! इसे "इंटरफ़ेस" कहा जाता है। सब कुछ प्राप्त करने से होने वाले खूंखार हीरे से बचने के लिए जावा कार्यान्वयन एक समस्याग्रस्त समाधान है Object। यह शुरू करने से किया जाता है interfaceजिसका एकमात्र उद्देश्य कुछ ऐसा होना है जो इससे प्राप्त नहीं होता है Object। C ++ को यह समस्या कभी नहीं हुई - कोई अनिवार्य आधार नहीं है इसलिए हर वर्ग खूंखार हीरे के बिना एक इंटरफ़ेस के रूप में कार्य कर सकता है।

साइड नोट: जावा ने हाल ही में शुरू किया ... इंटरफेस में ठोस तरीके। एक विशेषता C ++ हमेशा एक समस्या को हल करने के लिए थी जो कभी नहीं थी।

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

नीचे पंक्ति: स्वच्छ कोड स्वच्छ कोड है। जावा या सी ++ - समान अंतर। बस इसे सरल रखें। अनावश्यक जटिलताएं खराब कोड का प्रमुख कारण हैं।


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

@ सुपरकैट मुझे समझ नहीं आ रहा है कि आप यहाँ ऐसा क्यों कह रहे हैं। सवाल जावा सुविधाओं के बारे में नहीं है जिसे C ++ में पुन: प्रस्तुत नहीं किया जा सकता है, यह C ++ सुविधाओं के बारे में है जो जावा ने खारिज कर दिया है।
Agent_L

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

6

नहीं, आपको आमतौर पर C ++ नहीं लिखना चाहिए क्योंकि यह जावा था, और आपको निश्चित रूप से जावा में मौजूद सी ++ भाषा सुविधाओं को छोड़ना नहीं चाहिए ।

एक बात के लिए, जावा कचरा एकत्र किया गया है, और इस तरह C ++ "हटाएं" कीवर्ड के बराबर नहीं है। ठीक है, इसलिए आप बिना किसी कार्यक्रम को लागू किए, क्योंकि आपके नियमों के अनुसार, इसकी अनुमति नहीं है।

बधाई हो, अब आपके पास मेमोरी लीक है;)। यह सैद्धांतिक नहीं है, या तो - मैंने देखा है कि यह सटीक स्थिति एक ओपन सोर्स गेम में होती है।

इसी तरह, जावा में C ++ पॉइंटर्स की तरह कुछ भी नहीं है, जो कि बहुत सारे सामान्य फ़ंक्शन कॉल सम्मेलनों को नियमबद्ध करता है।

सी ++ की विशेषताएं हैं जिन्हें आपको शायद (नीचे देखें) से बचना चाहिए, लेकिन "जावा में नहीं" एक अच्छा लिटमस टेस्ट नहीं है।


बेहतर दिशा-निर्देश निम्नलिखित होंगे:

  1. वह कोड लिखें जो आपकी भाषा, वातावरण और औजारों के लिए उपयुक्त हो।
  2. कोड लिखें जिसे आपकी टीम समझ सकती है।
  3. सुनिश्चित करें कि आपकी टीम दिए गए डोमेन में सक्षम है।

आइटम (3) का मतलब है कि आपके पास C ++ में जावा प्रोग्रामर कोड बिना C ++ में नहीं होना चाहिए। कुछ सूक्ष्म लेकिन बहुत महत्वपूर्ण अंतर हैं जो वे नहीं सीख सकते यदि वे जावा की एक अजीब बोली की तरह व्यवहार करना चाहते हैं।

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


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


6

अन्य उत्तरों में पहले से ही कुछ अच्छे अंक हैं, लेकिन मैं आपके प्रश्नों और कथनों को व्यक्तिगत रूप से संबोधित करते हुए अधिक संपूर्ण उत्तर प्रदान करना चाहूंगा।


यदि जावा एक ऐसी सुविधा प्रदान नहीं करता है जो C ++ के पास है, तो इसका मतलब है कि यह सुविधा अच्छी नहीं है, इसलिए हमें इसका उपयोग करने से रोकना चाहिए।

यह बहुत अच्छी तरह से उत्तर दिया गया है: जावा C ++ का "अच्छा भाग" नहीं है, और न ही ऐसा सोचने का कोई कारण है।

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

जावा 8 में भी थोड़ा गहरा खुदाई करने के लिए, लैम्ब्डा-एस-क्लोजर C ++ 14 के लैम्ब्डा की तरह लचीला नहीं है, लेकिन यह जेवीएम आर्किटेक्चर की सीमाओं के कारण हो सकता है कि एक सचेत निर्णय के बजाय अधिक लचीला दृष्टिकोण खराब हो। भाषा-डिजाइन परिप्रेक्ष्य।


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

यह मुख्य बात है जिसका मैं जवाब देना चाहता था।

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

हालाँकि, यह मामला नहीं है कि इस तरह की समीक्षा कभी भी "उन लोगों के लिए" के समान "अच्छी" या "उन डेवलपर्स की समीक्षा के बराबर" होगी जो वास्तव में उस भाषा को जानते हैं जो आप उपयोग कर रहे हैं। अनिवार्य रूप से, ऐसा इसलिए है क्योंकि एक भाषा को दूसरे की तरह देखना आमतौर पर सूक्ष्म अंतर को छिपाएगा, जबकि एक भाषा को दूसरे की तरह व्यवहार करना (विशेष रूप से C ++ और जावा के मामले में) भाषा के लिए अ-मुहावरेदार हो सकता है और / या अभी भी बहुत ही भ्रामक हो सकता है। समीक्षकों के लिए।

पहले, आइए इस बारे में सोचें कि C ++ को "Java" की तरह बनाने का क्या अर्थ होगा। एक साधारण मामले के रूप में, आप newजावा में ठीक उसी तरह वस्तुओं का उपयोग कर सकते हैं :

Foo foo = new Foo();

लेकिन ऑब्जेक्ट्स ->ने .कॉल विधियों के बजाय इस तरह का उपयोग किया है , इसलिए यदि आप जावा की तरह दिखने के लिए विधि कॉल चाहते हैं, तो आपको इसके बजाय लिखना होगा:

Foo& foo = *new Foo();

लेकिन यह अन-आइडियल है; विशेष रूप से, मेमोरी को बाद में उपयोग करके साफ किया जाना चाहिए delete &foo, जो कि कुछ अनुभवी सी ++ देवों को भी महसूस नहीं हो सकता है कि कानूनी कोड है । किसी भी तरह से, वहाँ अजीब गैर जावा की तरह भर में छिड़का प्रतीक हैं, इसलिए हम नहीं कर सकते काफी भाषा जावा "की तरह लग रहे" बनाते हैं। (आप *newका उपयोग करके #define New *new, या इससे भी बदतर हो सकता है #define new *new, लेकिन तब आप अपने साथी डेवलपर्स के लिए आपसे घृणा कर रहे हैं।) और, जैसा कि ऊपर उल्लेख किया गया है, deleteजावा में मौजूद नहीं है, इसलिए किसी भी मामले में (जैसा कि किसी अन्य उत्तर में उल्लेख किया गया है। ) आप वास्तव में ऑब्जेक्ट-उपयोग "लुक" नहीं कर सकते हैं जिस तरह से यह जावा में मेमोरी लीक के बिना करता है।

लेकिन आधुनिक सी ++ में स्मार्ट शेयर्ड पॉइंटर्स शामिल हैं, जो जावा के मेमोरी-मैनेजेड वेरिएबल-रेफरेंस की तरह व्यवहार करते हैं। तो जावा में हर जगह जो आप लिख सकते हैं Foo foo = new Foo();, आप इसके बजाय लिख सकते हैं:

std::shared_ptr<Foo> foo = std::make_shared<Foo>();

अब आप एक भाषा सुविधा का उपयोग कर रहे हैं जो वास्तव में जावा के हुड के नीचे बहुत कुछ है। लेकिन अचानक आपको गैर-सी ++ समीक्षकों को समझाने के लिए बहुत कुछ है: यह shared_ptrसामान क्या है ? सूक्ष्म पेचीदा "गोचा" क्या हैं make_shared? (यह सही-अग्रेषण का उपयोग करता है, जिसमें कुछ विफलता के मामले हैं और "गलत" निर्माता को बुलाया जा सकता है।) तरीकों को क्यों बुलाया जाना चाहिए ->, लेकिन .कुछ तरीकों के साथ उपयोग करने की अनुमति संकलक द्वारा दी जाती है? ( shared_ptrइसकी अपनी विधियाँ हैं।) यदि यह विधि Foo::reset(void)मौजूद है, तो एक अपरिवर्तित डेवलपर इसके साथ कॉल करने का प्रयास कर सकता है foo.reset(), जो (यदि Fooकॉल होने पर उस उदाहरण की ओर संकेत करने वाला केवल एक साझा सूचक है) अंतर्निहित मेमोरी को हटा देगा और nullify करेगा foo, और जावा डेवलपर्स को इस समस्या को पकड़ने की संभावना नहीं है।

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

जावा डेवलपर केवल कोड समीक्षा के माध्यम से इन नुकसानों को खोजने और सही करने में सहायक नहीं होंगे।


आपको किसी दिन जावा में कोड बदलने के लिए कहा जा सकता है।

यह पूरी तरह से मान्य है - सराहनीय, यहां तक ​​कि - यह ध्यान रखने की कोशिश करने के लिए कि डिजाइन चरण में आपके भविष्य में आपके कोड के साथ क्या हो सकता है।

लेकिन, सबसे पहले, यह विशेष रूप से एक दूरस्थ संभावना की तरह लगता है: कोड आमतौर पर या तो फिर से उपयोग किया जाता है (उदाहरण के लिए आप JNI इंटरफेस का उपयोग करके कुछ भविष्य के जावा सॉफ्टवेयर में कुछ या सभी C ++ कोड को प्लग कर सकते हैं) या पूरी तरह से फिर से लिखा जाता है सीधे "मैन्युअल रूप से स्थानांतरित" से।

और, दूसरा, आप बाद में कहते हैं,

हर सी ++ भाषा विशिष्ट सुविधा (जैसे: एकाधिक विरासत) को जावा में लागू करने के लिए विकल्प होना चाहिए ...।

यह अनिवार्य रूप से आपके "जावा में कनवर्ट" बिंदु को रद्द करता है। यदि सॉफ़्टवेयर मुहावरेदार C ++ में लिखा गया है और फिर मुहावरेदार जावा में परिवर्तित हो गया है, तो यह अपेक्षा करने का कोई कारण नहीं है कि यह रूपांतरण जावा सुविधाओं के लिए C ++ सुविधाओं के सटीक एक-से-एक मैपिंग को लागू करके (या) किया जा सकता है।


C ++ विशिष्ट विशेषताओं के बिना कोड आमतौर पर अधिक बनाए रखने योग्य है।

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

... 80% डेवलपर्स भाषा के अधिकांश 20% पर समझते हैं। यह अलग-अलग लोगों के लिए समान 20% नहीं है, इसलिए एक-दूसरे के कोड को समझने के लिए उन पर भरोसा न करें।

कृपया ध्यान दें: यदि आप एक सी ++ प्रशंसक हैं और आप मेरे जवाब में इस बिंदु पर आते हैं और टिप्पणी करने के लिए नीचे कूदने के लिए इच्छुक महसूस करते हैं कि एफक्यूए के लेखक वास्तव में सी ++ को नहीं समझते हैं या उनके अधिकांश तर्कों में अपमानजनक है। , ध्यान दें कि (1) ठीक दो वाक्यों के बाद मैं उसे उद्धृत करता हूं कि मैं स्वीकार करता हूं कि FQA एक बहुत ही पक्षपाती स्रोत है, और (2) यह वास्तव में मेरे लिए क्या कहना चाह रहा है या नहीं, इसके लिए कोई फर्क नहीं पड़ता कि FQA लेखक C ++ को समझता है या नहीं। , और मैं सी ++ को काटने की कोशिश नहीं कर रहा हूं, और आपको बाकी पोस्ट को यह मानकर बिना पढ़ना चाहिए कि मैं सी-सी ++ विरोधी हूं क्योंकि मैंने एफक्यूए उद्धृत किया है। नोट का अंत।

इसी तरह, लिनुस टॉर्वाल्ड्स अनिवार्य रूप से इस कारण से सी ++ से नफरत करते हैं (चेतावनी: लिंक में बहुत सारे शपथ लेना शामिल है, असली बदनाम लिनुस शैली में)।

जाहिर है, ये बात बहुत पक्षपाती है, लेकिन यहां तक ​​कि C ++ के प्रस्तावक भी अक्सर कहते हैं कि आपको भाषा सुविधा-सेट की संपूर्णता का उपयोग नहीं करना चाहिए (एक बार फिर, Google कोडिंग दिशानिर्देश देखें; साथ ही, C ++ के निर्माता Bjarne Stroustrup; , सार्वजनिक रूप से कहा गया है, "सी ++ के भीतर, बाहर निकलने के लिए संघर्ष करने वाली एक बहुत छोटी और क्लीनर भाषा है")।

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

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

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

कोड दिशानिर्देशों के एक सेट के लिए एक और अच्छा प्रारंभिक बिंदु नई सी ++ कोर दिशानिर्देश है , बज़्ने स्ट्रॉस्ट्रुप और हर्ब सटर द्वारा एक कार्य-प्रगति।

C ++ की कमियों से निपटने का एकमात्र तरीका एक अलग भाषा चुनना है। यह आपको जावा की तरह लगता है, और आपको लगता है कि एक मौका है कि यह परियोजना अंततः जावा में परिवर्तित हो सकती है। जैसा कि एक अन्य जवाब में कहा गया है, आप बस ... जावा से शुरू कर सकते हैं।

दो कारण हैं जो आपको वास्तव में जावा के अलावा किसी अन्य चीज़ का उपयोग करने की आवश्यकता हो सकती है :

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

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

मैंने पहले से ही इसे कुछ हद तक संबोधित किया है, लेकिन मैंने जानबूझकर अपना दूसरा वाक्य छोड़ दिया है।

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


5
FQA लेखक निश्चित रूप से "भाषा के अधिकांश 20% पर समझें" समूह में आता है। काफी कुछ गलत है, जो तथ्यात्मक रूप से गलत है, और एक पूरी गुच्छा अधिक है कि बस बिंदु याद आती है, स्ट्रोमैन के बाद स्ट्रोमैन के साथ सचित्र।
बेन वोइगट

2
C ++ FQA में कई (लगभग सभी?) शिकायतें बकवास हैं। आधुनिक भाषाएँ बहुत बड़ी हैं। C ++ पायथन, रूबी, पर्ल और हां, जावा की तुलना में छोटा है। Stackoverflow पर उन भाषाओं में एक बुनियादी प्रश्न पूछें और पहले उत्तर की तर्ज पर लगभग अनिवार्य रूप से है "तुम क्यों नहीं किया import SomeVeryBasicPackageऔर बस करना यह ?" एक उन्नत प्रश्न पूछें और पहला उत्तर लगभग अनिवार्य रूप से "आप import SomeMagicalPackageऔर बस ऐसा क्यों नहीं किया" की तर्ज पर है ?
डेविड हैमेन

1
@David Hammen मुझे लगता है कि 80/20 विभाजन कोर भाषा सुविधाओं को संदर्भित करता है, न कि केवल मानक पुस्तकालय घटक, जिस स्थिति में आप जिन भाषाओं का उल्लेख करते हैं, पर्ल के संभावित अपवाद के साथ, वास्तव में C ++ जितना बड़ा और जटिल नहीं लगता है। किसी भी मामले में, यह मेरे उत्तर का एक बहुत छोटा हिस्सा था, और मैंने स्वीकार किया कि यह एक पक्षपाती स्रोत है।
काइल स्ट्रैंड

1
VM / प्रबंधित भाषाएं स्पष्ट रूप से सतह के नीचे बहुत अधिक जटिल हैं, लेकिन मेरा मतलब है कि उपयोग के दृष्टिकोण से जटिल है।
काइल स्ट्रैंड

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

5

मान लीजिए कि मैं परियोजना में पर्यावरण द्वारा सी ++ का उपयोग करने के लिए सीमित हूं। क्या यह कुछ भाषा सुविधाओं के उपयोग को रोकने के लिए अच्छा है जो C ++ के पास हैं, लेकिन जावा में नहीं है (जैसे: एकाधिक विरासत, ऑपरेटर ओवरराइडिंग)?

नहीं।

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

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

विजुअल बेसिक [.Net] वर्ल्ड में कुछ साल पहले एक समान ("उपयोग करने या न करने के लिए") बहस हुई थी, जहां किसी को यह उज्ज्वल विचार था कि आपको किसी भी [मूल भाषा] का उपयोग किए बिना विज़ुअल बेसिक एप्लिकेशन लिखना चाहिए। Microsoft.VisualBasic नेमस्पेस द्वारा दी गई कार्यक्षमता। यह std के बिना C ++ एप्लिकेशन लिखने का प्रयास करने जैसा होगा :: नामस्थान; ठीक है, यह संभव है लेकिन पृथ्वी पर कोई भी उनके सही दिमाग में ऐसा करने के लिए परेशान क्यों करेगा?


1
Visual Basic के बारे में आपके अंतिम बिंदु पर: ऐसे विक्रेता पुस्तकालयों के साथ समस्या यह है कि वे मालिकाना हैं। उनका उपयोग करने का मतलब है कि अपने आप को उस विक्रेता को सौंपना। विक्रेता आपको पसंद करेंगे, लेकिन आप लंबे समय तक नहीं रहेंगे: आप किसी अन्य विक्रेता के सॉफ़्टवेयर का उपयोग नहीं कर सकते हैं जो विक्रेता विशिष्ट कार्यक्षमता पर निर्भर करता है। जितना अधिक आप विक्रेता विशिष्ट कार्यक्षमता का उपयोग करते हैं, उतने अधिक विक्रेता बदलने की लागत बनती है, आपके विक्रेता को आप पर परिवर्तनों को लागू करने के लिए सशक्त बनाता है। यही कारण है कि मुक्त (आजादी के रूप में!) सॉफ्टवेयर इतनी बड़ी बात है।
सेमीस्टर

Microsoft.VisualBasicनाम स्थान बात एक खंड का एक सा है। यह कई वर्षों से है क्योंकि मैंने इसे आखिरी बार इस्तेमाल किया था, लेकिन कम से कम शुरुआत में इसका उद्देश्य ज्यादातर वीबी 6 (और / या वीबी 6 प्रोग्रामर को "घर पर" महसूस करने के लिए अनुकूलता देना था); यह ज्यादातर कार्यक्षमता प्रदान करता है जो पहले से ही बाकी ढांचे में अधिक आधुनिक (और बेहतर एकीकृत) रूप में उपलब्ध था, इसलिए नई परियोजनाओं में इसका उपयोग करने के लिए शायद ही कभी समझ में आया। इसके विपरीत, std::नाम स्थान वह जगह है जहाँ पूरा मानक पुस्तकालय रहता है - इसे टालना ऐसा होगा जैसे .NET में पूरे BCL से बचना है।
माटेओ इटालिया

2

वर्तमान उत्तर सभी कहते हैं कि यह एक बुरी बात है, क्योंकि आपको उस भाषा का लाभ उठाना चाहिए जिसका आप उपयोग कर रहे हैं और यह भी बताएं कि एक C ++ फीचर सिर्फ "बुरा" क्यों नहीं है क्योंकि यह jave में नहीं है। मैं इसका जवाब एक अलग कोण से दूंगा।

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

लेकिन कोई भी समस्या जो सबसे सरल कार्य से अधिक है:

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

जावा और सी ++ का एक आम उपसमुच्चय नहीं है जो उपरोक्त अनुमति देता है, इसलिए आप जो पूछ रहे हैं वह करना असंभव है। (यदि आप जावा और सी # के बारे में पूछ रहे थे, तो आपके पास बहुत बेहतर मौका होगा, क्योंकि वे दोनों कचरा संग्रहकर्ता का उपयोग करते हैं।)

हालाँकि आपको आवश्यकता हो सकती है कि कोड लिखा जाए ताकि एक जावा डेवलपर समझ सके कि क्या है (लेकिन विस्तृत "कैसे" नहीं) और यह समझदार होगा।

आप अपनी खुद की भाषा भी डिज़ाइन कर सकते हैं जिसे आपने C ++ और JAVA दोनों में लागू किया है ....।


0

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

वास्तव में कोई तकनीकी कारण नहीं हैं। आपने जो बनाया है वह एक ऐसा परिदृश्य है जहां किसी भी कारण से एक भाषा का उपयोग किया गया था, लेकिन कई वर्तमान और संभवतः भविष्य के डेवलपर्स वास्तव में इसे नहीं समझते हैं।

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

यह ऑब्जेक्ट-ओरिएंटेड भाषाओं पर जाने वाले BASIC प्रोग्रामर की समस्याओं के बारे में एक तर्क है। ऐसा नहीं है कि वे ओओपी प्रथाओं को नए देवों के निषेध पर लागू करते हैं जो इसे नहीं समझते हैं, लेकिन वे इसे लागू नहीं करते हैं। यदि वे करते हैं, तो वे आमतौर पर गलत होते हैं। यदि कुछ खराब तरीके से किया जाता है, तो इसे कारण की परवाह किए बिना हटा दिया जाना चाहिए।

कोड को नेत्रहीन कॉपी और पेस्ट करने के अलावा, वे इसे कई क्षेत्रों में करने जा रहे हैं जो उन्हें वैसे भी समझ में नहीं आते हैं।

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