एक चर का नाम कैसे दिया जाए जब शब्द संज्ञा और क्रिया दोनों हो


48

मैं सामान्य मार्गदर्शन के साथ एक कोने-मामले की समस्या में चला गया है:

  • चर के लिए संज्ञा
  • कार्यों के लिए क्रिया

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

मेरा इरादा यह सुनिश्चित करना है कि जब मैं कोड के महीनों के बाद अनुभागों में वापस आऊँगा तो यह कार्यक्रम भविष्य के डेवलपर्स के साथ-साथ स्वयं के लिए भी पठनीय रहेगा।

उदाहरणों में से एक एक के साथ है battery। A batteryमें एक है chargeऔर आप charge()एक बैटरी भी रख सकते हैं ।

मुझे लगता है कि दोनों होने Battery.Chargeऔर Battery.Charge(value)भविष्य के डेवलपर्स के लिए भ्रामक होंगे।

मेरा वर्तमान समाधान बस उन या दोनों मामलों (चर और फ़ंक्शन) के लिए एक अलग शब्द चुनना है। उस दृष्टिकोण के साथ मेरी समस्या Batteryऑब्जेक्ट के वैरिएबल और फ़ंक्शन की है chargeजिसमें डिज़ाइन चर्चाओं के साथ संरेखित नहीं किया जाएगा Battery

मेरा प्रश्न यह है कि क्या नामकरण सम्मेलन में इस संघर्ष को संभालने का एक और / बेहतर तरीका है?


विषय पर कुछ अतिरिक्त पढ़ना। किसी ने भी वास्तव में मेरे प्रश्न के विशेष को संबोधित नहीं किया।


3
चार्जिंग फंक्शन एडचार्ज को आसान और स्पष्ट बनाएं
शाफ़्ट फ्रीक

2
क्या आप "वर्तमान-" के साथ संज्ञा चर का उपसर्ग कर सकते हैं? तो "करंटचार्ज" बनाम "चार्ज ()"?
ब्रायन स्नो

6
या सिर्फ चार्जेजवेल को वर्तमान प्रभार प्राप्त करने के लिए
शाफ़्ट फ्रीक

5
एक शब्द बनाओ। वर्डनेट को लगता enqueueहै कि यह एक शब्द नहीं है , लेकिन जावा में इसकी एक क्रिया है। कैसे के बारे में doCharge? यह अभी भी समरूपता परीक्षण में विफल रहेगा क्योंकि आपके अन्य तरीकों में यह उपसर्ग नहीं होगा
दु: खद परिवर्तनीय

5
"वर्तमान" = अब, या "वर्तमान" = प्रभार का प्रवाह। एकमात्र वास्तविक समाधान अंग्रेजी को अधिक समझदार भाषा के साथ बदलना है!
डैरनव

जवाबों:


38

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

मेरी व्यक्तिगत प्राथमिकता केवल क्रियाओं के लिए है जो राज्य को बदलते हैं। मैं गैर-उत्परिवर्तन कार्यों के लिए संज्ञाओं का उपयोग करता हूं। मुझे लगता है कि यह आपके दृष्टिकोण पर निर्भर करता है। मशीन स्तर पर, गैर-म्यूटिंग फ़ंक्शन कुछ करते हैं, लेकिन मॉडल स्तर पर, वे नहीं करते हैं।


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

1
मैं महंगी, गैर-म्यूटिंग कार्यों के लिए क्रियाएं पसंद करता हूं। उदाहरण के लिए, फ़ंक्शन जो किसी डेटाबेस पर एक क्वेरी चलाते हैं।
ब्रायन

20

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

battery.Charge(50) बनाम batteryCharger.Charge(battery, 50)

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


6
यह एक बुरा विचार नहीं है, लेकिन इस मामले Batteryमें बैटरी + चार्जिंग सिस्टम के लिए एक अमूर्त है। हमारे ऐप को अलग-अलग ऑब्जेक्ट में दो पहलुओं को तोड़ने की आवश्यकता नहीं है, इसलिए उन्हें Batteryसुविधा के लिए एक (उर्फ ) में रोल किया गया है । अंतत: एक चार्जेबल बैटरी की भौतिकी बताती है कि किसी चार्ज को स्वीकार करने के लिए उसके पास किसी प्रकार का कार्य होता है।

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

क्या आप शायद जावा प्रोग्रामर हैं? यह स्पष्ट रूप से खुद को न दोहराएं का उल्लंघन है। वास्तव में, आप पैरामीटर को दोहरा रहे हैं पैरामीटर "50" को छोड़कर। अगर मैं कोशिश करता हूं तो मैं DRY उल्लंघन का एक बदतर उदाहरण नहीं दे सकता।
बॉक्स

@ बॉक्सिंग क्या आप मेरे उदाहरण के बारे में ले रहे हैं? क्योंकि मुझे यकीन नहीं है कि जब आप कोई कार्यान्वयन नहीं करते हैं तो आप दावा कर सकते हैं कि मैं DRY का उल्लंघन कर रहा हूं। मैं एसओएलआईडी सिद्धांतों का बहुत बड़ा समर्थक हूं और यह नहीं देख रहा हूं कि आप उस निष्कर्ष पर कैसे पहुंचे।
मोर्टलापमैन

आप एक अनावश्यक BatteryCharger वर्ग बनाकर DRY का उल्लंघन कर रहे हैं जो किसी भी तरह बैटरी में एक राज्य परिवर्तन का कारण बनेगा। तो BatteryCharger कुछ इनपुट को स्वीकार करेगा कि यह तुरंत बैटरी पर जाएगा।
केविन क्लाइन

9

डबल मीनिंग से बचें

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

गेटर्स एंड सेटर्स का उपयोग करें

अधिकांश वस्तुओं के लिए मानक नामकरण संपत्तियों के लिए गेटर्स / सेटिंग्स के तरीके हैं।

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

प्रॉपर्टीज स्टेट्स नॉट नॉन

मुझे लगता है कि आपको संज्ञा के रूप में ऑब्जेक्ट गुणों को वर्गीकृत करके गलत किया गया है, और चर भी राज्यों के बारे में सोचा जा सकता है। वे अपने अस्तित्व के स्थानीय दायरे के लिए प्रासंगिक हैं।

आप उस मूल्य का वर्णन कर सकते हैं जो वे संज्ञा के रूप में रखते हैं, लेकिन मुझे यकीन नहीं है कि सभी मामलों में यह सच है।

OOP शब्दावली में वस्तु गुण उस वस्तु की स्थिति का वर्णन करते हैं। आपके मामले में Batteryएक वस्तु है, और यह Chargeएक राज्य है। तो यह वस्तु की एक संपत्ति होगी, लेकिन यह इस संदर्भ पर निर्भर करता है कि इसका उपयोग कैसे किया जाता है।

यदि आपको Chargeबैटरी को सक्षम करने की आवश्यकता है , और यह भी पता है कि यह वर्तमान क्या Chargeहै, तो आपको एक समस्या है।

प्रसंग को लागू करने के लिए स्कोप का उपयोग करना

संदर्भ वह है जो स्पष्ट करेगा कि आप किस शब्द के अर्थ को व्यक्त करने के लिए एक विधि या संपत्ति चाहते हैं। स्कोप ऑब्जेक्ट के बाहर से किसी संपत्ति / विधि की पहुंच स्थापित कर रहा है।

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

तरीके क्रिया हैं

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

शब्द Chargeएक क्रिया है, लेकिन यह एक संज्ञा भी है। जब किसी क्रिया की विधि का उपयोग किया जाता है तो यह स्पष्ट हो जाता है कि क्रिया का उपयोग किया जा रहा है Battery.Charge(....)

लेकिन, संदर्भ बहुत महत्वपूर्ण है। जबकि शब्द Charge()एक क्रिया है यह उतना सार्थक नहीं है जितना कि startCharging()

के लिए मान्य तरीकों Batteryशामिल हो सकते हैं Charging, Discharging, setCharge, getCharge, hasCharge, Dischargeऔर Charged

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

तो वास्तव में एक सही उत्तर नहीं है कि इस प्रकार के गुणों / विधियों का नाम कैसे दिया जाए। सिवाय इसके कि आपको उपरोक्त तकनीकों का बुद्धिमानी से उपयोग करने की आवश्यकता है ताकि यह सुनिश्चित हो सके कि कोई भ्रम नहीं है।


2
रिकॉर्ड के लिए, क्लाइंट वह है जो अस्पष्ट शब्दावली का उपयोग कर रहा है। मैंने वह गड़बड़ नहीं की। :-) मैंने सवाल उठाया है क्योंकि मुझे लगता है कि मैं ऐसी स्थिति में चलने वाला एकमात्र व्यक्ति नहीं हो सकता। आपके उत्तर में कुछ मान्य बिंदु हैं। इस विशेष मामले में, हम समय इस बात का विवरण का स्तर पर काम नहीं कर रहे StartCharge()और EndCharge()अर्थ होगा। वास्तव में, यह शब्दावली बैटरी सिस्टम को संभालने के लिए महत्वपूर्ण ओवरहेड जोड़ देगा। प्रत्येक अंतराल पर यह Charge()या तो हो सकता है Discharge()

1
प्राथमिक संघर्ष आंतरिक प्रोग्रामिंग शब्दार्थों को उस शब्दावली के साथ समकालिक रखने में है जो क्लाइंट उपयोग कर रहा है। Chargeइस डोमेन के लिए सबसे आसानी से समझा जाने वाला अस्पष्ट शब्द है। कई अन्य हैं।

6

उन्हें क्रियाओं के साथ प्रस्तुत करें जो उन्हें एक क्रिया या संज्ञा बना देगा।

Battery.doCharge()

Battery.getCharge()

4

क्रिया मामले के लिए, मुझे लगता Chargeहै कि ठीक है। संज्ञा मामले के लिए, getCurrentChargeLevelआपके लिए काम करेगा ?


उस पर यकीन नहीं है। चूंकि हम C # का उपयोग कर रहे हैं, हम अलग-अलग कार्यों की आवश्यकता के बजाय प्रॉपर्टी पर प्राप्त करने और सेट करने की घोषणा कर सकते हैं। उस के बावजूद, मैं रखरखाव के बारे में चिंतित हूं और मैंने जो लिखा है उसे भूल जाने के बाद यह कैसा लगेगा। getCurrentChargeLevel()अभी भी एक आंतरिक चर का उल्लेख करने की आवश्यकता नहीं होगी Battery, और उस चर का नाम क्या होगा?

एक वोल्टेज या एक प्रतिशत चार्ज है?
mhoran_psprep

1
@ GlenH7: आह, मैं देख रहा हूं। आपने C # निर्दिष्ट नहीं किया और मेरा दिमाग जावा मोड में है। या तो रास्ता, मुझे लगता है कि वर्तमान में बैटरी में चार्ज की मात्रा का प्रतिनिधित्व करने वाली संज्ञा के लिए, कुछ Battery.currentChargeLevelकाम कर सकते हैं। आप का उपयोग करने की कोशिश कर सकते हैं Battery.coloumbsया Battery.ampereHoursयह स्पष्ट नहीं हो सकता है ...
FrustratedWithFormsDesigner

1
@ मोहनन_स्पर्श - ना। ;-) Chargeवह Energyहै Power(वोल्ट * Amps == वत्स) समय से गुणा। तो इस मामले में, चार्ज एक संख्या है। शुल्क की एक स्थिति भी है जो एक प्रतिशत होती है।

@FrustratedWithFormsDesigner - हाँ, मैंने सी # को छोड़ दिया क्योंकि मुझे लगा कि भाषा की परवाह किए बिना व्यापक कोने का मामला लागू था। Watt*timeनिश्चित रूप से डिजाइन वार्तालापों के साथ संरेखित नहीं करेंगे, लेकिन ChargeLevelकरेंगे।

0

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

डेल्टा (उन मामलों में जहां परिवर्तन होता है लेकिन अस्पष्ट है) एक संशोधक है जो मैं राज्य में परिवर्तन को सौंपने के लिए हर समय उपयोग करता हूं और दूसरों को सलाह देता हूं (भले ही क्रिया अर्ध-स्पष्ट हो)।


0

बचाव के लिए हंगेरियन नोटेशन। आप कर सकते हैं intChargeऔर fcnCharge(value)इस प्रकार, भ्रम से बचने और एक पागल लंबे नाम जोड़ने जब तीन पत्र सिर्फ ठीक काम करेगा।

या आप बस एक ही नाम का उपयोग कर सकते हैं और आईडीई को इसे संभालने दें। एक लंबा या अलग नाम बनाना वैसे ही हो सकता है जैसे लंबे समय में भ्रमित करना।


उत्तर पर अद्वितीय परिप्रेक्ष्य के लिए +1। अफसोस, हंगेरियन अंकन स्पष्ट रूप से हमारे कोड शैली दिशानिर्देशों के अनुसार है। यह आपके उत्तर की संभावित योग्यता को नहीं बदलता है, बस मैं इसे अपने वास्तविक समाधान के रूप में उपयोग नहीं कर सकता हूं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.