हम Enums, सार वर्ग और संरचनाएं उपसर्ग क्यों नहीं करते हैं?


11

C # समुदाय ने इतनी आसानी से "I" उपसर्ग का उपयोग एक इंटरफ़ेस को दर्शाने के लिए किया है जो कि सबसे अनुभवहीन प्रोग्रामर भी इसका उपयोग करना जानते हैं।

फिर ऐसा क्यों है कि हम एंथम, एब्सट्रैक्ट क्लास या स्ट्रक्चर्स (संभवतः "ई", "ए" और "एस" के साथ) उपसर्ग नहीं करते हैं?

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

कृपया ध्यान दें कि मैं इस बदलाव की वकालत नहीं कर रहा हूं, मैं केवल यह समझने की कोशिश कर रहा हूं कि हम इस तरह से चीजें क्यों नहीं करते हैं।

यह थ्रेड उत्तर देता है कि हम "I" उपसर्ग का उपयोग क्यों करते हैं लेकिन इसका उत्तर नहीं देते कि हम अन्य उपसर्गों का उपयोग क्यों नहीं करते हैं।


3
मैं डुप्लीकेट पास के लिए मतदान होगा, लेकिन इस सवाल का जवाब इतने पर है stackoverflow.com/questions/111933/...
जश्न

1
@ यूफोरिक: यह प्रश्न बहुत अधिक विशिष्ट है।
रीइंजिरेपोस्ट


IMO Enums से बचा जाना चाहिए (सार्वजनिक स्थैतिक आसानी से पढ़े जाने वाले सदस्यों (एनम पैटर्न) के साथ), अमूर्त वर्गों में "आधार" प्रत्यय होना चाहिए , और संरचनाओं में नामकरण सम्मेलन के रूप में कम मामला होना चाहिए था , लेकिन चूंकि .NET ऐसा नहीं करता है, इसलिए अगर आप स्ट्रक्चर्स को लोअर केस बनाते हैं तो यह भ्रमित हो जाता है, क्योंकि यह कभी भी सुसंगत नहीं होगा।
डेव कज़िन्यू

आप प्यूटो एनम बनाने के पक्ष में एनम का उपयोग करने से क्यों बचेंगे?
स्टीफन

जवाबों:


27

इंटरफेस के लिए नामकरण सम्मेलन का उद्देश्य इंटरफ़ेस को कॉल करने के बारे में त्वरित, नहीं-मस्तिष्क निर्णय प्रदान करना है जो आपकी कक्षा में नकल करता है। यदि आपके पास एक है Frobnicator, लेकिन डिकॉउलिंग के लिए एक इंटरफ़ेस घोषित करना है या जो भी कारण है, तो इसे कॉल करने के निर्णय के लिए IFrobnicatorकोई सचेत विचार की आवश्यकता नहीं है, और यह अच्छा है।

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

(सार कक्षाएं कुछ हद तक इंटरफेस के समान हैं, क्योंकि आपको कुछ भी प्राप्त करने के लिए एक दूसरा, ठोस वर्ग प्रदान करना होगा, इसलिए उन्होंने 'ए' के ​​साथ शुरू करने का एक सम्मेलन प्राप्त किया हो सकता है, लेकिन जो भी कारण से, उन्होंने ऐसा नहीं किया। मुझे अटकलें लगाने की अनुमति है, मुझे लगता है कि 'मैं' एक विशेष रूप से संकीर्ण पत्र हो सकता है कि इसके साथ कुछ करना हो।)


5
+1 यह वह उत्तर है जो मैंने लिखा होगा। मुझे लगता है कि हालांकि सार कक्षाएं पहले से ही एक पूरी तरह से नामकरण सम्मेलन है, जहां सार वर्ग का नाम है AnimalBaseऔर अलग जायके हैं AnimalGiraffe, AnimalLionआदि
बाइनरी वॉरियर

यह कई जावा इंटरफेस का उल्लेख करने के लायक हो सकता है, जैसे कि 'मैं' का उपयोग नहीं करते हैं, जैसे List, बहुत तकनीकी रूप से नामित हैं ArrayListऔर LinkedListकार्यान्वयन के नाम हैं। (सी #, मेरा मानना ​​है, IListइंटरफ़ेस के रूप में है, और Listसरणी सूची के रूप में)
कटाना ३१४

मुझे आश्चर्य है कि अगर यह Microsoft के लिए उपयोगी हो सकता है, तो वापस जाने के लिए, कि "उत्परिवर्तनीय" संरचना प्रकारों के चर को एक विशेष उपसर्ग दिया जाना चाहिए, ताकि भ्रम Point p = myPoints[3]; p.X += 3;प्रभावित न हो myPoints[3].X। पूर्वव्यापी रूप से, मैं पसंद करूंगा कि सी # var->fieldक्लास-फील्ड एक्सेस के लिए और var.fieldस्ट्रक्चर-फील्ड एक्सेस के लिए उपयोग करें, लेकिन स्पष्ट रूप से यह नहीं है। फिर भी, ऐसा लगता है कि उन्हें पहचानने के कुछ अचूक साधन मददगार साबित होंगे।
सुपरकैट

1

मुझे लगता है कि इसका उपयोग ज्यादा नहीं किया जाता है क्योंकि:

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

संक्षेप में: सामान्य रूप से जोड़ा गया मूल्य लागत में नहीं जुड़ता है।

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

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

मुझे लगता है कि लोगों ने देखा कि यह इंटरफेस के लिए अधिक बार मैटर करता है और यही कारण है कि यह इंटरफेस के लिए एक सामान्य नियम बन गया है।


-1

बस (उम्मीद है कि लागू) सोचा:

ठोस वर्गों के बजाय 'कोडिंग टू इंटरफेस' की ओर एक स्पष्ट रुझान है। "आजकल" यह इंटरफ़ेस के लिए अक्षर 'I' के बजाय 'C' से शुरू करने की तरह, कक्षाओं के लिए नामकरण सम्मेलन के लिए लगभग अधिक फायदेमंद लगता है।

मैंने अभी एक जावा परियोजना को समाप्त किया है जिसमें सभी इंटरफेस वास्तव में मॉडल कहे गए थे। हां, इंटरफ़ेस नाम सम्मेलन को 'मॉडल' के साथ नाम समाप्त करना था ... फिर कुछ प्रकार के 'DataTransferObject / DTO' इंटरफ़ेस को लागू करें। :

public interface SomethingModel{
}

public class Something implements SomethingModel{
    //lets not line up braces and make it hard to read
    //at least it saves one line
}

जबकि C # में

public interface ISomething{}

public class SomethingModel : ISomething
{
   //i can read this
}

मेरे मस्तिष्क को पुनः प्राप्त करते हुए सीधे चोट लगी, लेकिन मैं यह देख सकता हूं कि यह इंटरफ़ेस के लिए प्रोग्रामिंग की शर्तों को सोचने में कैसे मदद कर सकता है।

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