जब एक फीचर को प्रोग्रामिंग भाषा / प्लेटफॉर्म में "प्रथम श्रेणी का नागरिक" माना जाता है?


61

मैंने कई बार बयानों को देखा है जैसे- "कृपया इस सुविधा को प्रथम श्रेणी के नागरिक को इतनी और भाषा / मंच में बनाएं"। उदाहरण के लिए, यह सी # / नेट में एनम के बारे में कहा जाता है। तो, प्रोग्रामिंग भाषा / प्लेटफॉर्म में "फर्स्ट क्लास सिटीजन" फीचर को कब माना जाता है?

जवाबों:


40

परिभाषा

एक वस्तु प्रथम श्रेणी में है जब वह:

  • चर और डेटा संरचनाओं में संग्रहीत किया जा सकता है
  • एक सबरूटीन के लिए एक पैरामीटर के रूप में पारित किया जा सकता है
  • एक सबरूटीन के परिणाम के रूप में वापस किया जा सकता है
  • रनटाइम पर निर्माण किया जा सकता है
  • आंतरिक पहचान है (किसी भी नाम से स्वतंत्र)

"ऑब्जेक्ट" शब्द का उपयोग शिथिल रूप से किया जाता है, आवश्यक रूप से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में ऑब्जेक्ट्स का जिक्र नहीं है। सबसे सरल स्केलर डेटा प्रकार, जैसे पूर्णांक और फ्लोटिंग-पॉइंट नंबर, लगभग हमेशा प्रथम श्रेणी के होते हैं।

http://en.wikipedia.org/wiki/First_class_object


1
तो, क्या enums .net / C # में दूसरी श्रेणी की वस्तु बनाता है?
गुलशन

7
@ गुलशन - आप आंतरिक पहचान की कमी का तर्क दे सकते हैं - सी # एनम मूल रूप से केवल पूर्णांक मूल्य के लिए सिंटैक्टिक शुगर (यानी एक "दिया गया नाम") हैं। जावा के साथ तुलना करें, जहां एनम अपने आप में ऑब्जेक्ट हैं।
मिकेरा

। NET में, @ enikera, अपने आप में मूल्य हैं। जावा के पास कोई मूल्य नहीं है, केवल ऑब्जेक्ट हैं, केवल यही अंतर है।
एसके-तर्क

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

मुझे नहीं लगता कि एन्टीम को नेट पर रनटाइम में बनाया जा सकता है, क्या वे कर सकते हैं? मुझे लगा कि वे हमेशा स्थिर थे।
ट्रैविस

33

प्रोग्रामिंग भाषा में "प्रथम श्रेणी के नागरिक" या "प्रथम श्रेणी के तत्व" की धारणा ब्रिटिश कंप्यूटर वैज्ञानिक क्रिस्टोफर स्ट्रेची द्वारा 1960 के दशक में प्रथम श्रेणी के कार्यों के संदर्भ में पेश की गई थी । इस सिद्धांत का सबसे प्रसिद्ध सूत्रण संभवतः गेराल्ड जय सुस्मान और हैरी एबसन द्वारा कंप्यूटर प्रोग्राम की संरचना और व्याख्या में है :

  • इन्हें चर नाम दिया जा सकता है।
  • उन्हें प्रक्रियाओं के तर्क के रूप में पारित किया जा सकता है।
  • उन्हें प्रक्रियाओं के परिणामों के रूप में लौटाया जा सकता है।
  • उन्हें डेटा संरचनाओं में शामिल किया जा सकता है।

मूल रूप से, इसका मतलब है कि आप इस प्रोग्रामिंग भाषा तत्व के साथ वह सब कुछ कर सकते हैं जो आप प्रोग्रामिंग भाषा में अन्य सभी तत्वों के साथ कर सकते हैं।

यह सभी "समान अधिकारों" के बारे में है: आप उपरोक्त सभी को, पूर्णांक के साथ, कह सकते हैं, इसलिए किसी भी अन्य चीज़ को अलग क्यों होना चाहिए?

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

उदाहरण के लिए, जावा ऑपरेटर और जावा तरीके समान हैं। आप नए तरीकों को परिभाषित कर सकते हैं, आप (कुछ) स्वतंत्र रूप से अपने खुद के तरीकों के नाम चुन सकते हैं, आप तरीकों को ओवरराइड कर सकते हैं, आप तरीकों को ओवरलोड कर सकते हैं। जेम्स गोसलिंग ऑपरेटरों के साथ वह सब भी कर सकता है, लेकिन आप और मैं नहीं कर सकते। मेरा मतलब है, आम धारणा के विपरीत, जावा करता है समर्थन ऑपरेटर ओवरलोडिंग: उदाहरण के लिए, +ऑपरेटर के लिए ओवरलोड हो गया है byte, short, int, long, float, doubleऔर String, और IIRC जावा 7 में भी के लिए BigIntegerऔर BigDecimal(और शायद एक जोड़े को मैं भूल गया था), यह सिर्फ है कि आपइस पर कोई प्रभाव नहीं है। यह स्पष्ट रूप से ऑपरेटरों को इस दूसरी परिभाषा के अनुसार दूसरे दर्जे का बनाता है। ध्यान दें कि विधियाँ अभी भी प्रथम परिभाषा के अनुसार प्रथम श्रेणी की वस्तुएँ नहीं हैं। (क्या इससे ऑपरेटर तीसरी श्रेणी में आते हैं?)


6

आमतौर पर यह एक ऐसे निर्माण को संदर्भित करता है जो एक पैरामीटर के रूप में पास करने योग्य है, इसे फ़ंक्शन से रिटर्न प्रकार के रूप में परिभाषित किया जा सकता है या इसे एक मान सौंपा जा सकता है। आम तौर पर आपको उन्हें रनटाइम पर निर्माण करने में सक्षम होना चाहिए। उदाहरण के लिए एक वर्ग का उदाहरण c ++ या जावा में प्रथम श्रेणी का नागरिक होगा, लेकिन C में कोई फ़ंक्शन नहीं होगा।


C ++ में क्लास को प्रथम श्रेणी का नागरिक क्या बनाता है?
बजर्के फ्रायंड-हैन्सन

2
@bjarkef: पहले से दिए गए वाक्यों में दिए गए विवरण के मिलान से ऐसा लगता है कि इसका जवाब पहले से ही दिया गया था।
डोपेलग्रेनर

@ जोनाथन: हाँ, क्षमा करें, मैंने "रनटाइम पर निर्माण" को गलत बताया। हां, आप रनटाइम (ऑब्जेक्ट) पर एक क्लास का एक उदाहरण बना सकते हैं, लेकिन खुद क्लास नहीं। यही मुझे भ्रमित करता है।
बज्रक फ्रेंड-हैन्सन

1
पैरामीटर द्वारा पास करना अभी भी पर्याप्त नहीं है। C / C ++ में मैं अभी भी दूसरे वर्ग के नागरिकों के रूप में कार्यों पर विचार करूंगा। उन्हें मापदंडों के रूप में पारित किया जा सकता है, अन्य वस्तुओं के अंदर रखे गए परिणामों के रूप में लौटाया जाता है। लेकिन उन्हें अन्य निर्माणों की मदद के बिना जोड़तोड़ नहीं किया जा सकता है (जैसे कि std :: bind को एक कार्य के लिए मापदंडों को बांधने के लिए आवश्यक है)।
मार्टिन यॉर्क

@ मार्टिन ने कभी नहीं कहा कि फ़ंक्शन C / C ++ में प्रथम श्रेणी के नागरिक थे।
पेमदास

1

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

उदाहरण:

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


1
बाउंड फंक्शंस (या "क्लोज़र") प्रथम श्रेणी में नहीं होंगे, जबकि फ़ंक्शंस स्वयं हैं? आपके विश्लेषण में बंद कारक के लिए 0x का समर्थन कैसे करता है?
फ्रेड नुर्क

@ फ़्रेड नर्क: यह सब भाषा पर निर्भर करता है। कुछ भाषाओं में क्लोजर प्रथम श्रेणी के सिस्टम हैं। दूसरों में नहीं। मैं एक स्पष्ट टिप्पणी करने के लिए C ++ 0x के साथ अभी तक परिचित नहीं हूं।
मार्टिन

मान लीजिए कि भाषा C या C ++ है (लेकिन 0x नहीं), जैसा कि आप उत्तर में हैं। "प्रथम श्रेणी" की आपकी परिभाषा बाध्य कार्य नहीं करेगी (या "बंद") प्रथम श्रेणी में नहीं होगी, जबकि कार्य स्वयं हैं?
फ्रेड नर्क

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

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

-1

पहले से दिए गए उत्तरों में एक उदाहरण जोड़ने के लिए:

WCF / C # में आपको वर्तमान में सेवा के रूप में सेवा करने के लिए एक सेवा अनुबंध विशेषता के साथ एक वर्ग वस्तु को चिह्नित करना होगा। ऐसी कोई बात नहीं है:

public **service** MyService (in relation public **class** MyClass). 

एक वर्ग c # में प्रथम श्रेणी का नागरिक है, जहाँ कोई सेवा नहीं है।

उम्मीद है की यह मदद करेगा

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