2009-06-11 8 views
19

तो, मुझे अक्सर एक संक्षिप्त नाम में एक फ़ंक्शन का वर्णन करने में परेशानी होती है। यह आम तौर पर पुन: उपयोग के लिए किए गए कार्यों में कोई समस्या नहीं है, लेकिन अक्सर उप-कार्यों में एक बड़ी प्रक्रिया को तोड़ने की आवश्यकता होती है। अक्सर इन्हें अजीब नाम मिलते हैं, जैसे कि connectionsToAccessLines या handleWallVisionSplit या ऐसा कुछ। और जबकि ये कार्य केवल एक चीज करते हैं, उनके लिए एक अच्छा नाम आना बहुत मुश्किल है क्योंकि वे वास्तव में एक बड़े एल्गोरिदम का केवल एक हिस्सा हैं।कार्यों के लिए अच्छे नामों के साथ समस्या

आप इस स्थिति में क्या करते हैं? यह बहुत निराशाजनक है।

+5

यह विकी होना चाहिए। – gnovice

उत्तर

17

कभी कभी अगर तुम नहीं यह एक संकेत समारोह एक अच्छा नहीं है कि एक अच्छा समारोह नाम के साथ आने कर सकते हैं , कुरकुरा फोकस और refactored की जरूरत है। यदि यह एक क्लास विधि है, तो शायद कक्षा को भी रिफैक्टरिंग की आवश्यकता है।

लेकिन सर्वोत्तम संभव नाम खोजने में परेशानी के लायक है, क्योंकि यह आपके कोड को और अधिक समझने योग्य और प्रयोग योग्य बनाता है।

अद्यतन: कई सॉफ्टवेयर इंजीनियरिंग लेखकों ने नामकरण के महत्व के बारे में बात की है। हेनरी एफ। लेडगार्ड का Programming Proverbs (1 9 75) और ब्रायन कर्निघन और पीजे प्लोगर का Elements of Programming Style (1 9 78) प्रारंभिक थे और अभी भी पढ़ने योग्य हैं। स्टीव मैककनेल का अद्भुत Code Complete (द्वितीय संस्करण, 2005) एक और हालिया उदाहरण है, जो विषय के लिए एक संपूर्ण अध्याय समर्पित है।

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

+1

हां। दृढ़ता से सहमत। – PeterAllenWebb

+0

कभी-कभी आप दक्षता के कारण भागों में किसी फ़ंक्शन को विभाजित नहीं कर सकते हैं। उदाहरण के लिए, एक सेट के माध्यम से पुनरावृत्त करना और साथ ही उन मानों को किसी दूसरे में ढूंढना, और जब उन्हें दोनों को हटा दिया जाता है, लेकिन पहले उन्हें एक तीसरे कंटेनर में डाल दिया जाता है जो वापस आ जाता है, उर्फ ​​MoveSetUnionToNewSet। यह इस कार्य को विभाजित करने के लिए एल्गोरिदमिक जटिलता में काफी वृद्धि करेगा। – rlbond

+0

बहुत सच है, और स्ट्रंक और व्हाइट ने अर्थ के लिए जरूरी शब्दों को हटाने का सुझाव नहीं दिया होगा। "MoveSetUnionToNewSet" निश्चित रूप से मेरी पुस्तक में बहुत लंबा नहीं है, हालांकि शायद स्पष्ट होगा "सेट एक्स्ट्रेक्टसेट (सेट ए, सेट बी)"। –

13

मैं बड़े एल्गोरिदम के संदर्भ में हास्यास्पद रूप से लंबे विधि के नामों की बजाय यह कार्य के कार्यान्वयन को देखने की आवश्यकता को कम कर देता है।

ReadPropertiesFromFileThenWriteToSession की तरह एक नाम ReadProps से बेहतर है।

+8

हां, लंबे नाम छोटे, असाधारण नाम जैसे व्यवहार (int आईडी) के लिए निश्चित रूप से बेहतर हैं; लेकिन या तो ओवरबोर्ड पर न जाएं। यदि आप एक शब्द या संक्षिप्त वाक्यांश में वर्णन नहीं कर सकते हैं कि विधि क्या कर रही है, तो इसे और विधियों में विभाजित करें :) –

+1

मैं कहूंगा कि उसमें एक समस्या है जब आप एक विधि को अंततः अधिक तरीकों से कॉल करना चाहते हैं। विधि 1 DoXAndYIfZ को कॉल करता है (जो कुछ चर/राज्य जांच को समाहित करता है), जो एक्स और वाई को अलग से कॉल करता है। इस तरह के मामलों में, जब आप उच्च-स्तरीय विधि में ब्रांचिंग तर्क नहीं चाहते हैं, तो आप इसे "अधिक विधियां" नहीं जोड़ सकते हैं। तो आपका नाम लंबा हो जाता है। –

+2

... हालांकि सामान्य रूप से मैं केवल आपके साथ सहमत हूं "जब एक छोटे से नाम के साथ परेशानी हो रही है, तो एक चेतावनी के रूप में बस एक लंबा नाम बनाएं"! :) –

0

आपके कार्यों को वास्तव में यह कहना चाहिए कि वे क्या करते हैं! लेकिन एक अत्यधिक verbose तरीके से नहीं। यह ऐसा कुछ है जो आप समय के साथ मास्टर करेंगे, यह एक कार्य सही करने में थोड़ा सा अभ्यास लेता है।

this की एक त्वरित पढ़ा कुछ सामान मैं बात इस तरह का के बारे में समय पहले लिखा था देखने के लिए है :) वाकई other article है कि मुझे प्रेरित इसे लिखने और टिप्पणियों की जांच करने के लिए के माध्यम से पालन करते हैं।

0

पुस्तकें रिफैक्टरिंग से एक सुझाव लंबी एल्गोरिदम को देखना है और हर जगह आपको लगता है कि कोड में एक ब्लॉक है जिसे आप एक पंक्ति टिप्पणी के साथ वर्णित कर सकते हैं इस ब्लॉक को एक निजी फ़ंक्शन में दोबारा दोहराएं और इसमें क्या उपयोग करें समारोह के लिए नाम के रूप में एकल पंक्ति। यह वास्तव में लंबा हो सकता है लेकिन अगर यह आपको त्वरित रूप से एल्गोरिदम पढ़ने में मदद करता है तो यह पूरी तरह से ठीक है। कोड पूर्ण 9 और 15 charackters के बीच एक अच्छी रेंज का उल्लेख है।

और चिंता न करें, तो यह एक निजी सहायक नाम बाद में पुनर्रचना समारोह है कोई समस्या नहीं है

2

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

आपके पास एक प्रक्रिया है जिसे ए, बी, सी, ..., एक्स, वाई और जेड करने की आवश्यकता है; आप प्रक्रिया को नाम नहीं दे सकते हैं ABCDEFGHIJKLMNOPQRSTUVWXYZ। आपको प्रक्रिया को विभाजित करने के लिए कुछ लॉजिकल मध्यम-स्तरीय समूह (शायद समूह की कई परतें) मिलनी होंगी।

कभी-कभी सही नाम ढूंढने के लिए कोड को चारों ओर ले जाने की आवश्यकता होती है ताकि यह अधिक तार्किक भाग में हो।

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

9

देर से, महान फिल कार्लटन ने प्रसिद्ध रूप से छेड़छाड़ की: कंप्यूटर विज्ञान में केवल दो कठोर समस्याएं हैं - चीजों का नामकरण और कैश अमान्यता। मेरा अनुभव मुझे विश्वास दिलाता है कि इसमें बहुत सच्चाई है।

चीजों का नामकरण एक कला है जितना विज्ञान है, और ऐसे में कोई कठोर और तेज़ नियम नहीं हैं।उस ने कहा, मैं कभी-कभी Ottinger's rules for Variable and Class Naming पढ़ता हूं, जिसमें कुछ अच्छी ह्युरिस्टिक्स ध्यान में रखती हैं। मेरे पसंदीदा में से एक संज्ञा वाक्यांशों का उपयोग करना है, जैसे - person.getName(), या bitTorrentClient.findPeersFromTracker()। इन दोनों मामलों में, कोड की रेखा का इरादा अंग्रेजी में एक वाक्यांश के समान पढ़ता है।

+0

+1 - ओटिंगर लिंक अच्छा है। –

+0

"नाम प्राप्त करें" और "ट्रैकर से सहकर्मी ढूंढें" क्रिया वाक्यांश हैं :) –

+0

http://agileinaflash.blogspot.com/2009/02/meaningful-names.html मेरे नामकरण नियमों का संक्षिप्त रूप है। लंबा कोड स्वच्छ संहिता का अध्याय 2 है। –

6

कभी-कभी आप नाम को फिर से लिखकर फ़ंक्शन की नाम की लंबाई को कम कर सकते हैं। बजाय:

void RetrievePropertiesFromRemoteStore() 

आप इस्तेमाल कर सकते हैं:

void RetrieveRemoteProperties() 

के बजाय:

bool CheckToSeeIfUserIsAuthorized() 

उपयोग:

bool IsUserAuthorized() 

एक और तरीका है इसे कम करने के क्या पर पुनर्विचार करने की है समारोह करता है एक समारोह में इस तरह के बजाय:

void GetUserProfileAndSetUpSession() 

आप हो सकता है:

void GetUserProfile() 
void SetupSession() 
+5

संग्रहीत प्रतिलिपि में [link] (http://www.maultech.com/chrislott/resources/cstyle/ottinger-naming.html) है, यदि यह कक्षा में कोई विधि है, तो उपयोगकर्ता। प्राधिकृत() या सेवा। प्राधिकृत (उपयोगकर्ता) भी बेहतर है। – plinth

1

हे। इसने मुझे प्रश्न शीर्षक पढ़ने पर मारा कि प्रोग्रामिंग के कार्य को "कार्यों के लिए अच्छे नामों के साथ आने वाली परेशानी" के रूप में वर्णित किया जा सकता है।

-3

आप अंकन और postfixes "_ *" का उपयोग अपने कोड में भी कई नामों से बचने के लिए कर सकते हैं:

void DoX() 
void DoX_Decode1()   <-- this name shows that this function is only used by DoX() 
void DoX_Decode2() 
void DoX_Decode3() 
void DoX_Find1() 
void DoX_Find2() 
void DoX_Find3() 

भी कर सकते हैं उपसर्गों के साथ समूह इसी तरह की सुविधा:

void tcpip_ShowConnectDialog() 
void tcpip_AcceptConnections() 
void logging_WriteToFile() 
void logging_UpdateLogWindow() 

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

+1

DoX_Decode2 का मतलब है कि मेरे लिए बिल्कुल कुछ भी नहीं है। और, हो सकता है कि आप नो-ओओ भाषा का उपयोग कर रहे हों, लेकिन DoX.find() और DoX.Decode() बेहतर आईएमओ है। मैं कहता हूं क्योंकि आप वर्ग को अलग करने के बारे में बात कर रहे थे .. तो मुझे लगता है कि यह ओओ है। आखिरकार, किसी को "निकालने की परेशानी" के कारण रिफैक्टरिंग से बचना नहीं चाहिए .. अच्छी आईडीई (खांसी * खांसी * ग्रहण खांसी *) के साथ, नाम बदलने और निकालने का तरीका वास्तव में एक सुखद काम है। :) – user35978

+0

हाँ, मैं वास्तव में इस तरह से पुराने ढंग से तैयार हूँ। हर छोटी चीज़ के लिए एक अलग वर्ग और फ़ाइल रखने से नफरत है। मेरे लिए यह कोड को कम करने के लिए व्यावहारिक रूप से असंभव है (रिफैक्टरिंग द्वारा) जब आप देखते हैं कि उच्च स्तरीय अवशोषण है, तो सभी अपने अस्तित्व के लिए "sence" और "लड़ाई" बनाते हैं (इतनी दूर तक चलने वाली अनुरूपताओं के लिए खेद है)। पदानुक्रमों या पेड़ों की तुलना में, मैं सूचियों में अधिक विश्वास करता हूं। उदाहरण के लिए, मैं 2-आयामी तालिकाओं के साथ कई एक्सेल दस्तावेज़ों का उपयोग करता हूं, जो एक xml-document पदानुक्रमित पेड़-संरचना के साथ (यदि यह आपको कोई समझ में आता है)। यही कारण है कि मैं ओओ कक्षा पदानुक्रम से नफरत करता हूं। – AareP

1

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

+0

हां! Http://stackoverflow.com/questions/961942/what-is-the-worst-programming-language-you-ever-worked- कई भाषाओं के उदाहरणों के साथ देखें जहां आपके पास लगभग वर्णमाला के केवल एक अक्षर थे। एक मूलभूत मैंने देखा कि एक बार केवल पूर्णांक के लिए ए और बी 1 जैसे नाम और स्ट्रिंग के लिए $ डी और $ R2 की अनुमति है। घृणित। –

0

किसी ऑब्जेक्ट उन्मुख दृष्टिकोण का उपयोग करके, यह इस समस्या को कम करने में मदद करता है .. कनेक्शन ToAccessLines -> connexion.connect (System.getAccessLines());

हैंडलवॉलविजनस्प्लिट -> यह एक, मुझे सच में यकीन नहीं है कि यह क्या करता है: डी लेकिन, मैं कुछ ऐसा कहूंगा: wall.handleVision (Wall.split); या जो भी हो, मुझे लगता है कि आप समझते हैं कि मेरा क्या मतलब है।

इसके अलावा, कभी-कभी, जब एक बहुत ही विशिष्ट कार्य का नाम देना मुश्किल होता है, तो ऐसा इसलिए हो सकता है क्योंकि कोड पर्याप्त उच्च स्तर नहीं है। उदाहरण के लिए: readSecondWordOfLine (a_line) -> line.split() [1]।

या, सॉर्ट करें (sortWithSecondWordOfLine()) बन सकता है, क्रमबद्ध करें (लाइन => विभाजित (रेखा) [1]) .. मुझे पता है कि यह हमेशा सभी भाषाओं में जितना साफ हो उतना आसान नहीं होता है, लेकिन आपको मेरा अंक मिलता है। सी ++ के साथ, उदाहरण के लिए, आप एक नई विधि बनाने के बजाय एक लाइनर अभिव्यक्ति बनाने के लिए बाइंड और एसटीएल कंपोजिट्स का उपयोग कर सकते हैं।

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

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