क्या नामकरण प्रकारों के लिए अच्छी तकनीक या परीक्षण हैं?


23

एक अजीब, खुला सवाल है, लेकिन यह एक ऐसी समस्या है, जिसका मैं हमेशा से विरोध कर रहा हूं:

सॉफ्टवेयर जिसे बनाए रखना आसान है और इसके साथ काम करना आसान है। एक डिजाइन को सहज बनाने की कोशिश करने का मतलब है कि अपने घटकों का नामकरण इस तरह से किया जाए कि अगला डेवलपर घटक के कार्य को समझने में सक्षम हो। यही कारण है कि हम अपनी कक्षाओं का नाम "टाइप 1", "टाइप 2" आदि नहीं रखते हैं।

जब आप वास्तविक दुनिया की अवधारणा (उदाहरण के लिए ग्राहक) का निर्माण कर रहे होते हैं, तो यह आमतौर पर वास्तविक दुनिया की अवधारणा के बाद अपने प्रकार का नामकरण के रूप में सरल होता है। लेकिन जब आप अमूर्त चीजों का निर्माण कर रहे होते हैं, जो अधिक प्रणाली-उन्मुख होते हैं, तो उन नामों से बाहर भागना बहुत आसान होता है जो पढ़ने में आसान होते हैं और पचाने में आसान होते हैं।

यह खराब हो जाता है (मेरे लिए) प्रकार के परिवारों के नाम की कोशिश करते समय, बेस-टाइप या इंटरफ़ेस के साथ जो बताता है कि घटकों को क्या करना है, लेकिन यह नहीं कि वे कैसे काम करते हैं। यह स्वाभाविक रूप से कार्यान्वयन के स्वाद (उदाहरण के लिए IDataConnectionऔर SqlConnection.NET फ्रेमवर्क) में वर्णन करने की कोशिश कर रहे प्रत्येक व्युत्पन्न प्रकार की ओर जाता है , लेकिन आप "प्रतिबिंब द्वारा काम करता है और विशिष्ट विशेषताओं के लिए खोज" जैसे कुछ जटिल कैसे व्यक्त करते हैं?

उसके बाद, आप अंततः प्रकार आपको लगता है के लिए एक नाम चुन लेने पर जब यह बताता है कि यह करने के लिए कोशिश कर रहा है, अपने सहकर्मी पूछता है "WTF इस करता है DomainSecurityMetadataProviderवास्तव में करते हैं? "

क्या घटक के लिए एक अच्छी तरह से नाम का चयन करने के लिए कोई अच्छी तकनीक है, या घटकों के परिवार का निर्माण कैसे किया जा सकता है?

क्या कोई सरल परीक्षण है जिसे मैं नाम के लिए बेहतर महसूस करने के लिए नाम पर लागू कर सकता हूं कि क्या नाम "अच्छा" है, और दूसरों के लिए अधिक सहज होना चाहिए?


20
देखते हैं छह तकनीक है कि मेरे लिए काम साबित हो गया: 1) नाम 2) उपयोग कोड समीक्षा की खोज करने पर समय की एक बहुत खर्च करते हैं 3) नाम बदलने के लिए 4 में संकोच नहीं करते) के नाम 5) उपयोग कोड समीक्षा की खोज करने पर समय की एक बहुत खर्च करते हैं 6) नाम बदलने में संकोच न करें
gnat

5
@gnat: कृपया अपना जवाब एक उत्तर के रूप में पोस्ट करें ताकि हम इसे वोट कर सकें।
13:13


3
मैं अक्सर अच्छे नामों के साथ आने में मदद करने के लिए नए विकास करते समय थिसॉरस का उपयोग करता हूं।
डॉ। विली का अपरेंटिस

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

जवाबों:


41

नामकरण के लिए, छह तकनीकें हैं जो मेरे लिए काम करने वाली साबित हुईं:

  1. नामों का आविष्कार करने में बहुत समय बिताते हैं
  2. कोड समीक्षा का उपयोग करें
  3. नाम बदलने में संकोच न करें
  4. नामों का आविष्कार करने में बहुत समय बिताते हैं
  5. कोड समीक्षा का उपयोग करें
  6. नाम बदलने में संकोच न करें

पुनश्च। यदि आपका API सार्वजनिक होने जा रहा है, तो इससे पहले कि ऊपर लागू होता है - क्योंकि, आप जानते हैं,

"सार्वजनिक एपीआई, हीरे की तरह, हमेशा के लिए होते हैं। आपके पास इसे पाने का एक मौका है इसलिए इसे अपना सर्वश्रेष्ठ दें ..." (जोशुआ बलोच, एक अच्छा एपीआई कैसे डिज़ाइन करें और यह क्यों मायने रखता है )


1
यदि यह एक सार्वजनिक एपीआई है, तो तीन अतिरिक्त तकनीकें हैं जिनका आप उपयोग कर सकते हैं ...
चाचा

1
@UncleZeiv: जैसे कि ....?
FrustratedWithFormsDesigner

3
@FrustratedWithFormsDesigner: 1. नामों का आविष्कार करने में बहुत समय बिताएं 2. कोड समीक्षाओं का उपयोग करें और 3. नाम बदलने में संकोच न करें
S.Lott

3
इस उत्तर ने मुझे आश्वस्त किया है कि आम तौर पर: नहीं, नामों को सही करने का कोई आसान तरीका नहीं है। केवल वास्तव में कड़ी मेहनत की कोशिश कर रहा है।
पॉल टर्नर

4
7. प्रकारों या कार्यों को फिर से डिज़ाइन करने में संकोच न करें अगर यह पता चला कि उनके लिए एक उचित नाम तैयार करना असंभव है। अच्छी तरह से डिजाइन किए गए कोड को हमेशा ठीक से नाम दिया जा सकता है।
जोरेन

8

मेरा आधार परीक्षण यह है कि यदि आप चर के केवल शब्दों का उपयोग करके चर के कार्य का वर्णन कर सकते हैं:

उदाहरण के लिए यदि DomainSecurityMetadataProvider या तो "डोमेन सुरक्षा मेटाडेटा प्रदान करता है" या "डोमेन सुरक्षा से संबंधित मेटाडेटा प्रदान करता है", तो यह अच्छा है।

हालांकि, ऐसी बारीकियां हैं जो एक व्यक्ति से दूसरे व्यक्ति में भिन्न होती हैं:

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

तो मेरा विस्तारित परीक्षण एक बोर्ड / विकी / चैट पर चर को लिखने के लिए है, और लोगों को लगता है कि इसका क्या मतलब है।


7

क्या घटक के लिए एक अच्छी तरह से नाम का चयन करने के लिए कोई अच्छी तकनीक है, या घटकों के परिवार का निर्माण कैसे किया जा सकता है?

ज़रुरी नहीं।

हालांकि, एक टिप "निष्क्रिय आवाज" से बचने के लिए है।

"DomainSecurityMetadataProvider" निष्क्रिय है। कोई क्रिया नहीं है, यह सभी संज्ञाएं और संज्ञाएं हैं जो विशेषण के रूप में उपयोग की जाती हैं।

"ProvMetadataForDomainSecurity" अधिक सक्रिय है। एक क्रिया है।

वस्तु-उन्मुख प्रोग्रामिंग सभी (वास्तव में) संज्ञा-क्रिया है। संज्ञा == वस्तु। क्रिया == विधि। तो एक वर्ग का नाम आम तौर पर बहुत "संज्ञा" है। इस आदत को तोड़ने के लिए, और क्रियाएं डालना शुरू करें, मुश्किल है।

क्या कोई सरल परीक्षण है जिसे मैं नाम के लिए बेहतर महसूस करने के लिए नाम पर लागू कर सकता हूं कि क्या नाम "अच्छा" है, और दूसरों के लिए अधिक सहज होना चाहिए?

हाँ। आपने अपने प्रश्न में एक उत्कृष्ट परीक्षा को परिभाषित किया। अन्य लोगों से पूछें।

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


12
यकीन नहीं है कि मैं निष्क्रिय आवाज विचार से सहमत हूं। मेरे लिए, कक्षाएं संज्ञा के रूप में अधिक समझ में आती हैं।
डेवॉर्ड

7
सामान्यतया, मैं निष्क्रिय स्वर में अपने प्रकार के नाम रखने की कोशिश कर रहा हूं, क्योंकि यह OOP की संज्ञा-क्रिया शैली के अनुरूप है। मैं ProvideMetadataForDomainSecurityएक गरीब प्रकार का नाम होगा। विधि नाम आम तौर पर ठीक नाम के लिए बहुत आसान होते हैं क्योंकि मैं उपयोग क्रिया का उपयोग करने के लिए स्वतंत्र हूं। भाषा पर प्रतिबंध समस्या का मूल है।
पॉल टर्नर

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

2
कक्षा करना संज्ञाओं के रूप में बना भावना। मुद्दा ये जटिल वर्ग हैं जिनमें लंबे संज्ञा-विशेषण वाक्यांश हैं। प्रस्ताव भी मदद कर सकते हैं।
एस.लॉट

2
सहयोग अच्छे सॉफ्टवेयर का रहस्य है। सहयोग में समय लगता है। अच्छे लेखन के लिए कोई शाही सड़क नहीं है।
एस.लॉट

6

एक थिसॉरस का उपयोग करना

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

कक्षाएं जिनमें मुख्य रूप से ऑपरेशन लॉजिक होता है

मैं उन कक्षाओं को नाम देता हूं जो मुख्य रूप से संज्ञा-क्रिया संरचना में ऑपरेशन के तरीके प्रदान करते हैं जैसे "एंटिटीप्रॉइडर", "एंटिटीलोकेटर", आदि।

इन वर्गों में आम तौर पर बहुत अधिक राज्य नहीं होते हैं।

जिन वर्गों में राज्य होता है

यूआई स्क्रीन और डेटा एंटिटी आमतौर पर स्टेटफुल होती हैं, और इसलिए मैं इन कक्षाओं को केवल संज्ञा या विशेषण-संज्ञा पैटर्न के साथ नाम देता हूं।

उदाहरण: व्यक्ति, कर्मचारी, करंट कर्मचारी, पूर्व कर्मचारी

उपयोगिता वर्ग

जिन कक्षाओं में केवल स्थिर विधियां होती हैं, उन्हें आमतौर पर "उपयोगिता" वर्ग माना जाता है, इसलिए मैं लगातार उन्हें "उपयोगिता" प्रत्यय के साथ नाम देता हूं।

उदाहरण: नेटवर्क यूटिलिटीज, फाइल यूटिलिटीज

टेस्ट

मेरे पास यह तय करने के लिए कोई अच्छा परीक्षण नहीं है कि क्या कुछ खराब रूप से नामित है, लेकिन मैं नाम में एक संज्ञा और / या एक क्रिया का उपयोग करने का प्रयास करने का सुझाव दूंगा, फिर सोचें कि क्या उस संज्ञा / क्रिया का सही वर्णन किया गया है जो आप ' नामकरण।

यदि आपको लगता है कि नाम से कब्जा नहीं किया गया है, तो उस वर्ग / विधि के लिए और भी बहुत कुछ है, जिसे कक्षा / विधि को फिर से तैयार करने की आवश्यकता हो सकती है।

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

जेफ का लेख स्टीव मैककोनेल के कोड कम्प्लीट से सुझाए गए दिशानिर्देशों की एक सूची भी प्रदान करता है।

चर

हाल ही में मैं लंबे वर्णनात्मक चर / पैरामीटर नाम के साथ प्रयोग कर रहा हूं, जिसमें पूर्वसर्ग शामिल हैं, जैसे "", "बाय", "फॉर", आदि। कुछ उदाहरण नीचे दिखाए गए हैं:

string firstNameOfEmployee;

string lastNameOfEmployee;

// here I nimbly avoid worrying about whether to call it "Id" or "ID" :)
int idOfEmployee;

decimal amountForDeposit;

Account accountForDeposit;

मुझे लगता है कि यह विजुअल स्टूडियो के शानदार फीचर के साथ ठीक काम करता है जिससे इन लंबे नामों को टाइप करना आसान हो जाता है। मुझे यह भी पता चलता है कि चर नाम उपसर्गों (जैसे personID, personFirstName, personLastName बनाम idOfPerson, firstNameOfPerson, lastNameOfPerson) का कम दोहराव है, एक बेहतर "हैश" प्रदान करता है जो इंटैलिजेंस को और भी अधिक उपयोगी बनाता है।


1
मैं लंबे चर नामों के बारे में फिर से बात करूंगा, विजुअल स्टूडियो (यदि आप इसका उपयोग कर रहे हैं) तो इसे नो-ब्रेनर बनाता है। लंबे वैरिएबल के नाम रखना बहुत कम हानिकारक है जो कि छोटे वैरिएबल नामों की तुलना में स्पष्ट होते हैं, जहां आपको इस बारे में "सोचना" पड़ता है या जांचना पड़ता है कि नाम का वास्तव में क्या मतलब है। संदर्भ के बारे में भी सोचें। मैं बल्कि "listOfPeople" की तुलना में "PeopleToDelete" देखूंगा। फिर से, Visual Studio आपको चर का प्रकार बताता है, इसे शामिल करने की कोई आवश्यकता नहीं है।
जॉन बुब्रिस्की

मैं आपके द्वारा चर नामों में जोड़े गए विस्तृत हंगेरियन अंकन को भी नापसंद करता हूं। अगर व्यक्ति आईडी List, सरणी, IEnumerableया का एक संग्रह है, तो मुझे परवाह नहीं करनी चाहिए ConcurrentQueue। यह IDs का एक गुच्छा है, जिस पर मुझे गणना करने की आवश्यकता है, और उनके संग्रहित होने का कार्यान्वयन विवरण अनावश्यक मानसिक सामान है। हालाँकि मैं आम तौर पर इस बात से सहमत हूँ कि अगर एक लंबा नाम बहुत अधिक वर्णनात्मक है, तो इसे कम, कम स्पष्ट नाम पर पसंद किया जाना चाहिए।
एलोन गुरिलनेक

@Allon - फनी, मैं SkippyFire की टिप्पणी के आधार पर अपने उत्तर को संशोधित करने वाला था। मैं वास्तव में आप से सहमत हूँ; मेरा उदाहरण हंगरी संकेतन की स्मैक है। मेरा एकमात्र बचाव यह है कि कोड को पढ़ना आसान है और बिना आईडीई के उपलब्ध डीटेटिप्स को समझना, जैसे कि मैं एक स्रोत-नियंत्रण अंतर के माध्यम से पढ़ रहा हूं। हालांकि यह कोई बहाना नहीं है। :) मैं अपने उदाहरण को संशोधित करने जा रहा हूं, पहले NameOfEmployee, lastNameOfEmployee, इत्यादि की तर्ज पर
डॉ। विली की अपरेंटिस

2

फिर, जब आपने अंततः उस प्रकार के लिए एक नाम चुन लिया है जो आपको लगता है कि यह वर्णन करता है कि यह क्या करने की कोशिश कर रहा है, तो आपका सहयोगी पूछता है "WTF क्या यह DomainSecurityMetadataProvider वास्तव में करता है?"

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

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


प्रश्न में मेटाडेटा नहीं है प्रतिबिंब से व्युत्पन्न (लेकिन यह कैसे प्रकार के इलाज के लिए का वर्णन करता है)। प्रकार एक ISecurityMetadataProviderइंटरफ़ेस को लागू करता है, जो सबसिस्टम को जानकारी प्रदान करने के लिए सुरक्षा बुनियादी ढांचे में एक इंजेक्शन बिंदु मौजूद है। नामकरण कठिन है।
पॉल टर्नर

मैं वस्तु का DomainSecurityMetadataProviderप्रदाता मानता हूं DomainSecurityMetadata, जहां DomainSecurityMetadataमेटाडेटा ही है। स्पष्ट और समझने योग्य नाम। मुझे यह भी जानने की जरूरत नहीं है कि क्या हैDomainSecurityMetadata है! यह सिर्फ कुछ वस्तु है, जो यह प्रदाता प्रदान करता है। बस एक Providerप्रत्यय को हटाने से पठनीयता में सुधार नहीं होता है, लेकिन इसके विपरीत - इसे कम करें। इस प्रत्यय के बिना मुझे लगता है कि यह सिर्फ कुछ मेटाडेटा (कुछ मेटाडेटा के लिए कंटेनर ऑब्जेक्ट) है, लेकिन मेटाडेटा (एक प्रदाता) से प्राप्त करने के लिए ऑब्जेक्ट नहीं है।
रुस्लान Stelmachenko

0

सिस्टम के कुछ हिस्सों का वर्णन करने के लिए रूपकों का उपयोग करें। इतना ही नहीं यह आपको नए उपमाओं की खोज करने में मदद करेगा, यह आसान नामकरण में मदद करेगा।

(मुझे पता है कि यह एक मजबूत उदाहरण नहीं है, लेकिन वैसे भी) उदाहरण के लिए आप एक चर या एक प्रकार को कॉल कर सकते हैं mailbox, जो एक वर्ग के लिए प्राप्त संदेशों के लिए एक कतार के रूप में कार्य करता है।


-1

एक बात पर मैं बहुत दृढ़ रहूंगा कि नाम गलत होने की अनुमति नहीं दी जानी चाहिए । सबसे अच्छा उदाहरण, कुछ फिर से फैक्टरिंग के दौरान, बहुत सारे कोड बदल गए, और कुछ चर ने उनके नाम के अलावा कुछ और का उल्लेख करना शुरू कर दिया।

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


1
आप इस उत्तर को हटा दें और अपने मूल उत्तर को संपादित करें
Ryathal

मुझे लगता है कि यह मेरे दूसरे जवाब का एक अलग जवाब है।
डेवॉर्ड १३'१२

-1

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

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