बूलियन विधि नामकरण पठनीयता


120

एक पठनीयता के दृष्टिकोण से सरल प्रश्न, किस विधि का नाम आप बूलियन पद्धति के लिए पसंद करते हैं:

public boolean isUserExist(...)

या:

public boolean doesUserExist(...)

या:

public boolean userExists(...)

21
पहला ऐसा लगता हैisBabbyFormed

भाषा पर निर्भर करता है। विभिन्न भाषाओं में अलग-अलग सम्मेलन होते हैं; Java और Objective C दिमाग में आते हैं। साथ ही बॉर्डरलाइन सब्जेक्टिव।
जेड स्मिथ

विषय - पर्याप्त रूप से
युवल एडम

2
विशुद्ध रूप से व्यक्तिपरक। getUserExistence, userIsNotExtinct, userHasExistentialStateआदि ...
dreamlax

सार्त्र को गर्व होगा
कॉर्नेल मासोन

जवाबों:


112
public boolean userExists(...)

मेरी पसंद होगी। चूंकि यह आपकी सशर्त जाँच को प्राकृतिक अंग्रेजी की तरह कहीं अधिक बनाता है:

if userExists ...

लेकिन मुझे लगता है कि कोई कठिन और तेज़ नियम नहीं है - बस सुसंगत रहें


3
"अपने {विधि कॉल} को प्राकृतिक अंग्रेजी की तरह कहीं अधिक बनाता है" बोर्ड भर में तर्कसंगत नामकरण के लिए एक महान परीक्षण की तरह लगता है। इस मामले पर मेरी सोच को स्पष्ट किया - धन्यवाद!
cori

16
दूसरी ओर, अलगाव में या जब "अगर" का तुरंत पालन नहीं किया जाता है, तो "userExists ()" इस तथ्य के बयान की तरह लगता है, बल्कि उस प्रश्न के रूप में जिसका यह उद्देश्य था। "IsUserExisting ()" या "DoUserExist ()" के विपरीत, जो सीधे-सीधे प्रश्नों के लिए अंग्रेजी प्राकृतिक भाषा के शब्द आदेश नियमों का पालन करता है।
Oskar Berggren

4
.. लेकिन एक बूल को वापस करने के तरीकों का इस्तेमाल बाहर क्यों किया जाएगा if? यदि उनके साइड-इफेक्ट्स हैं जो कि एक गंध के और भी अधिक हैं। if IsUserExisting()और if DoesUserExist()भयावह लग रहा है और बचा जाना चाहिए।
RJFalconer

@RJFalconer कभी-कभी आपको कई स्थानों पर उस पद्धति के परिणाम का उपयोग करने की आवश्यकता हो सकती है, इसलिए आप इसे चर पर असाइन करेंगे। चूंकि विधि को कहा जाता है userExists, चर का क्या नाम आप घोषित करेंगे? userExistsचर के लिए अच्छा है, तरीकों से नहीं। जैसा @ ऑस्कर ने लिखा- यह कथन की तरह लगता है, सवाल नहीं।
जारोस्लाव व्लाज़्लो

उन स्थितियों के लिए जहाँ कोई विषय, विधेय, और एक वस्तु है, उदाहरण के लिए, UserSessionIsComplete या IsUserSessionComplete, जो आप पसंद करते हैं?
यांग

40

मैं कहूंगा userExists, क्योंकि मेरा कॉलिंग कोड 90% इस तरह दिखाई देगा:

if userExists(...) {
  ...
}

और यह अंग्रेजी में बहुत शाब्दिक रूप से पढ़ता है।

if isUserExistऔर if doesUserExistबेमानी लगते हैं।


18

पठनीयता का पीछा करते हुए स्पष्टता त्यागने से सावधान रहें

हालांकि , if (user.ExistsInDatabase(db))अच्छे से पढ़ता है if (user.CheckExistsInDatabase(db)), एक बिल्डर पैटर्न के साथ एक वर्ग के मामले पर विचार करें, (या कोई भी वर्ग जिसे आप राज्य स्थापित कर सकते हैं):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

यह स्पष्ट नहीं ExistsInDatabaseहै कि यह जाँच रहा है कि क्या यह मौजूद है, या इस तथ्य को स्थापित करता है कि यह मौजूद है। आप लिखेंगे if (user.Age())या if (user.Name())बिना किसी तुलना मूल्य के, ऐसा क्यों हैif (user.Exists()) विशुद्ध रूप एक अच्छा विचार क्योंकि वह संपत्ति / कार्य बूलियन प्रकार का है और आप प्राकृतिक अंग्रेजी की तरह अधिक पढ़ने के लिए फ़ंक्शन / संपत्ति का नाम बदल सकते हैं? क्या यह उसी पैटर्न का पालन करने के लिए बुरा है जो हम बूलियन के अलावा अन्य प्रकारों के लिए उपयोग करते हैं?

अन्य प्रकारों के साथ, एक ifकथन फ़ंक्शन के रिटर्न मान की तुलना कोड में मान से करता है, इसलिए कोड कुछ इस तरह दिखता है:

if (user.GetAge() >= 18) ...

जो यह पढ़ता है कि "अगर यूजर डॉट प्राप्त होता है तो उम्र 18 से अधिक या उसके बराबर है ..." सच है - यह "प्राकृतिक अंग्रेजी" नहीं है, लेकिन मैं यह तर्क दूंगा कि object.verb कभी भी प्राकृतिक अंग्रेजी जैसा नहीं होता है और यह केवल आधुनिक प्रोग्रामिंग का एक मूल पहलू है (के लिए) कई मुख्यधारा की भाषाएँ)। प्रोग्रामर को आम तौर पर उपरोक्त कथन को समझने में कोई समस्या नहीं होती है, इसलिए निम्नलिखित कोई भी बदतर है?

if (user.CheckExists() == true)

जिसे आम तौर पर छोटा कर दिया जाता है

if (user.CheckExists())

घातक कदम से पीछा किया

if (user.Exists())

जबकि यह कहा गया है कि "कोड लिखित की तुलना में 10 गुना अधिक बार पढ़ा जाता है", यह भी बहुत महत्वपूर्ण है कि बग को स्पॉट करना आसान है। मान लीजिए कि आपके पास एक फ़ंक्शन होता है, जिसका नाम एक्ज़िस्ट () होता है, जो ऑब्जेक्ट के अस्तित्व का कारण बनता है, और सफलता के आधार पर सही / गलत रिटर्न देता है। आप आसानी से कोड देख सकते हैंif (user.Exists()) और बग को नहीं - यदि कोड if (user.SetExists())उदाहरण के लिए पढ़ा जाता है , तो बग बहुत अधिक स्पष्ट होगा ।

इसके अतिरिक्त, user.Exists () आसानी से कुछ की जाँच करने के लिए एक डेटाबेस के लिए जटिल या अक्षम कोड, राउंड ट्रिपिंग शामिल कर सकते हैं। user.CheckExists () यह स्पष्ट करता है कि फ़ंक्शन कुछ करता है।

यहां सभी प्रतिक्रियाओं को भी देखें: नामकरण परंपराएं: एक विधि का नाम क्या है जो एक बूलियन लौटाता है?

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


2
> Suppose you had a function called Exists() which causes the object to existयह पहले से ही एक समस्या है। इस तरह की विधि एक क्रिया होनी चाहिए, जैसे Create। बहुत कम से कम यह होगा Exist, लेकिन एक क्रिया के रूप में "मौजूद" का उपयोग शायद ही कभी किया जाता है। It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.यह बहुत स्पष्ट है। मैं यह दावा करूंगा कि ज्यादातर डेवलपर्स आश्चर्यचकित होंगे अगर उन्होंने सिर्फ एक बूलियन वापस करने के अलावा कुछ भी किया।
RJFalconer

@RJFalconer Most developersआपके वाक्य की कुंजी है। मैं कहूंगा कि all developersअगर CheckExists()कुछ और मौजूद है तो जांच के अलावा कुछ भी आश्चर्य नहीं होगा । ऐसा नहीं है कि Exists()यह एक भयानक नाम है, बस CheckExists()यह एक बेहतर नाम है, और यह सवाल सामान्य सिद्धांत के रूप में पूछ रहा है, सबसे अच्छा नामकरण पैटर्न क्या है? इसका उत्तर किसी भी अन्य फ़ंक्शन की तरह व्यवहार करना है, एक क्रिया के साथ नाम शुरू करें, और एक अलग पैटर्न का उपयोग न करें क्योंकि यह एक बूलियन देता है।
माइकल पार्कर

हाँ, सवाल बूलियन तरीकों के लिए सबसे अच्छा नामकरण पैटर्न BUT के बारे में है। बूल तरीके अद्वितीय हैं और उनका अपना सामान्य नाम है - विधेय। आप उन्हें अन्य कार्यों की तरह व्यवहार नहीं करना चाहिए। बूलियन मेथड में नाम के साथ एक क्रिया डालना नाम बेमानी है। और इसका कोड पठनीयता पर नकारात्मक प्रभाव पड़ता है। सवालों के रूप में बूलियन तरीकों का नामकरण, बिना किसी क्रिया के उद्योग में सबसे अच्छा अभ्यास के रूप में स्वीकार किया जाता है। उदाहरण: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir

@Almir File.Exists एक बहुत पुरानी कॉल है (कम से कम डॉट नेट 1.1) और आधुनिक पठनीयता मानकों का एक अच्छा उदाहरण नहीं है। Microsoft के आधुनिक उदाहरणों के लिए आधुनिक डॉट नेट कोर API देखें कि कैसे सहमत हैं: github.com/dotnet/sdk , कुछ यादृच्छिक उदाहरण लिंक लिंक लिंक
माइकल पार्कर

15

पठनीयता के लिए लक्ष्य हमेशा कोड को प्राकृतिक भाषा के निकटतम संभव लिखना चाहिए। तो इस मामले में, userExistsसबसे अच्छा विकल्प लगता है। उपसर्ग का उपयोग करना "है" फिर भी अन्य स्थितियों में सही हो सकता है, उदाहरण के लिए isProcessingComplete


1
अपने दूसरे उदाहरण के लिए, ProcessingIsCompleteप्राकृतिक भाषाओं के करीब है? उदाहरण के लिए: if (ProcessingIsComplete ())
यांग

9

मैं userExists () के साथ जाऊंगा क्योंकि 1) यह प्राकृतिक भाषा में समझ में आता है, और 2) यह मेरे द्वारा देखे गए एपीआई के सम्मेलनों का अनुसरण करता है।

यह देखने के लिए कि क्या यह प्राकृतिक भाषा में समझ में आता है, इसे जोर से पढ़ें। "यदि उपयोगकर्ता मौजूद है तो" अगर उपयोगकर्ता मौजूद है तो "या" यदि उपयोगकर्ता मौजूद है "की तुलना में एक मान्य अंग्रेजी वाक्यांश की तरह लगता है"। "यदि उपयोगकर्ता मौजूद है" तो बेहतर होगा, लेकिन विधि नाम में शायद "द" बहुत ही शानदार है।

यह देखने के लिए कि क्या Java SE 6 में कोई फ़ाइल मौजूद है, आप File.exists () का उपयोग करेंगे । ऐसा लगता है कि यह संस्करण 7 में समान होगा । C # एक ही सम्मेलन का उपयोग करता है , जैसा कि पायथन और रूबी करते हैं । उम्मीद है, यह एक विविध पर्याप्त संग्रह है इसे भाषा-अज्ञेयवादी उत्तर कहते हैं। आम तौर पर, मैं आपकी भाषा के एपीआई को ध्यान में रखते हुए नामकरण विधियों के साथ होगा।


5

इस पर विचार करने की बातें हैं कि मुझे लगता है कि यहां कई अन्य उत्तरों से चूक गए थे

  1. यह निर्भर करता है कि क्या यह C ++ क्लास विधि या C फ़ंक्शन है। यदि यह एक विधि है तो इसे संभावना कहा जाएगा if (user.exists()) { ... }याif (user.isExisting()) { ... }
    नहीं if (user_exists(&user))। मानकों को कोड करने के पीछे यही कारण है कि राज्य बूल तरीके एक क्रिया के साथ शुरू होने चाहिए क्योंकि वे एक वाक्य की तरह पढ़ेंगे जब वस्तु उनके सामने होगी।

  2. दुर्भाग्य से सफलता और गैर-शून्य के लिए पुराने सी फ़ंक्शन के बहुत सारे वापस हो जाते हैं और विफलता के लिए गैर-शून्य इसलिए यह मुश्किल हो सकता है कि शैली का उपयोग किया जाए जब तक कि आप सभी बूल कार्यों का पालन क्रियाओं से शुरू न करें या हमेशा की तरह तुलना करें if (true == user_exists(&user))


5

इस प्रश्न के लिए मेरा सरल नियम यह है:

यदि बूलियन विधि पहले से ही एक क्रिया है, तो एक न जोड़ें। अन्यथा, इस पर विचार करें। कुछ उदाहरण:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2

विशुद्ध रूप से व्यक्तिपरक।

मैं पसंद करता हूं userExists(...)क्योंकि तब इस तरह के बयान बेहतर पढ़े जाते हैं:

if ( userExists( ... ) )

या

while ( userExists( ... ) )

1

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

मैं शायद तीन नंबर के लिए जाऊंगा क्योंकि यह कैसे बयानों में पढ़ने पर लगता है। "यदि उपयोगकर्ता मौजूद है तो" यदि उपयोगकर्ता मौजूद है तो "से बेहतर लगता है"।

यह मानकर चल रहा है कि यदि इसका उपयोग किया जा रहा है, तो निश्चित रूप से ...



0

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


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