क्या नामकरण विरोधी पैटर्न मौजूद हैं? [बन्द है]


35

कुछ नाम हैं, जहाँ अगर आप अपने आप को उन नामों के लिए पहुँचते हैं, तो आप जानते हैं कि आप पहले ही कुछ गड़बड़ कर चुके हैं।

उदाहरण के लिए:

XxxManager
यह बुरा है क्योंकि एक वर्ग को वर्णन करना चाहिए कि वर्ग क्या करता है। यदि सबसे विशिष्ट शब्द आप के लिए आ सकता है कि वर्ग क्या करता है "प्रबंधित करें," तो कक्षा बहुत बड़ी है।

क्या अन्य नामकरण विरोधी पैटर्न मौजूद हैं?

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


1
Smurf नामकरण सम्मेलन के बारे में कैसे ?
back2dos

4
"रचनात्मक नहीं" के रूप में मतदान करने वालों के लिए - क्या आप इसका कारण बताने के लिए तैयार होंगे? केवल एक ही यह बहुत अच्छी तरह से नहीं करता है कि उत्तर कम हो सकते हैं, लेकिन यह निश्चित रूप से अन्य पांच दिशानिर्देशों को पूरा करता है ...
बिली ओनली


2
@ टिप्पणी: कोई सुझाव? मैंने इसे संपादित करने में सक्षम होने के साथ ही स्पष्ट किया है ....
बिली ओनली

1
@ हॉकिंग - मैं उस लिंक से कुछ सहमत हूँ - विशेष रूप से उस "मैनेजर" और "हैंडलर" के बारे में जो कि जाने के लिए बहुत मूल्यवान है। और मैं डिज़ाइन-पैटर्न-आधारित और अन्य विकल्पों पर नहीं बेचा गया हूं, जो कम से कम कई मामलों में अस्पष्ट लगते हैं। कभी-कभी, "कतार" या जो कुछ भी उपयुक्त हो सकता है, लेकिन अक्सर यह तथ्य कि एक प्रबंधक एक कतार में आइटम (या संदर्भ) रखता है, उन वस्तुओं के प्रबंधन का केवल एक पहलू है। जिस तरह कुछ उपयोगी "मैनेजर" द्वारा नौकरी के शीर्षक के रूप में व्यक्त किया जाता है, आईएमओ ओओपी में भी लागू होता है।
स्टीव 314

जवाबों:


22

निम्नलिखित नामकरण विरोधी पैटर्न .NET से संबंधित हैं और विशेष रूप से, C #:

  • असंगति । यदि आपने एक अग्रणी अंडरस्कोर के साथ हर क्षेत्र का नाम शुरू करने का फैसला किया है, तो उससे चिपके रहें
  • लापता स्वरों के साथ अम्बिगोस संक्षिप्त रूप । मैंने क्षेत्र के नामों को गंभीरता से देखा है जैसे कि cxtCtrlMngr। आप शायद ही अंदाजा लगा सकते हैं कि किस चीज के लिए क्या करना चाहिए।
  • बहुत लंबा और क्रियाशील नामILoginAttemptRepositoryठीक है और वर्णनात्मक है - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingवर्णनात्मक है, लेकिन निश्चित रूप से ठीक नहीं है।

7
है Iमतलब का मतलब interfaceयहां implementer, या पहले व्यक्ति एकवचन? चूंकि अधिकांश कक्षाएं एक इंटरफ़ेस को लागू करती हैं, बहुत अधिक कक्षाएं / इंटरफ़ेज़ एक पूंजी के साथ शुरू होने से एयिंग Iहै, और पठनीयता में बाधा है, और यह अपने आप में एक कोड गंध है।
उपयोगकर्ता अज्ञात

3
+1 "गायब स्वरों के साथ अंबिगोस संक्षिप्त" के लिए, जो मुझे पागल कर देते हैं!
FrustratedWithFormsDesigner

6
@ बिली ओनली: सी ++ में इंटरफेस है; वे सिर्फ कृत्रिम रूप से कक्षाओं से अलग नहीं हैं। ;)
जॉन पूर्डी

4
@ बिली ओनली: यही मेरी बात थी।
जॉन पूर्डी

2
@ मर्सिएशुलज़: ओह हाँ, मैं आपसे सहमत हूँ :) बस सोचा था कि यह इतना अपारदर्शी संक्षिप्त नाम नहीं था।
अमारा

9

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

मैं यह भी जोड़ूंगा कि "इंजन" का उपयोग प्रत्यय के रूप में "प्रबंधक" का उपयोग करने के समान है। यह बहुत अस्पष्ट है और एक वर्ग को बुलाया जाता XxxEngineहै, जो VB- शैली के मॉड्यूल को कितनी मात्रा में देता है, जिसमें तरीकों का एक गुच्छा होता है, इसलिए यह किसी भी ज्ञान या वस्तु-उन्मुख प्रोग्रामिंग के विचार के बिना "उपयोग में आसान" स्पॉट है।


7

ठीक है, पहले सरल उत्तर: टाइप करें ( http://mindprod.com/jgloss/unmainnaming.html) , जिसमें अन्य महान विचार भी हैं। जब कोई बुराई नहीं है, तो अधिक संतुलित दृष्टिकोण http://www.joelonsoftware.com /articles/Wrong.html )


7
हंगेरियन नोटेशन ALWAYS बुराई :)
वेन मोलिना

12
@Wayne: वास्तव में, यह हमेशा बुराई नहीं है। मैंने 70 के दशक के अंत में ज़ेरॉक्स में चार्ल्स के लिए काम किया और मूल नामकरण प्रणाली एक जीवनरक्षक थी। हम BCPL में काम कर रहे थे जिसमें 1 प्रकार है: पूर्णांक। प्रकार के बारे में और सब कुछ उपयोग और नामकरण सम्मेलन द्वारा अवगत कराया गया था। हमारे पास 7 प्रोग्रामर + चार्ल्स और हम में से कोई भी किसी और के कोड में चल सकता है और तुरंत उत्पादक हो सकता है। यह कहने के लिए नहीं है कि यह बुरी तरह से मुड़ / गलत तरीके से (यहां तक ​​कि चार्ल्स द्वारा) नहीं हो सकता है, बस सही संदर्भ में यह सही समाधान था।
पीटर रोवेल

3
@ मार्स: जोएल का लेख पढ़ें। प्रकार प्रणाली हमेशा चर के बीच सभी अर्थ अंतर को लागू नहीं कर सकती है। Intellisense ऐसे मामलों में भी मदद नहीं करता है।
बिली ओनली

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

3
क्या अच्छा होगा नए प्रकार को आसानी से बनाने की एक सामान्य क्षमता है। "यह एक इंट की तरह है, सिवाय इसके कि यह पंक्ति संख्याओं पर लागू होता है।"
डेविड थॉर्नले

6

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

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


@ माइक: मैं आपके कथन से पूरी तरह असहमत हूँ, क्षमा करें। मेरी राय में, XxxxManagerएक वर्ग का सबसे खराब संभव नाम है। बेशक यह कुछ का प्रबंधन करता है! यही कारण है कि इसके लिए लिखा गया था। Managerएक अर्थहीन भराव शब्द है जो समझने के लिए कोई मूल्य नहीं जोड़ता है - इसके नाम से - एक वर्ग किसके लिए जिम्मेदार है।
मारियस शुल्ज

1
के बारे में क्या कहते हैं TabManager,? एक JSP टैब तंत्र को नियंत्रित करने वाले वर्ग के लिए एक बेहतर नाम है? या हांफना TabController ... जहां तक ​​पहले से उपसर्ग है Abstract, मुझे लगता है कि यह अति प्रयोग है लेकिन अक्सर मान्य है (उदाहरणों के लिए जावा लाइब्रेरी देखें)। मुझे लगता है कि मैं सुरक्षित रूप से कह सकता हूं कि मैंने कभी Iकिसी जगह पर इंटरफेस नहीं देखा है, जहां कोई व्यक्ति उस इंटरफ़ेस के खिलाफ प्रोग्राम करने की कोशिश नहीं कर रहा था जो वहां नहीं होना चाहिए था। जैसे, केवल एक वर्ग इंटरफ़ेस को लागू करता है।
माइकल के

1
@ डेरेन (और अन्य): किसी भी तरह से - इससे कोई फर्क नहीं पड़ता। उन नामों में से कोई भी विरोधी प्रतिमान नहीं है (और इसलिए वे इस प्रश्न के लिए विषय नहीं हैं)। मुझे नहीं लगता कि आप सिस्टम के डिज़ाइन के बारे में कुछ भी कह सकते हैं कि वे उपयोग करते हैं IXxxया नहीं XxxImpl
बिली ओनली

2
यह पूरी तरह से गलत है। हैं बहुत अच्छे कारणों नेत्रहीन वर्गों से इंटरफेस भेद करने के लिए: (क) वे instantiated नहीं किया जा सकता है, (ख) वे मुक्त नहीं किया जा सकता है / निपटाए, (ग) वे धारावाहिक नहीं किया जा सकता, (घ) वे कर सकते हैं हो सकता है प्रॉक्साइड / इंटरसेप्टेड, आदि, आदि, आदि। आपने अभी-अभी कुछ ऐसा किया है जिसे आप व्यक्तिगत रूप से नापसंद करते हैं (कुछ विचित्र और अस्पष्टीकृत कारण के लिए) बिना किसी औचित्य के एक विरोधी पैटर्न के उदाहरण के रूप में।
आरोह

1
जब भी संभव हो, तर्कों और वापसी प्रकारों के लिए कंक्रीट वर्गों पर इंटरफेस को प्राथमिकता दी जानी चाहिए। इसलिए, यह "साफ" नाम पाने के लिए इंटरफेस के लिए समझ में आता है, और ठोस कार्यान्वयन (वास्तविक प्रकार जिसमें कॉलर को पता भी नहीं हो सकता है या परवाह नहीं है) मौसा को पाने के लिए।
केविन क्रुमविडे

6

Speeling:

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


2
मैंने संक्षेप में एक jQuery प्लगइन का उपयोग किया जहां मापदंडों में से एक affect(प्रभाव के बजाय) था। इसने मुझे पागल कर दिया और मुझे एक ही काम करने के लिए जल्दी से एक अलग प्लगइन मिला।
zzzzBov

4
मेरे पास सबसे बुरी समस्या यह है कि, एक बार मुझे एक गलत वर्तनी वाला नाम दिखाई देता है, यह वास्तव में याद रखने की मेरी क्षमता को नुकसान पहुंचाता है कि नाम क्या हैं।
डेविड थॉर्नले

1
यह तब और खराब हो जाता है जब एक ही चीज को कोड के अलग-अलग हिस्सों में अलग-अलग तरीके से लिखा जाता है। जैसे कि जब आपके पास विधि getStrenth () द्वारा पहुंची कक्षा Srtength का एक क्षेत्र है।
ईवा

5

वैसे मुझे डर है कि मेरी राय थोड़ी विवादास्पद है। लेकिन कोशिश करते हैं ...

जहां तक ​​मेरा सवाल है मुझे माइक बैरनज़ाक से सहमत होना होगा, एक्सएक्सएक्सकंट्रोलर, एक्सएक्सएक्सहैंडलर जैसे नाम कुछ ऐसा है जिसका हम अक्सर उपयोग करते हैं। हमारे लिए एक नियंत्रक कुछ "एनकैप्सोलेटेड" के लिए एक प्रविष्टि बिंदु की तरह है, जैसे लेनदेन का प्रबंधन, अप्रत्याशित त्रुटियों से निपटना, वास्तविक कार्य करने के लिए XxxHandler को कॉल करना। मैं कहूंगा कि एक XxxManager एक नियंत्रक का एक पर्याय है। मुझे लगता है कि इसका एक मामले में प्रबंधक और दूसरे में नियंत्रक का उपयोग नहीं करना महत्वपूर्ण है। यदि आप किसी टीम में काम करते हैं तो लगातार रहना बहुत महत्वपूर्ण है।

यह वास्तव में कठिन होगा या इस तरह से सामान के लिए बेहतर नाम खोजने के लिए भी संभव नहीं होगा। स्थिति को अधिक स्पष्ट बनाने के लिए Xxx को अच्छी तरह से चुना जाना चाहिए।

जब मैं व्यक्तिगत रूप से पसंद नहीं करता हूं, जब एक विधि प्राप्त होती है ... या सेट ... बस एक साधारण एक्सेसर से अधिक है। मुझे हिरासत के लिए ... पसंद है।

एक और बात, जो मेरे दिमाग में आती है: चाचा बॉब के अनुसार। विधि नाम में एक "और" बहुत कुछ करने का संकेत है। लेकिन जीवन हमेशा केवल काले और सफेद नहीं होता है - ऐसी परिस्थितियां हैं जहां मुझे लगता है कि यह ठीक है - जैसे। प्रदर्शन के मुद्दों के कारण (जब आपके पास पहले से ही डेटा है कि जाँच क्यों उन्हें संसाधित नहीं करना है ...)

मैं व्यक्तिगत रूप से भी प्रणालियों की एक बड़ी प्रशंसक हूं आयु की आयु - जब आप एक IDE ok में सोर्सकोड के साथ काम कर रहे होते हैं। लेकिन अक्सर आप सिर्फ एक संपादक का उपयोग कर रहे हैं या आप एक ब्राउज़र में रेपो ब्राउज़ कर रहे हैं। एक नुकसान टाइप-उपसर्गों के कारण टूलएप हो सकता है ...

मुझे लगता है कि सबसे महत्वपूर्ण बात मधुमक्खी का कंसंटेंट है - एक उप-अपनाने वाला सम्मेलन - मेरे लिए - कोई सम्मेलन नहीं होने से बेहतर है ...


1
"नियंत्रक" के "प्रबंधक" की तुलना में अलग शब्दार्थ है। व्यक्तिगत रूप से, मुझे या तो पसंद नहीं है, लेकिन "नियंत्रक" द्वारा प्राप्त होता है क्योंकि यह कई पैटर्न का एक सामान्य घटक है, विशेष रूप से एमवीसी। XxxHandler उतना ही बुरा है। यदि वर्ग कुछ "बस" संभालता है - तो या तो वर्ग बहुत बड़ा है, या इसे सिर्फ "एक्सएक्सएक्स" भाग कहा जाना चाहिए।
बिली ओनली

3
"यह वास्तव में कठिन होगा या इस तरह से सामान के लिए बेहतर नाम खोजने के लिए भी संभव नहीं होगा" - न कि यदि आपने अच्छी तरह से परिभाषित निर्भरता और जिम्मेदारियों के साथ अपने प्रकार के पदानुक्रम को ठीक से डिज़ाइन किया है। बेशक यदि आप "कंट्रोलर" का उपयोग किसी सामान्य घटना / संदेश हैंडलर के लिए MVC या "हैंडलर" के हिस्से के रूप में कर रहे हैं, तो यह अलग है - वे शब्दजाल के उदाहरण हैं - लेकिन अगर वे अभी बीमार के लिए सामान्य नाम के रूप में उपयोग किए जा रहे हैं परिभाषित वर्ग तब एक प्रमुख लाल झंडा होता है।
हारून

5

शायद सबसे खराब नामकरण विरोधी पैटर्न यह एक है:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

हमारे पास [फू, बार] जोड़े की तीन-तत्व सूची है। यदि हमें चौथे की आवश्यकता है, तो हमें तालिका में नए कॉलम जोड़ने होंगे।

इस तरह कोड करने के लिए अग्रणी:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

कॉलम फू और बार के साथ एक अलग तालिका बनाई जानी चाहिए और सामान तालिका से जोड़ा जाना चाहिए:

create table fubar(foo string, bar string, stuff_id long)

दूसरा सबसे बुरा यह है:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

यहां हमारे पास पता वर्ग के दो उदाहरणों के बजाय छह फ़ील्ड हैं।

इस विरोधी पैटर्न को दो सेटों के प्रत्येक संयोजन को सूचीबद्ध करने वाले दो-भाग नामों की एक श्रृंखला द्वारा चिह्नित किया जाता है, जैसे [foo, bar] x [1,2,3] या [घर, पर्म] x [सड़क, शहर, राज्य]


-1 - इसमें नामकरण का जिक्र नहीं है।
बिली ओनली

एक नामकरण विरोधी पैटर्न में एक से अधिक नाम शामिल नहीं हो सकते?
केविन क्लाइन

==एंटीपैटर का नामकरण करने के लिए कितने तर्क हैं ? मैं उलझन में हूं।
बिली ओनली

1
जहां तक ​​मैं उसे समझता हूं, सम्मेलन एक है जो उन संख्याओं की अनुमति देता है जहां एक वास्तविक नाम लिया जाना चाहिए। इन नंबरों से एक गलत धारणा
बनती है

3
@ बिली ओनली: हां वे करते हैं। डिजाइन की समस्या सामान्यीकरण की कमी है, और संख्या प्रत्यय नामकरण पैटर्न हैं जो इसे इंगित करते हैं।
रीयरियरपोस्ट

3

किसी भी वर्ग या इंटरफ़ेस का नामकरण जो कि एक तानशास्त्र है, एक बुरा है, न केवल जावा में जो लिंक के बारे में बात करता है, लेकिन किसी भी भाषा में।

पुनरावृत्ति स्पष्टता प्रदान नहीं करता है, भले ही एक ही बात कहने के लिए अलग-अलग शब्दों का उपयोग करते हुए टॉटोलॉजी (बयानबाजी)।


2
दिलचस्प। कोई उदाहरण?
माइक बैरकज़क

2
मैं इस लिंक को पढ़ता हूं, यह "टॉटोलॉजी" ...;)
कहता है

10
टॉटोलॉजी क्लब का पहला नियम टॉटोलॉजी क्लब का पहला नियम है।
Cercerilla

मैंने लिंक पढ़ा (ठीक है, लिंक की सामग्री ) और कोई उदाहरण नहीं मिला
बंजर

ठीक है तो उस लिंक के अनुसार हमें I <InterfaceName> ... का उपयोग करना बंद कर देना चाहिए।
दाल

3

मैं अक्सर सॉफ्टवेयर पुस्तकालयों का सामना करता हूं जैसे कि सामान्य नाम Libraryया Common। वे सबॉप्टीमल डिज़ाइन को इंगित करते हैं: डेवलपर्स कोड के दोहराव से बचने का प्रयास करते हैं लेकिन कार्यक्षमता के आधार पर विघटित डिज़ाइन बनाने का कोई प्रयास किए बिना।


+1 - मैं हर समय "कॉमन" देखता हूं।
मॉर्गन हेरलॉकर

1

नामकरण पर Microsoft से , मैं यह सूची बुरे नामों के लिए प्रदान कर सकता हूं:

  1. वे शब्दार्थ नहीं हैं, जिसका अर्थ है कि उनके पास ऐसे नाम हैं जो यह करने पर जोर देने के बजाय, उस तकनीक पर जोर देते हैं जो इसका उपयोग करता है या जिस पैटर्न पर यह आधारित है
  2. वे एक वाक्यात्मक संगति का पालन नहीं करते हैं। उदाहरण के लिए, नाम का हिस्सा ऊंट आवरण है, जबकि अन्य भाग पास्कल आवरण है।
  3. वे संक्षिप्त रूपों, जो मुश्किल है समझने के लिए, की तरह हैं ScrollableX बजाय CanScrollHorizontally
  4. उन्होंने ऐसा चुना है कि वे उस वातावरण के खोजशब्दों के साथ खिलवाड़ करते हैं।

2
मुझे वास्तव में "स्क्रॉलेबलएक्स" कम से कम उतना ही पसंद है जितना कि "कैनस्क्रोल हॉररॉली"। "X" वास्तव में एक संक्षिप्त नाम नहीं है।
user1172763
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.