2008-10-21 12 views
11

एक इंटरफ़ेस नाम का उपसर्ग करने का .NET मानक व्यापक रूप से प्रतीत होता है और यह अभी तक .NET तक ही सीमित नहीं है। मैं बहुत सारे जावा कोड में आया हूं जो इस सम्मेलन का उपयोग करता है (इसलिए यदि जावा ने सी # से पहले इसका इस्तेमाल किया तो यह मुझे आश्चर्य नहीं करेगा)। इसके अलावा फ्लेक्स इसका उपयोग करता है, और इसी तरह। नाम की शुरुआत में एक I को रखकर हंगेरियन नोटेशन की याद आती है और इसलिए मैं इसका उपयोग करने में असहज हूं।क्या इंटरफेस के लिए ISomething/ISomethingable के विकल्प स्थापित किए गए हैं?

तो सवाल यह है कि क्या कक्षा का बजाए कुछ इंटरफ़ेस है, और इस तरह इसे किसी भी तरह से इंगित करने की आवश्यकता है। या क्या यह एक मामला बन गया है और इसलिए मुझे इसे स्वीकार करना चाहिए और इसे "धार्मिक युद्ध" को हल करने की कोशिश करना बंद कर देना चाहिए ताकि यह अलग-अलग किया जा सके?

+3

इसे वास्तव में जावा में बीएडी अभ्यास माना जाता है। जोशुआ ब्लोच द्वारा प्रभावी जावा देखें। यह बहुत अच्छा है, लेकिन यह भी उदास है कि सी # अभी भी इसका उपयोग करता है। – drozzy

+0

@drozzy, (या इसे पढ़ने वाला कोई भी व्यक्ति) - क्या आपको याद है कि जे। ब्लोच ने इस विषय पर चर्चा की थी (मेरा मतलब पृष्ठ)? मेरे पास इस पुस्तक का दूसरा संस्करण है और मुझे "I" नामकरण सम्मेलन का कोई संदर्भ नहीं मिल रहा है। – greenoldman

+1

@ ग्रीनोल्डमैन अच्छा बिंदु, वह वास्तव में यह नहीं कहता कि यह "बुरा" है, बस इसका जिक्र नहीं है। पी देखें 237-238 प्रभावी जावा 2। मेरी अति उत्साह के लिए खेद है। – drozzy

उत्तर

19

फ्रेमवर्क डिजाइन दिशानिर्देश पुस्तक से:

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

इसके अलावा, इंटरफ़ेस नामकरण पर व्याख्याओं से:

क्रिस्टोफ़ क्वालीना: इस्तेमाल किया कुछ उपसर्गों में से एक (ICollection के रूप में) "मैं" इंटरफेस के लिए है, लेकिन उस ऐतिहासिक के लिए है कारणों।पीछे मुड़कर देखें तो मुझे लगता है कि यह नियमित रुप से नाम का उपयोग करने के लिए बेहतर हो गया होता। के बहुमत में मामलों डेवलपर्स परवाह नहीं है कि कुछ एक अंतरफलक और नहीं एक सार वर्ग, उदाहरण के लिए है।

ब्रैड अब्राम्स: दूसरी तरफ, इंटरफ़ेस पर "I" उपसर्ग एक स्पष्ट .NET Framework पर COM (और जावा) के प्रभाव की मान्यता है। कॉम , लोकप्रिय बनाया भी संस्थागत, अंकन कि इंटरफेस हालांकि हम चर्चा की इस ऐतिहासिक पैटर्न हम पैटर्न के रूप में तो हमारे उपयोगकर्ताओं के कई को आगे बढ़ाने का फैसला किया है से अपसारी "मैं" के साथ शुरू पहले से ही कॉम से परिचित थे।

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

ब्रेंट रेक्टर नोट: यह वास्तव में हंगेरी अंकन के किसी अन्य अनुप्रयोग है (हालांकि चर नाम में अंकन के उपयोग की एक बिना नुकसान)।

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

+0

वाह, वे कुछ स्मार्ट लोग हैं। मैं विशेष रूप से ब्रैड अब्राम का एक बड़ा प्रशंसक हूं। –

0

सिम्बियन के लिए कोडिंग मानक इंटरफेस (शुद्ध सार सी ++ वर्ग) एक आई

अन्यथा, केवल अन्य तरह से मैं संकेतित करते इंटरफेस की देखा है संदर्भ के माध्यम से है बजाय एक एम के साथ चिह्नित है।

0

.NET के लिए, माइक्रोसॉफ्ट के फ्रेमवर्क डिजाइन दिशानिर्देश पुस्तक पूरी तरह से इसकी सिफारिश करती है, और हाँ, यह बहुत मानक है। मैंने इसे अन्यथा नहीं देखा है, और एक नया सम्मेलन बनाने के लिए केवल लोगों को भ्रमित करने के लिए काम करेगा।

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

+0

कक्षा चर के साथ prefixed _ _ मुझे सी ++ में परेशान। _ सिस्टम चर और पुस्तकालयों को इंगित करने के लिए है, कक्षा चर नहीं। – workmad3

+0

सी ++ के लिए, मैं आपके साथ सहमत हूं। मैं उन्हें विशेष रूप से सी # के लिए पसंद करता हूं। –

1

यह सब के बारे में शैली और पठनीयता। "आई" के साथ प्रीफ़िक्सिंग इंटरफेस केवल एक नामकरण सम्मेलन और स्टाइल दिशानिर्देश है जिसने पकड़ा है। कंपाइलर्स खुद कम परवाह नहीं कर सका।

+0

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

16

मैं ईमानदार होने के लिए इसे स्वीकार करूँगा। मुझे पता है कि हंगेरियन नोटेशन (या कम से कम इसका दुरुपयोग) जैसा थोड़ा सा होने का मतलब है, लेकिन मुझे लगता है कि यह इस मामले में करने के लायक होने के लिए पर्याप्त मूल्य प्रदान करता है।

निर्भरता इंजेक्शन प्रचलन में जा रहा है, अक्सर मैं मैं एक अंतरफलक और एक भी उत्पादन कार्यान्वयन के साथ खत्म हो पाते हैं। यह सिर्फ उपसर्ग के साथ आसानी से अलग करने के लिए आसान है।

एक कम डेटा बिंदु: मैं दोनों जावा और सी # एक निष्पक्ष राशि के साथ काम करते हैं, और मैं नियमित रूप से अपने आप को जांच करने के लिए जो जावा में प्रकार वास्तव में इंटरफ़ेस हैं, विशेष रूप से चारों ओर संग्रह ढांचा होने लगता है। .NET बस यह आसान बनाता है। शायद यह अन्य लोगों को परेशान नहीं करता है, लेकिन यह मुझे परेशान करता है।

+1 IFoo के लिए +1।

+0

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

+2

@ i3ensays: "फ़ाइल नाम के आगे" मानता है कि आप इसे किसी पैकेज ब्राउज़र या जो कुछ भी देख रहे हैं। कोड * को पढ़ने के दौरान मुझे कोई कार्रवाई नहीं करना पड़ेगा। हाँ, मैं सबकुछ देख सकता हूं, लेकिन मैं नहीं चाहता। यह निश्चित रूप से एक व्यक्तिपरक चीज है, लेकिन मुझे इसके लिए .NET सम्मेलन पसंद है। –

+0

यह शायद आपके टेक्स्ट एडिटर/आईडीई पर निर्भर करता है, लेकिन इन-कोड इंटेलिसेंस मेरे लिए भेद को काफी अच्छी तरह से संभालता है। उदाहरण के लिए, जब मैं असाइनमेंट घोषित करते समय "नया" टाइप करता हूं, तो मैं सबकटेक्स्ट मेनू में दिखाए जाने वाले सभी ज्ञात कार्यान्वयन प्रकारों के साथ असाइनमेंट को स्वतः पूर्ण कर सकता हूं। – i3ensays

9

एक .NET प्रोग्रामर (अधिकांश भाग के लिए), मैं वास्तव में यहाँ I छोड़ने, एक सरल कारण के लिए के जावा सम्मेलन पसंद करते हैं के रूप में: अक्सर, छोटे रिडिजाइन एक सार आधार वर्ग या उपाध्यक्ष में एक अंतरफलक से परिवर्तन की आवश्यकता विपरीत। अगर आपको नाम बदलना है, तो इसके लिए बहुत अनावश्यक रिफैक्टरिंग की आवश्यकता हो सकती है।

दूसरी ओर, ग्राहक के लिए उपयोग तो वे इस प्रकार के संकेत की परवाह नहीं करनी चाहिए पारदर्शी होना चाहिए। इसके अलावा, 'थिंगेबल "में" सक्षम "प्रत्यय एक संकेत के लिए पर्याप्त होना चाहिए। यह जावा में काफी अच्छी तरह से काम करता है।

/संपादित करें: मैं यह इंगित करना चाहता हूं कि उपर्युक्त तर्क ने मुझे निजी परियोजनाओं के लिए I उपसर्ग छोड़ने के लिए प्रेरित किया था। हालांकि, FxCop नियम सेट के विरुद्ध उनमें से किसी एक को चेक करने पर, मैं तुरंत I के उपयोग पर वापस आ गया। संगति यहाँ जीतता है, भी a foolish consistency is the hobgoblin of little minds हालांकि।

+1

वह बेकार है ... जब स्थिरता प्रोग्रामिंग अभ्यास को निर्देशित करना शुरू करती है, यह एक फिसलन ढलान है। – drozzy

+0

@ डोज़ज़ी: संगति * हमेशा * प्रोग्रामिंग अभ्यास को निर्देशित करता है। और "फिसलन ढलान" तर्क एक तार्किक झूठ है। वास्तव में, यदि आप प्रोग्रामिंग भाषा के लिए एक पुन: प्रयोज्य एपीआई डिज़ाइन करना चाहते हैं तो आप अपेक्षाओं को पूरा कर रहे हैं। एपीआई का उपयोग करना आसान होना चाहिए और इसका मतलब यह है कि यह उपयोगकर्ता के पहले से क्या जानता है इसके अनुरूप होना चाहिए। इस नियम का उल्लंघन करने के * कारण * हैं लेकिन कक्षा के नाम के सामने एक बेवकूफ 'I' उनमें से एक नहीं है। मुझे लगता है कि माइक्रोसॉफ्ट का नामकरण सम्मेलन बेवकूफ है लेकिन ट्रेन ने स्टेशन छोड़ा है। –

+0

एपीआई के भीतर संगति मेरी पसंद के लिए अधिक है। जब आप अन्य एपीआई के साथ संगत होना चाहते हैं तो मैं सहमत हूं, आपको अनुरूप होना है। लेकिन अगर आप स्वतंत्र रूप से एक परियोजना पर काम कर रहे हैं, और लगातार आई-उपसर्ग छोड़ते हैं, क्यों नहीं? वास्तव में, क्यों नहीं इसे नए प्रोग्रामर इसे छोड़ने के लिए सिखाएं ... – drozzy

0

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

public class CustomerImpl implements Customer 
+0

लेकिन हम कैसे जानते हैं कि ग्राहक एक इंटरफेस है और कहें, एक अमूर्त वर्ग नहीं? –

+1

मुझे लगता है कि "आईएमएल" प्रत्यय कोड को इंटरफ़ेस पर "आई" उपसर्ग से पढ़ने के लिए कठिन बनाता है, खासकर सार्वजनिक सामना करने वाले एपीआई के लिए। –

+0

@RobertS। तुम क्यो फिकर करते हो? गंभीरता से। – i3ensays

0

आप एक विकल्प के लिए कहा, तो यहाँ एक मैं सामना करना पड़ा है:

उपयोग इंटरफ़ेस वर्ग पर कोई उपसर्ग, लेकिन इसी ठोस पर एक या सी उपसर्ग का उपयोग कक्षाएं। आपका अधिकांश कोड आम तौर पर इंटरफ़ेस का संदर्भ देगा, इसलिए उपसर्ग के साथ इसे प्रदूषित क्यों करें और आम तौर पर कम इस्तेमाल किए जाने वाले ठोस प्रकार का नहीं।

यह दृष्टिकोण है कि कुछ ठोस प्रकार पहले से जुड़ा हुआ हो जाएगा में एक विसंगति (मिलान इंटरफेस के साथ वाले) को लागू करता है और दूसरों को नहीं होगा। यह उपयोगी हो सकता है क्योंकि यह डेवलपर्स को याद दिलाता है कि एक इंटरफ़ेस मौजूद है और इसके उपयोग को ठोस प्रकार पर प्राथमिकता दी जानी चाहिए।

ईमानदार होने के लिए, I इंटरफ़ेस पर उपसर्ग का उपयोग करें, लेकिन मुझे लगता है कि यह अधिक है क्योंकि मैं इसके साथ इतना आदी और आरामदायक बन गया हूं।

0

मेरी मुख्य धारणा यह है कि सबसे महत्वपूर्ण बात यह है कि कार्यान्वयन के डोमेन हिस्से में पठनीयता को बनाए रखना सबसे महत्वपूर्ण बात है। इसलिए:

  • आप एक व्यवहार और एक संभव कार्यान्वयन है, तो सिर्फ एक इंटरफेस नहीं:

    सार्वजनिक वर्ग StackOverflowAnswerGenerator {}

  • आप एक व्यवहार और कई संभव है, तो कार्यान्वयन, फिर कोई समस्या नहीं है और आप केवल "I" को छोड़ सकते हैं, और:

    सार्वजनिक इंटरफ़ेस StackOverflowAnswerGenerator {}

    सार्वजनिक वर्ग StupidStackOverflowAnswerGenerator: StackOverflowAnswerGenerator {}

    सार्वजनिक वर्ग RandomStackOverflowAnswerGenerator: StackOverflowAnswerGenerator {}

    सार्वजनिक वर्ग GoogleSearchStackoverflowAnswerGenerator: StackOverflowAnswerGenerator {}

    // ...

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

    क) उपसर्ग या प्रत्यय कार्यान्वयन (के रूप में इस विषय में कुछ अन्य उत्तर)

    ख) इंटरफेस के लिए एक अलग नाम स्थान का प्रयोग करें में कहा गया है:

    नामस्थान StackOverflowAnswerMachine।इंटरफेस { सार्वजनिक इंटरफ़ेस StackOverflowAnswerGenerator {} }

    नाम स्थान StackOverflowAnswerMachine { सार्वजनिक वर्ग StackOverflowAnswerGenerator: Interfaces.StackOverflowAnswerGenerator {} }

    ग) कार्यान्वयन के लिए एक अलग नाम स्थान का उपयोग करें:

    नामस्थान StackOverflowAnswerMachine { सार्वजनिक इंटरफ़ेस StackOverflowAnswerGenerator {} }

    नाम स्थान StackOverflowAnswerMachine.Implementations { सार्वजनिक वर्ग StackOverflowAnswerGenerator: StackOverflowAnswerMachine.StackOverflowAnswerGenerator {} }

वर्तमान में मैं पिछले संभावना के साथ प्रयोग कर रहा हूँ। ध्यान दें कि कार्यान्वयन स्रोत फ़ाइल में आप अभी भी "StackOverflowAnswerMachine का उपयोग कर सकते हैं;" और डोमेन ऑब्जेक्ट्स तक सुविधाजनक पहुंच है।

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

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

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