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


92

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

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


6
यह एक अच्छा सवाल है! इसे बंद करना IMHO अनुचित है, प्रोग्रामर साइट को माइग्रेट करना बेहतर होगा।
टिमोफेई 12

1
मैं सहमत हूं, फिर से शुरू या स्थानांतरित किया जाना चाहिए
ftl


मैंने इन उत्कृष्ट प्रश्नों में से बहुत से "कैस्परऑन द्वारा बंद" देखे हैं। हो सकता है कि वह विकिपीडिया पर विलोपनकर्ता के रूप में काम कर सके?
प्रतिलाक्ष

जवाबों:


58

मैं केंट बेक द्वारा कार्यान्वयन पैटर्न के कुछ अंशों का हवाला दूंगा :

सरल सुपरक्लास नाम

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

योग्य उपवर्ग का नाम

"उपवर्गों के नाम दो काम हैं। उन्हें यह बताने की आवश्यकता है कि वे किस वर्ग के हैं और वे कैसे भिन्न हैं। [...] पदानुक्रमों की जड़ों के नामों के विपरीत, उपवर्ग नामों का उपयोग लगभग बातचीत में नहीं किया जाता है, इसलिए वे संक्षिप्त होने की कीमत पर अभिव्यंजक हो सकते हैं। [...]

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

उपवर्ग नामकरण में एक और शिकन कई स्तर की पदानुक्रम है। [...] तत्काल सुपरक्लास में संशोधन करने वालों को आंखें मूंदकर, पाठक के नजरिए से नाम के बारे में सोचें। इस वर्ग को जानने के लिए उसे किस वर्ग की आवश्यकता है? उपवर्ग नाम के आधार के रूप में उस सुपरक्लास का उपयोग करें। "

इंटरफेस

नामकरण इंटरफेस की दो शैली इस बात पर निर्भर करती है कि आप इंटरफेस के बारे में कैसे सोच रहे हैं। कार्यान्वयन के बिना कक्षाओं के रूप में इंटरफेस को नाम दिया जाना चाहिए जैसे कि वे कक्षाएं थीं ( सरल सुपरक्लास नाम , योग्य उपवर्ग नाम )। नामकरण की इस शैली के साथ एक समस्या यह है कि नामकरण की कक्षाएं लेने से पहले अच्छे नामों का उपयोग किया जाता है। कहा जाता है एक इंटरफेस फ़ाइल जैसा कुछ कहा एक कार्यान्वयन वर्ग की जरूरत है ActualFile , ConcreteFile , या (छी!) FileImpl(प्रत्यय और संक्षिप्त नाम दोनों)। सामान्य तौर पर, यह संप्रेषित करना कि क्या कोई ठोस या अमूर्त वस्तु के साथ काम कर रहा है, क्या यह महत्वपूर्ण है कि क्या अमूर्त वस्तु को एक इंटरफ़ेस या सुपरक्लास के रूप में लागू किया गया है या नहीं। पता लगाएं कि इंटरफेस और सुपरक्लासेस के बीच अंतर अच्छी तरह से है> नामकरण की इस शैली के द्वारा समर्थित है, जिससे आप बाद में अपना मन बदल सकते हैं।

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

अधिक विस्तृत चर्चा के लिए, पुस्तक खरीदें! यह इसके लायक है! :)


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

38

हमेशा MyClassA, MyClassB के लिए जाएं - यह एक अच्छे अल्फा सॉर्ट के लिए अनुमति देता है।

मैं तो मजाक कर रहा हूँ!

यह एक अच्छा सवाल है, और कुछ ऐसा है जिसका अनुभव मैंने बहुत पहले नहीं किया था। मैं काम पर अपने कोडबेस को पुनर्गठित कर रहा था और समस्या थी कि कहां रखा जाए, और इसे क्या कहा जाए।

असली समस्या?

मेरे पास कक्षाएं बहुत ज्यादा थीं। आप का पालन करने की कोशिश भी जिम्मेदारी सिद्धांत यह कर देगा सब कुछ सब एक साथ बहुत अच्छे आते हैं .. बल्कि एक अखंड से PrintHandler वर्ग, आप इसे विभाजित कर सकते हैं में PageHandler , PageFormatter (और इतने पर) और फिर एक मास्टर है प्रिंटर वर्ग जो यह सब एक साथ लाता है।

मेरे री-ऑर्ग में, मुझे समय लगा, लेकिन मैंने बहुत सारे डुप्लिकेट कोड को समाप्त कर दिया, मेरे कोडबेस को और अधिक तार्किक बना दिया और बहुत से नरक को सीखा जब यह एक कक्षा में एक अतिरिक्त विधि को फेंकने से पहले सोच में आता है: डी।

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

सौभाग्य!


पैटर्न नामों को वर्ग नाम में नहीं रखने पर सहमत हों। यदि बाद में कार्यान्वयन में परिवर्तन होता है तो पैटर्न क्या होगा?
thegreendroid

2
मैं एक नाम में पैटर्न का एक नाम रखूँगा। क्यों? क्योंकि अगर मुझे यह जानने के लिए कार्यान्वयन विवरण (निजी निर्माणकर्ता की तरह) को देखना है कि यह एक सिंगलटन है, तो यह मुझे एक पाठक के रूप में धीमा कर रहा है और मेरे कौशल स्तर के आधार पर, मुझे यह पता नहीं चल सकता है कि यह वास्तव में एक वर्ग का हिस्सा है। सामान्य पैटर्न का। सिंगलटन और निजी कंस्ट्रक्टर एक संदिग्ध उदाहरण है, लेकिन अधिक जटिल पैटर्न (आगंतुक, एडाप्टर आदि) के लिए यह काफी जटिल है। यदि पैटर्न में बदलाव होता है, तो पीछा किया जाता है कि वे कक्षाएं अब मौजूद नहीं
होंगी

28

अच्छे एपीआई डिजाइन के बारे में जोश बलोच की उत्कृष्ट चर्चा में कुछ अच्छे सुझाव हैं:

  • कक्षाओं को एक काम करना चाहिए और इसे अच्छी तरह से करना चाहिए।
  • यदि किसी वर्ग का नाम या व्याख्या करना कठिन है, तो शायद यह पिछले बुलेट बिंदु में सलाह का पालन नहीं कर रहा है।
  • एक वर्ग नाम को तुरंत संवाद करना चाहिए कि कक्षा क्या है।
  • अच्छे नाम अच्छे डिजाइन चलाते हैं।

यदि आपकी समस्या यह है कि आंतरिक कक्षाओं का नाम क्या है, तो शायद आपको उन्हें एक बड़े वर्ग में समेकित करना चाहिए।

यदि आपकी समस्या एक ऐसे वर्ग का नामकरण कर रही है जो बहुत अधिक सामान कर रहा है, तो आपको इसे कई वर्गों में तोड़ने पर विचार करना चाहिए।

यदि वह सार्वजनिक API के लिए अच्छी सलाह है तो वह किसी अन्य वर्ग के लिए दुख नहीं पहुंचा सकती।


1
youtube पर वीडियो लिंक youtube.com/watch?v=aAb7hSCtvGw
एंड्रयू हैरी

12

यदि आप एक नाम के साथ फंस गए हैं, तो कभी-कभी इसे बाद में संशोधित करने की प्रतिबद्धता के साथ कोई भी आधा-समझदार नाम देना एक अच्छी रणनीति है।

नामकरण पक्षाघात नहीं मिलता है। हां, नाम बहुत महत्वपूर्ण हैं, लेकिन वे इतनी महत्वपूर्ण नहीं हैं कि वे बड़ी मात्रा में समय बर्बाद कर सकें। यदि आप 10 मिनट में एक अच्छा नाम नहीं सोच सकते हैं, तो आगे बढ़ें।


9

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


3

यदि आपका "फूप्रोसेसर" वास्तव में प्रक्रिया को विफल करता है, तो उसे यह नाम देने में संकोच न करें, क्योंकि आपके पास पहले से ही एक बारप्रोसेसर, बाजप्रोसेसर, आदि हैं। जब संदेह में, स्पष्ट सबसे अच्छा है। अन्य डेवलपर्स जिन्हें आपका कोड पढ़ना है वे उसी थिसॉरस का उपयोग नहीं कर सकते हैं जो आप कर रहे हैं।

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

अंत में, याद रखें कि नंगे वर्ग का नाम यह सब नहीं है कि आपको और आपके कोड के पाठकों को आगे बढ़ना है - आमतौर पर खेलने में नामस्थान भी हैं। वे अक्सर पाठकों को पर्याप्त संदर्भ दे सकते हैं यह स्पष्ट रूप से देखने के लिए कि आपकी कक्षा वास्तव में क्या है, भले ही उसका नंगे नाम काफी सामान्य हो।

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