2009-05-28 12 views
15

This stackoverflow question पर एक दिलचस्प चर्चा है कि कैसे enums और गुणों को समान नाम देने से बचें ताकि आपके पास ऐसा कोड न हो:क्या यह नामकरण विवादों से बचने के लिए "एनम" के साथ सभी सी # एनम्स को प्रत्ययित करने की अनुशंसा की जाती है?

public SaveStatus SaveStatus { get; set; } 

ऐसा लगता है कि enum के लिए "राज्य" का उपयोग करने के लिए सुझाए गए स्वीकृत उत्तर और संपत्ति के लिए "स्थिति":

public SaveStatus SaveState { get; set; } 

लेकिन मुझे लगता है कि यह पढ़ना मुश्किल है और तुरंत यह स्पष्ट नहीं है कि क्या है।

चूंकि यह enum नामकरण समस्या एक निरंतर समस्या है, इसलिए मैं हमेशा "enum" के साथ अपने enums प्रत्यय पर विचार कर रहा हूं, तो मुझे यह होगा:

public SaveStatusEnum SaveStatus { get; set; } 

SaveStatus = SaveStatusEnum.Succeeded; 

क्या कोई ऐसा करता है? इसके साथ खुश है? इस मुद्दे को किसी अन्य तरीके से हल किया?

+0

डीओटीएनईटी में विकास के लिए एमएस आईडीई के बिंदुओं में से एक इस तरह की समस्याओं को दूर करना है। मैं यह भी कहूंगा कि आईडीई डॉटनेट का एक अभिन्न हिस्सा है। –

+1

मैं ऐसा करता हूं और मैं इससे खुश हूं। मैं इससे बचने के लिए प्रयोग करता था लेकिन इससे मुझे वास्तविक कोड में समस्याएं आईं। जब आप कोड की एक पंक्ति को देखते हैं तो ऐसा लगता है कि SaveStatus SaveStatus {get; सेट; }। जब आप सैकड़ों लाइनों के साथ कक्षा में होते हैं और पुनर्विक्रेता दोनों को भ्रमित करता रहता है, तो यह परेशान और भ्रमित होता है। – JohnOpincar

+1

हां, लेकिन यह एक ReSharper बग है, विजुअल स्टूडियो या संकलक समस्या नहीं है। ReSharper टीम को उनकी बग को ठीक करने के लिए कहें। http://www.jetbrains.net/jira/browse/RSRP-83171 –

उत्तर

22
MSDN page for Property naming guidelines से

:

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

मुझे लगता है कि काफ़ी होगा के रूप में एक "नहीं" :)

संपादित करें:

आप वर्ग है कि संपत्ति की घोषणा के अंदर पूरी तरह से योग्य नाम का उपयोग कर नापसंद हैं, तो आप काम कर सकते हैं इसके चारों ओर:

using SaveStatusEnum = MyNamespace.SaveStatus; 
... 
SaveStatus = SaveStatusEnum.SomeValue; 

इस तरह आप प्रत्यय के बिना enum नाम रखने के लिए, और नामकरण विषमता सिर्फ इतना है कि एक वर्ग के लिए सीमित कर सकते हैं। :)

+0

हां, लेकिन जब मेरी कक्षा फ़ाइल में enum है तो यह विवादों का नामकरण का कारण बनता है। मुझे हमेशा पूर्ण नामस्थान का उपयोग करना होगा जब मैं enum चाहता हूं क्योंकि विजुअलस्टूडियो इंटेलिजेंस हमेशा सोचता है कि मेरा मतलब संपत्ति है। SaveStatus = TestingDelegateCommandSave.ViewModels.SaveStatus.NotApplicable; –

+0

ठीक है, मैं इसे वापस लेता हूं, यह इंटेलिजेंस के साथ काम करता है (मेरे पास कुछ पुराना था ... वहां एनम कोड)। अच्छा लगा। यह वह जवाब था जिसे मैं ढूंढ रहा था, कुछ निर्णायक था। मैं यहां से अपने गुणों के समान ही मेरे enums नामकरण कर रहा हूँ। –

+0

दरअसल, संकलक इसके बारे में भी शिकायत कर सकता है - मैंने बस अपने वास्तविक जीवन प्रोजेक्ट में एक उदाहरण के साथ प्रयास किया। यदि ऐसा होता है, तो आप इसे एक कथन कथन के साथ काम कर सकते हैं (मैंने एक उदाहरण के साथ अपना जवाब अपडेट किया है)। – Rytmis

6

क्या .NET Framework Enum को एक प्रत्यय के रूप में उपयोग करता है? No. यही कारण है कि मैं इसका उपयोग नहीं करता हूं।

इसके बजाय, मैं विकल्प (या विकल्प अगर यह ध्वज-एनम है), मोड या इसी तरह के शब्दों का उपयोग करता हूं।

public SaveStatusMode SaveStatus { get; set; } 
public SaveStatusOption SaveStatus { get; set; } 
public SaveStatusVariant SaveStatus { get; set; } 
6

माइक्रोसॉफ्ट के .NET नामकरण दिशानिर्देश ऐसी कोई सिफारिश नहीं देते हैं।

आप समान नाम और गुणों को समान नाम देने से क्यों बचेंगे? यह:

public SaveStatus SaveStatus { get; set; } 

बस ठीक काम करता है, पठनीय है, और यह बहुत ही खोजने योग्य और प्रयोग योग्य है।

+0

लेकिन फिर मेरे कन्स्ट्रक्टर में मेरे पास एक विशाल नेमस्पेस क्वालीफायर होना चाहिए: SaveStatus = TestingDelegateCommandSave.ViewModels.SaveStatus.NotApplicable; अन्यथा इंटेलिजेंस सोचता है कि मेरा मतलब है "सेवस्टैटस" संपत्ति। मेरे पास मेरी कक्षा फ़ाइल में परिभाषित enum है क्योंकि यह केवल मेरी कक्षा के लिए उपयोग किया जाता है, इसलिए संपत्ति के साथ नामकरण संघर्ष यही कारण है कि मैं इस से बचने के लिए नामकरण enums के एक और सम्मेलन की तलाश में हूं। –

+0

मैं हर समय SaveStatus SaveStatus का उपयोग करता हूं। चूंकि एक संपत्ति है, मुझे लगता है कि सेवस्टेट में नाम बदलने से ज्यादा पठनीय है। मैं कभी भी enum सामान का उपयोग नहीं करेंगे। –

+0

@ एडवर्ड: नहीं, आपको नामस्थान योग्यता की आवश्यकता नहीं है, कम से कम सी # में नहीं। "SaveStatus = SaveStatus.NotApplicable" बस ठीक काम करता है। –

4

कुछ प्रकार के वर्गों के लिए एक प्रकार का प्रत्यय उपयोग किया जाता है, जैसे xxxException और xxxAttribute कक्षाएं, लेकिन प्रत्यय व्यापक रूप से उपयोग नहीं किए जाते हैं। उदाहरण के लिए, एक वर्ग जो IENumerable लागू करता है उसे MyListEnumerableClass नाम नहीं दिया गया है, लेकिन केवल MyList है।

नामों को अपनाने वाले मानक प्रत्यय का आविष्कार करने के बजाय, कणों की स्थिति में समझने वाले नाम बनाने की कोशिश करें।

1

यदि आपके पास यह तरीके से संपत्ति को परिभाषित करना निश्चित रूप से कोई फर्क नहीं पड़ता कि नाम समान हैं या नहीं। मैं कहूंगा कि इस तरह से उपयोग करना शायद स्पष्ट है।

1

मुझे पता है कि मेरा सुझाव .NET नामकरण सम्मेलनों के खिलाफ चला जाता है, लेकिन मैं व्यक्तिगत रूप से 'ई' और 'एफ' के साथ enum झंडे के साथ enums prefix (इसी तरह हम 'I' के साथ इंटरफेस कैसे prefix)। मैं वास्तव में समझ में नहीं आता कि यह सम्मेलन क्यों नहीं है। एनम्स/फ्लैग एक विशेष मामला है जैसे इंटरफेस जो कभी भी अपना प्रकार नहीं बदलेंगे। न केवल यह स्पष्ट करता है कि यह क्या है, इंटेलिजेंस टाइप करना बहुत आसान है क्योंकि उपसर्ग अधिकांश अन्य प्रकार/चर/आदि फ़िल्टर करेगा, और आपके पास इन नामकरण संघर्ष नहीं होंगे।

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

0

मैं एमएस दिशानिर्देशों की अनुशंसा करता हूं। और कोड में 'FooEnum' जैसे कुछ पढ़ने के लिए यह हमेशा बदसूरत कोडिंग होता है;)

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

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