2012-06-05 8 views
6

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

अमूर्त प्रतिमान निर्देशित करता है, हम प्रोग्रामर से अनावश्यक विवरण छुपाते हैं। यही कारण है कि रचनाकारों के पास वापसी का प्रकार नहीं है, क्योंकि यह पहले से ही परिभाषित है कि एक निर्माता को क्या लौटना है। एक ही भावना में, हम सभी वर्गों के रचनाकारों को केवल सामान्य नाम क्यों नहीं दे सकते - उदाहरण के लिए initialize() या शायद कुछ भी नहीं और केवल तर्क ([arg [,arg]])

मुझे आशा है कि, मैं स्वयं को व्यक्त करने में सक्षम हूं । अगर किसी के पास कोई निश्चित उत्तर है, तो कृपया मुझे बताएं।

+0

एक दिलचस्प sidenote के रूप में, PHP के पास रचनाकारों के लिए एक सामान्य नाम है __construct' – xbonez

+2

यह प्रश्न [प्रोग्रामर] (http://programmers.stackexchange.com/) पर बेहतर फिट है। कट्टरपंथी सोच के लिए –

+1

+1 !! – WickeD

उत्तर

2

सी ++ मानक (12.1) (जोर मेरा) से:

कंस्ट्रक्टर्स नाम नहीं है। एक विशेष घोषणाकर्ता वाक्यविन्यास को कन्स्ट्रक्टर घोषित या परिभाषित करने के लिए उपयोग किया जाता है। सिंटैक्स का उपयोग करता:

  • एक वैकल्पिक डीईसीएल-विनिर्देशक-सेक जिसमें प्रत्येक डीईसीएल-विनिर्देशक या तो एक समारोह-विनिर्देशक या constexpr,
  • निर्माता के वर्ग के नाम, और
  • एक पैरामीटर सूची
है

सी ++ में, आप एक नाम नहीं दे रहे हैं, आप विशेष वाक्यविन्यास लिख रहे हैं जिसे भाषा निर्माता द्वारा एक निर्माता घोषित करने का निर्णय लिया गया था।

+0

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

+1

@VaidAbhishek: उस पर बहस की जा सकती है। सी ++, सी # और जावा में, कक्षा का नाम उपयोग किया जाता है। मैं व्यक्तिगत रूप से सोचता हूं कि यह सबसे तार्किक तरीका है। –

+0

@VaidAbhishek: क्या यह वास्तव में प्रत्येक कन्स्ट्रक्टर और विनाशक के लिए कक्षा नाम की प्रतिलिपि बनाने/पेस्ट करने के लिए इतना कठिन काम है? – Blastfurnace

-2

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

1

यह भाषा के लिए एक मानक है, यदि आप निर्माता के लिए सामान्य नाम रखना चाहते हैं तो एक और भाषा सीखने की कोशिश करें या शायद अपनी खुद की भाषा बनाएं। = पी

+2

125 प्रतिष्ठा अंक की प्रतीक्षा कर रहा है। – VaidAbhishek

0

रचनाकार विशेष सदस्य कार्य हैं और निर्माता हमेशा 'नए' ऑपरेटर द्वारा बनाए गए मेमोरी पते को वापस कर देता है। चूंकि एक समारोह एक समय में केवल एक चीज देता है इसलिए कोई अन्य मूल्य कन्स्ट्रक्टर से वापस नहीं आ सकता है। क्लास नाम के समान ही एक कन्स्ट्रक्टर नाम को परिभाषित करने के लिए यह जावा मानक है।

+0

मैं अर्थशास्त्र को समझता हूं, लेकिन मेरा प्रश्न डिजाइन स्तर पर है। एक प्रोग्रामर को सभी नामों को परिभाषित करने के लिए मजबूर क्यों करें। मुझे लगता है, तुम मेरे सवाल को समझ नहीं पाए। – VaidAbhishek

0

पहले, आपको एक निर्माता लिखना नहीं है। यदि आप एक नहीं लिखते हैं - संकलक आपके लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर बनाएगा।

दूसरा, कभी-कभी आपको एक का उपयोग करना पड़ता है (उदाहरण के लिए, यदि आपके पास ऑब्जेक्ट के निर्माण पर प्रारंभिक कक्षा चर है)। इस मामले में आपको एक कन्स्ट्रक्टर लिखना होगा और जब आप ऑब्जेक्ट को तुरंत चालू करेंगे तो आप इसका इस्तेमाल करेंगे।

public class Foo { 
    final int a; 

    public Foo (int val){ 
     this.a = val 
    } 
} 

Foo foo = new Foo (23); 
3

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

+0

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

+1

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

+0

सी ++ को सिर्फ एक नाम से अधिक की आवश्यकता होगी। विनाशकों और प्रतिलिपि बनाने वालों के पास वर्तमान में नाम नहीं हैं। लेकिन आइए यथार्थवादी बनें: कोई भी सभ्य आईडीई रंग-कोडिंग का उपयोग कर सकता है। फ़ंक्शन नाम के रूप में रंगीन क्लास नाम देखना एक स्पष्ट दृश्य संकेत है कि आप ctor से निपट रहे हैं। – MSalters

1

जावा और सी ++ के लिए, निर्माता का नाम कक्षा के नाम के समान होना चाहिए। इसके अलावा, आप जानते हैं कि यह एक निर्माता है, क्योंकि यह रिटर्न प्रकार की घोषणा नहीं करता है। एक कन्स्ट्रक्टर घोषित करने का यह तरीका आपको एक विधि घोषित करने में मदद करता है जिसका नाम __init__, initialize, या __constructor है। उदाहरण के लिए, पायथन में यह संभव नहीं है, क्योंकि यह __init__ का उपयोग कन्स्ट्रक्टर नाम के रूप में करता है।

0

आप अपनी सोच की रेखा के बारे में सही हैं। अपनाया गया वाक्यविन्यास सिर्फ एक ऐतिहासिक आर्टिफैक्ट है।

ओओपी का समर्थन करने वाली नई भाषाओं में, यह अनावश्यकता आम तौर पर अनुपस्थित है। स्काला यह this *, एफ # यह new *, अजगर यह कहता है __init__ कॉल कॉल, रूबी यह initialize आदि


* सहायक कंस्ट्रक्टर्स कॉल वैसे भी। इन भाषाओं में प्राथमिक रचनाकार स्वयं वर्ग तर्क हैं।

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