"के रूप में" और "के रूप में" विधि नाम उपसर्गों के बीच अंतर क्या है? [बन्द है]


78

बीच क्या अंतर है "के लिए" और "के रूप में" विधि नाम की तरह उपसर्गों

  • सूची बनाने के लिए(),
  • asList (),
  • आदि...

विधि का डिजाइन करते समय किसका उपयोग करें?

जवाबों:


120

एक toXYZ()फ़ंक्शन से रूपांतरण करने की उम्मीद की जाती है, और एक नई स्वतंत्र वस्तु को वापस करने के लिए (हालांकि अपरिवर्तनशीलता अनुकूलन के लिए अनुमति देता है, java.lang.String.toString()बस वस्तु को लौटाता है)।
एक उदाहरण के रूप में, C ++ में हमारे पास std::bitset::to_ulong()आसानी से विफल हो सकता है, और एक पूरी बहुतायत to_string(), सभी एक (अधिक या कम) जटिल रूपांतरण और स्मृति आवंटित कर रहे हैं।

asXYZ()दूसरी ओर एक फ़ंक्शन से स्रोत के (संभावित रूप से अलग) दृश्य को कम से कम काम करने की उम्मीद है।
एक उदाहरण के रूप में, C ++ में हमारे पास std::as_const()केवल एक निरंतर संदर्भ है, और अधिक शामिल है std::forward_as_tupleजो संदर्भ द्वारा इसके तर्कों को भी संदर्भित करता है।


19
यह पता चला है कि इसके लिए कुछ मौजूदा मिसाल है। सामान्य तौर पर, जैसा कि [कुछ] एक कास्ट के समान होगा, जबकि [कुछ] एक मौजूदा से एक नई वस्तु (एक अलग प्रकार का) बनाता है। ToList के मामले में, यह O (n) होने जा रहा है और निश्चित रूप से "As" की तुलना में अधिक महंगा है। देखें stackoverflow.com/questions/17968469/...
रॉबर्ट हार्वे

5
यह वर्णनात्मक नामों के चयन का हिस्सा है, और भले ही यह विशिष्ट अंतर कोडिंग मानक में संहिताबद्ध नहीं है, इसका उल्लंघन करने पर यह कम से कम विस्मय के सिद्धांत को तोड़ देता है ।
डिडुप्लिकेटर

11
मैं इसे सहज रूप में वर्णित करूंगा, मैं "के रूप में" के रूप में "परिवर्तन" और "के रूप में" के रूप में "के रूप में इलाज" के बारे में सोचना होगा। पूर्व का तात्पर्य चीज को बदलने के लिए काम करता है, बाद का तात्पर्य यह है कि आप इसके साथ कैसे काम करते हैं यह सिर्फ एक अंतर है।
लैट्टी जूल

6
अगर इसका कुछ मतलब है, तो इसका मतलब यह होना चाहिए। मेरा सुझाव है कि इसका अक्सर कोई मतलब नहीं होता है, इसलिए मैं यादृच्छिक तृतीय पक्ष कोड (डॉक्स में कुछ देखे बिना) पर निर्भर नहीं होता। हालांकि कोड आधार में इसे अपनाना एक अच्छा सम्मेलन होगा।
बेन

4
यह उत्तर C ++ में भी सटीक है: उदाहरण के लिए std::to_string(x)एक नई स्ट्रिंग ऑब्जेक्ट std::as_const(x)बनाता है , लेकिन मौजूदा ऑब्जेक्ट का एक संदर्भ (एक दृश्य) बनाता है।
क्क्सप्लसोन जूल

13

ईमानदारी से, यह सिर्फ असंगतता का नामकरण हो सकता है। स्मालटाक में मानक पुस्तकालय वस्तुओं, उदाहरण के लिए पर नज़र, सभी तरीकों है कि "जटिल रूपांतरण" या "एक और प्रकार में सरल अभ्यावेदन लौटने" उपसर्ग के साथ रहे हैं, तो as, के रूप में asString, asFloat, asSeconds, और कुछ और करने के लिए कुछ भी परिवर्तित करने के लिए मानक पद्धति, as: aClass

रूबी में, तरीकों में से एक ही प्रकार लगी होती हैं to_के रूप में में, to_s, to_a, to_h, लघु के लिए string, arrayऔर hashक्रमशः।

न तो मानक पुस्तकालय विभिन्न प्रकार के रूपांतरणों के बीच अंतर करते हैं, शायद इसलिए इसे कार्यान्वयन विवरण के रूप में माना जाना चाहिए।

हालाँकि, Java में हमें बहुत सारे मिश्रण मिलते हैं। आप उल्लेख किया है, वहाँ toString, asList, और इतने पर। मेरा मानना ​​है कि ये सिर्फ एक नामकरण असंगतता है, क्योंकि यदि आप प्रत्येक उपसर्ग के लिए एक अलग अर्थ को परिभाषित करने की कोशिश करते हैं, तो आपको हमेशा मानक लाइब्रेरी में कहीं और एक काउंटर-उदाहरण मिलेगा।

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


1
मुझे विश्वास नहीं है: पूरी टीम के लिए एक शैली चुनना, बल्कि एक मॉड्यूल में समान मामलों के लिए एक शैली चुनना, लगातार।
डैनियल हैरी जूल

12
जावा में, toStringऑब्जेक्ट से पूरी तरह से डिस्कनेक्ट किया गया एक नया स्ट्रिंग बनाता है (और अपरिवर्तनीयता के कारण कोई अन्य तरीका नहीं है)। समान उदाहरण के लिए Collection#toArray, उदाहरण के लिए , Arrays#asListसरणी का एक दृश्य देता है, जो कि अप्रत्यक्ष रूप से जुड़ा हुआ है (सरणी को बदलने से सूची बदल जाती है और इसके विपरीत)। इसलिए यह काफी सुसंगत है, हालांकि इसके अपवाद भी हो सकते हैं। एक उपसर्ग चुनना गलत होगा। अगर वहाँ था Arrays#toList, तो मुझे उम्मीद है कि यह एक नई सूची के साथ एक नई अंतर्निहित सरणी बनाएगा।
मैराटिनस

मुझे लगता है कि स्मॉलटाक ने सिर्फ एक गलती की, वे सम्मेलन को समझ नहीं पाए। यह समझने के लिए एक कठिन सम्मेलन है (और यहां तक ​​कि नोटिस) क्योंकि यह बहुत सार है और यह विशेष रूप से प्रभावशाली नहीं है। यहां तक ​​कि इस सवाल को पूछने के लिए बहुत कुछ करने की आवश्यकता है।
usr

3
@usr स्मालटाक से पहले यह एक सम्मेलन बन डिजाइन किया गया है हो सकता है
Bergi

6

जबकि पहले से ही एक स्वीकृत उत्तर है, यह सी ++ पर ध्यान केंद्रित करता है, जबकि प्रश्न जावा के साथ टैग किया गया है । जावा में, इस तरह की चीज़ के लिए दिमाग में आने वाला पहला उदाहरण Arrays.asList है , जो अनिवार्य रूप से, एक सूची में लिपटे हुए, सरणी का एक दृश्य देता है। अंतर्निहित सरणी और सूची अभी भी जुड़े हुए हैं; सरणी में परिवर्तन सूची में परिलक्षित होते हैं, और इसके विपरीत। हालांकि, सरणी सूची के द्वारा दिया toArray विधि मूल सरणी से और सूची से स्वतंत्र है:

String[] wordArray = {"one", "fine", "day"};
List<String> wordList = Arrays.asList(wordArray);

// changes to the array are visible in the list
System.out.println(wordList); // prints "[one, fine, day]"
wordArray[1] = "horrible";
System.out.println(wordList); // prints "[one, horrible, day]"

// changes to the list are visible in the array
wordList.set(1, "beautiful");
System.out.println(wordArray[1]); // prints "beautiful"

// but changes to the list or array don't affect the 
// result from the list's toArray method.
String[] moreWords = wordList.toArray(new String[] {});
wordList.set(0, "the");
wordArray[1] = "best";
for (int i=0; i<3; i++) {
  System.out.println(moreWords[i]); // prints "one", "beautiful", and "day"
}

उस सभी ने कहा, इस बात की कोई गारंटी नहीं है कि प्रत्येक लाइब्रेरी डेवलपर इस सम्मेलन का अनुसरण करता है, इसलिए आपको अभी भी यह पता लगाने के लिए प्रलेखन की जांच करने की आवश्यकता है कि क्या यह वह व्यवहार है जो आपको अज्ञात कोड से मिलेगा।

दूसरी जगह जो मैंने देखी है ... () अक्सर उपयोग की जाने वाली विधियाँ निम्न प्रकार के उप-प्रकारों में होती हैं। उदाहरण के लिए, यदि आपके पास उपप्रकारों का एक गणना सेट है, तो आप कोड को समाप्त कर सकते हैं जैसे:

  /**
   * Every Node is either an ANode or a BNode.
   */
  interface Node {

    /**
     * Returns this Node as an ANode.
     * 
     * @return this node
     */
    default ANode asANode() {
      if (this instanceof ANode) {
        return (ANode) this;
      }
      else {
        throw new UnsupportedOperationException();
      }
      // Or, in Java8 style, perhaps:
      // return Optional.of(this)
      //     .filter(ANode.class::isInstance)
      //     .map(ANode.class::cast)
      //     .orElseThrow(UnsupportedOperationException::new);
    }

    /**
     * Returns this Node as a BNode.
     * 
     * @return this node
     */
    default BNode asBNode() {
      if (this instanceof BNode) {
        return (BNode) this;
      }
      else {
        throw new UnsupportedOperationException();
      }
    }
  }

1

जो अंतर मैंने देखा (अभी उसके बारे में सोचकर) वह है

  • आम तौर पर एक अलग संदर्भ प्रकार में परिवर्तित होता है (कुछ जटिल वस्तु)
  • जैसा कि आम तौर पर एक साधारण मूल्य प्रकार देता है

इसलिए हम AsInteger और AsString देखते हैं और हम ToArray और ToStringList देखते हैं।

एक रूपांतरण का अर्थ है, जो समझ में आता है (यह एक आंदोलन है, एक प्रक्रिया है)। जैसा कि एक प्रतिनिधित्व का तात्पर्य है, मूल वस्तु को व्यक्त करने का एक तरीका।

इस पर नज़र रखने का दूसरा तरीका:

  • एक ऑपरेशन है, इसलिए आप इसका इस्तेमाल तरीकों के लिए करेंगे।
  • जैसा कि एक सरल प्रतिनिधित्व है, इसलिए आप इसका उपयोग गुणों के लिए करेंगे।

और फिर इससे निपटने के लिए "पूर्व कला" (या विरासत) है। इससे पहले कि भाषाएं जमीन से पूरी तरह से OO होतीं, आपके पास StrToInt () और IntToStr () जैसे पुस्तकालय कार्य होंगे। उन्होंने रूपांतरण किए, वे ऑपरेशन थे इसलिए उन्हें समथिंगसमेलसेलेसे () कहने का कोई मतलब नहीं था। सब के बाद, के रूप में की तुलना में अधिक सक्रिय है। मैं यहां डेल्फी के बारे में विशेष रूप से सोच रहा हूं।

जब C # को OO जाने के लिए महत्वाकांक्षा के साथ डिजाइन किया गया था, तो यह समझ में आया कि अब पूर्णांक ऑब्जेक्ट पर एक विधि है जो पूर्णांक को एक स्ट्रिंग में बदल देगी। हालांकि हमारे पास एक Convert Class भी है, स्ट्रिंग में कनवर्ट करना इतना सामान्य है कि इसे ऑब्जेक्ट पर एक वर्चुअल विधि बनाया गया था। हो सकता है कि डिजाइनरों को लगा हो कि ToString पुराने प्रतिमान के लोगों से अधिक परिचित है और शायद इसी वजह से हमें एक आभासी विधि ToString () मिली है न कि एक आभासी संपत्ति AsString।


3
किस बारे में toString()?
Deduplicator

तुम मुझे वहां ले गए। मुझे लगता है कि AsString अधिक उपयुक्त रहा होगा। कुछ अतिरिक्त विचारों के साथ, मैं अपने उत्तर को अपडेट करूंगा।
मार्टिन माट

मुझे नहीं लगता कि यह उत्तर वास्तव में C # में सम्मेलनों को पूरा करता है। उदाहरण के लिए। ToList () और AsEnumerable () दोनों जटिल वस्तुओं को वापस करते हैं, अंतर है ToList () हमेशा एक नई वस्तु देता है जबकि AsEnumerable () मूल ऑब्जेक्ट पर एक दृश्य या एडाप्टर देता है।
जैक्सबी

@JaquesB जाहिरा तौर पर यहाँ और वहाँ विभिन्न विचारों को लागू किया गया है। डेल्फी में TField ऑब्जेक्ट्स पर AsInteger और AsString गुण हैं (जो डेटाबेस फ़ील्ड्स को एनकैप्सुलेट करता है)। मैं इसके द्वारा पक्षपाती हो सकता हूं। लेकिन फिर, प्रश्न को जावा के साथ टैग किया जाता है, सी # या डेल्फी के साथ नहीं।
मार्टिन मैत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.