"पाने" और "खोजने" उपसर्गों के साथ नामकरण विधियों के बीच कैसे और क्यों तय करें


48

मुझे हमेशा यह पता लगाने में परेशानी होती है कि क्या मुझे getSomethingबनाम से शुरू होने वाली एक निश्चित विधि का नाम देना चाहिए findSomething

समस्या खराब रूप से डिज़ाइन किए गए API के लिए सहायकों को बनाने में रहती है । यह आमतौर पर ऑब्जेक्ट से डेटा प्राप्त करते समय होता है, जिसके लिए पैरामीटर के रूप में ऑब्जेक्ट की आवश्यकता होती है। ये रहा एक सरल उदाहरण:

public String getRevision(Item item) {
    service.load(item, "revision");
    // there is usually more work to do before getting the data..
    try {
        return item.get_revision();
    }
    catch(NotLoadedException exception) {
        log.error("Property named 'property_name' was not loaded", exception);
    }
    return null;
}

इस पद्धति को नाम देने के बीच कैसे और क्यों तय करें getRevision()या findRevision()?


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

1
मैंने इस अवधारणा को पहले कभी नहीं सुना है। क्या आपके पास उदाहरणों के साथ कोई बेहतर लिंक है?
ज्ञातव्य १०'१३

1
वेब पर खोजें, इस पर काफी जानकारी है। उदाहरण के लिए, एंटी-करप्शन लेयर का एनाटॉमी, भाग 1 "यह संभावना है कि ... आप अनिवार्य रूप से पहले से मौजूद स्पेगेटी के साथ बातचीत करने के कार्य के साथ सामना कर रहे हैं। एंटी-करप्शन लेयर दर्ज करें ...
gnat

जवाबों:


83

Getजब मैं जानता हूं कि मैं उपयोग करता हूं तो पुनर्प्राप्ति का समय बहुत कम होगा (जैसे हैश टेबल या बीटीआरआई से देखने में)।

Findतात्पर्य खोज प्रक्रिया या कम्प्यूटेशनल एल्गोरिथ्म को निष्पादित करने के लिए "लंबी" अवधि की आवश्यकता होती है (अब कुछ मनमाने मूल्य के लिए)।


3
+1 का उपयोग मैं प्राप्त करते समय प्राप्त करता हूं और पाता हूं कि जब काम करने के लिए काम करना होता है।
जिम

5
यह ध्यान में रखते हुए कि कोड परिवर्तन (कुछ भाग अनुकूलित हो जाते हैं और एल्गोरिदम बदल जाते हैं) और एपीआई बदलना अक्सर असंभव होता है जो एक सही मापदंड की तरह नहीं दिखता है। यदि आप findबाद में हैश-टेबल एल्गोरिथ्म के साथ प्रतिस्थापित करते हैं तो आप क्या करेंगे ?
meze

2
मैं यह भी मानूंगा, जब कोई कॉल पढ़ रहा हो, तो "खोज" कहा जा सकता है जब खोज सफल नहीं होती है क्योंकि खोज मानदंड सफल नहीं होता है, जबकि "प्राप्त" से उम्मीद की जाती है कि जब तक कि कुछ असामान्य समस्या न हो।
gnasher729

क्या होगा यदि फ़ंक्शन कुछ शर्त के आधार पर परिणामों को फ़िल्टर करने के लिए एक वैकल्पिक पैरामीटर स्वीकार करता है? दोनों getऔर findउसके उपयोग के तरीके के आधार पर लागू होगा।
ईएसआर

61

मैं कहूंगा कि findविफल हो सकता है लेकिन getनहीं होना चाहिए।


25
अगर आपका मतलब है कि findNULL वापस कर सकते हैं जबकि NULL getकभी वापस नहीं आएंगे, लेकिन फेंक (या जोर) दे सकते हैं, तो मैं सहमत हूं।
सोजेरड

1
मैं इस पर @Sjoerd से पूरी तरह सहमत हूं।
मेहर

और क्या होगा अगर find()रिटर्न Optional<>? उस मामले findमें भी nullसुरक्षित है।
theCoder

42

मेरे बच्चों के साथ अक्सर होने वाली बातचीत को उद्धृत करने के लिए:

मैं: अरे बच्चा! जाओ मुझे कुछ बैटरी मिल जाए

बच्चा: लेकिन वे कहाँ हैं?

me: यही कारण है कि मैं तुम्हें उन्हें खोजने के लिए जाने के लिए कहा था। अगर मुझे पता होता कि वे कहां हैं, तो मैंने उनसे कहा होता कि आप उन्हें लेने जाएं। या आप अपनी माँ से पूछ सकते हैं।

एक ही विचार रखती है:

  • ऐसी विधि के लिए "प्राप्त करें" का उपयोग करें जो सस्ते में उपलब्ध जानकारी का टुकड़ा लौटाता है (और संभवतः इनलेट या अन्यथा अनुकूलित किया जा सकता है), या इस वस्तु के स्वामित्व वाली विशिष्ट जानकारी के टुकड़े के लिए।

  • एक विधि के लिए "खोज" का उपयोग करें जो जानकारी का एक टुकड़ा पाने के लिए काम करता है, या इसे खोजने के लिए अन्य वस्तुओं का उपयोग करता है।


16
केवल एक प्रोग्रामर ने अपने बच्चों के साथ यह बातचीत की होगी। "क्या आप कचरा बाहर निकालना चाहते हैं?" "नहीं।" "क्या आप कचरा बाहर निकालेंगे?" "हाँ।"
रॉबर्ट हार्वे

@RobertHarvey मुझे लगता है कि मुझे लोगों के साथ यह समस्या आ रही है। जब भी कोई व्यक्ति कुछ समझाने की कोशिश करता है, या एक प्रश्न पूछता है, तो मैं आमतौर पर सवाल वापस पूछता हूं और उन्हें इसके बारे में स्पष्ट होने के लिए कहता हूं। अन्यथा हम आमतौर पर एक XY समस्या के साथ समाप्त होते हैं। अगर मैं ऐसा नहीं करता हूं, तो मुझे चलने में स्वत: पूर्णता की तरह महसूस होता है। आप नहीं जानते कि आपके दिमाग में क्या है, आप इसे शब्दों में नहीं डाल सकते हैं, आप युगल शब्दों को बेबुनियाद करते हैं और मुझसे अपेक्षा करते हैं कि मैं आपके लिए "सोच" करूं और आपकी मदद करूं? नहीं, नहीं हो रहा :)
akinuri

3

तात्पर्य है परिणाम नहीं होना, जैसे कि कुछ मापदंडों के साथ डेटाबेस क्वेरी निष्पादित करते समय जो कॉल के बीच बदल सकते हैं। दूसरी ओर, इसका अर्थ है कि परिणाम पहले से ज्ञात विधि के लिए जाने जाते हैं या एक बार ज्ञात होने पर परिवर्तित नहीं होंगे, कि कॉल के लिए कोई पैरामीटर नहीं हैं।
इसलिए, मैं उदाहरण के लिए उपयोग करूँगा ग्राहक findCustomerById (लंबे customerId) और ग्राहक getCustomer ()


3

मैं निम्नलिखित पैटर्न लागू करता हूं:

  • Foo GetFoo() अशक्त नहीं लौट सकते और यह जटिलता हे (लॉग (n)) या उससे कम है
  • bool TryGetFoo(out Foo) अशक्त लौट सकते हैं और यह जटिलता हे (लॉग (n)) या उससे कम है
  • Foo FindFoo() अशक्त नहीं लौट सकते और यह जटिलता ओ (लॉग (एन) से अधिक है)
  • bool TryFindFoo(out Foo) अशक्त लौट सकते हैं और यह जटिलता O (लॉग (n)) से अधिक है

इस तरह से कोड इरादे पर स्पष्ट है और जटिलता पर आप उम्मीद कर सकते हैं।

आमतौर पर, गेटर्स डायरेक्ट लिस्ट या डिक्शनरी / सेट एक्सेस के लिए होते हैं।
खोजक गहरी खोज, सूची का पूरा स्कैन आदि हैं ...

आपके मामले में:

public bool TryGetRevision( Item item, out String revision ) 
{
    service.load( item, "revision" );
    // there is usually more work to do before getting the data..
    try 
    {
        revision = item.get_revision();
        return true;
    }
    catch( NotLoadedException exception )
    {
        log.error( "Property named 'property_name' was not loaded", exception );
        revision = "";
        return false;
    }
}

+1 try, छोटा और सटीक
स्पेसटुकर

2

getकिसी भी मामले में उचित है _ वास्तव में अक्सर यह माना जाता है कि कुछ पाने के लिए आपको पहले उस चीज़ को खोजने की आवश्यकता है। इसलिए यदि आप निश्चित नहीं हैं, तो उपयोग करें get

मैं या तो findजैसे तरीकों के लिए उपयोग करूँगा , जहाँ कुछ विशेष एल्गोरिथ्म है जो रिटर्न वैल्यू की गणना करता है, और कुछ डेटा प्राप्त करने के लिए डीबी, फ़ाइल सिस्टम, रिमोट सर्वर, आदि का अनुरोध नहीं करता है।findMinimum()findOptimal()


1
अच्छे अंक। व्यक्तिगत रूप से मैं शायद findआपके द्वारा दिए गए उदाहरणों में उपसर्ग के रूप में उपयोग नहीं करूंगा । कम्प्यूटेशनल कार्यों के लिए, जैसे आपके उदाहरण में, मैं उपयोग करता हूं calculateया compute
ज्ञातव्य

2

उपसर्गों को खोजने या प्राप्त करने के लिए उपयोग न करें। यह बर्ट्रेंड मेयर द्वारा गढ़ा गया यूनिफ़ॉर्मअफ्रीप्रिनल का उल्लंघन है । निम्नलिखित की तरह एक विधि क्यों नहीं बनाते हैं:

public String revision(Item item)

मैं पूरी तरह से यू के साथ सहमत हूँ, महान !!!!
इराकली गबिसनिया 11

1

मैं आम तौर पर Getकिसी वस्तु / मूल्य Findको प्राप्त करने के लिए , और इसके स्थान को पुनः प्राप्त करने के लिए उपयोग करूँगा (उदाहरण के लिए, उदाहरण के लिए)।

पूर्व के लिए:

object o = obj.GetItem( 'name');

integer i = somearray.Find( 'name');

0

मेरे लिए, findइसका तात्पर्य है कि संभवतः एक से अधिक परिणाम उपस्थित हो सकते हैं। getतात्पर्य केवल एक से है।


8
ऐसा लगता है कि ऐसा लगता है, लेकिन मुझे यकीन नहीं है कि मैं पूरी तरह से सहमत हूं। इसके बारे में इस तरह सोचें: getCatबनाम findCatबनाम getCatsबनाम findCatsfind..अभी भी प्रतिनिधित्व करता विलक्षण वस्तुओं लौटाए जाने। मेरी राय में, बहुवचन को संज्ञा में जोड़ा जाना चाहिए।
जानासलीला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.