बीच क्या अंतर है "के लिए" और "के रूप में" विधि नाम की तरह उपसर्गों
- सूची बनाने के लिए(),
- asList (),
- आदि...
विधि का डिजाइन करते समय किसका उपयोग करें?
बीच क्या अंतर है "के लिए" और "के रूप में" विधि नाम की तरह उपसर्गों
विधि का डिजाइन करते समय किसका उपयोग करें?
जवाबों:
एक toXYZ()
फ़ंक्शन से रूपांतरण करने की उम्मीद की जाती है, और एक नई स्वतंत्र वस्तु को वापस करने के लिए (हालांकि अपरिवर्तनशीलता अनुकूलन के लिए अनुमति देता है, java.lang.String.toString()
बस वस्तु को लौटाता है)।
एक उदाहरण के रूप में, C ++ में हमारे पास std::bitset::to_ulong()
आसानी से विफल हो सकता है, और एक पूरी बहुतायत to_string()
, सभी एक (अधिक या कम) जटिल रूपांतरण और स्मृति आवंटित कर रहे हैं।
asXYZ()
दूसरी ओर एक फ़ंक्शन से स्रोत के (संभावित रूप से अलग) दृश्य को कम से कम काम करने की उम्मीद है।
एक उदाहरण के रूप में, C ++ में हमारे पास std::as_const()
केवल एक निरंतर संदर्भ है, और अधिक शामिल है std::forward_as_tuple
जो संदर्भ द्वारा इसके तर्कों को भी संदर्भित करता है।
std::to_string(x)
एक नई स्ट्रिंग ऑब्जेक्ट std::as_const(x)
बनाता है , लेकिन मौजूदा ऑब्जेक्ट का एक संदर्भ (एक दृश्य) बनाता है।
ईमानदारी से, यह सिर्फ असंगतता का नामकरण हो सकता है। स्मालटाक में मानक पुस्तकालय वस्तुओं, उदाहरण के लिए पर नज़र, सभी तरीकों है कि "जटिल रूपांतरण" या "एक और प्रकार में सरल अभ्यावेदन लौटने" उपसर्ग के साथ रहे हैं, तो as
, के रूप में asString
, asFloat
, asSeconds
, और कुछ और करने के लिए कुछ भी परिवर्तित करने के लिए मानक पद्धति, as: aClass
।
रूबी में, तरीकों में से एक ही प्रकार लगी होती हैं to_
के रूप में में, to_s
, to_a
, to_h
, लघु के लिए string
, array
और hash
क्रमशः।
न तो मानक पुस्तकालय विभिन्न प्रकार के रूपांतरणों के बीच अंतर करते हैं, शायद इसलिए इसे कार्यान्वयन विवरण के रूप में माना जाना चाहिए।
हालाँकि, Java में हमें बहुत सारे मिश्रण मिलते हैं। आप उल्लेख किया है, वहाँ toString
, asList
, और इतने पर। मेरा मानना है कि ये सिर्फ एक नामकरण असंगतता है, क्योंकि यदि आप प्रत्येक उपसर्ग के लिए एक अलग अर्थ को परिभाषित करने की कोशिश करते हैं, तो आपको हमेशा मानक लाइब्रेरी में कहीं और एक काउंटर-उदाहरण मिलेगा।
किसी भी मामले में, मैं कहूंगा कि महत्वपूर्ण बात यह है कि आप और आपकी टीम के लिए एक उपसर्ग चुनना है और पूरे कोड में लगातार इसका उपयोग करना है। संगति कुंजी है, इसलिए लोगों को आश्चर्यचकित होने के लिए नहीं छोड़ा जाता है, जैसे आपको था।
toString
ऑब्जेक्ट से पूरी तरह से डिस्कनेक्ट किया गया एक नया स्ट्रिंग बनाता है (और अपरिवर्तनीयता के कारण कोई अन्य तरीका नहीं है)। समान उदाहरण के लिए Collection#toArray
, उदाहरण के लिए , Arrays#asList
सरणी का एक दृश्य देता है, जो कि अप्रत्यक्ष रूप से जुड़ा हुआ है (सरणी को बदलने से सूची बदल जाती है और इसके विपरीत)। इसलिए यह काफी सुसंगत है, हालांकि इसके अपवाद भी हो सकते हैं। एक उपसर्ग चुनना गलत होगा। अगर वहाँ था Arrays#toList
, तो मुझे उम्मीद है कि यह एक नई सूची के साथ एक नई अंतर्निहित सरणी बनाएगा।
जबकि पहले से ही एक स्वीकृत उत्तर है, यह सी ++ पर ध्यान केंद्रित करता है, जबकि प्रश्न जावा के साथ टैग किया गया है । जावा में, इस तरह की चीज़ के लिए दिमाग में आने वाला पहला उदाहरण 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();
}
}
}
जो अंतर मैंने देखा (अभी उसके बारे में सोचकर) वह है
इसलिए हम AsInteger और AsString देखते हैं और हम ToArray और ToStringList देखते हैं।
एक रूपांतरण का अर्थ है, जो समझ में आता है (यह एक आंदोलन है, एक प्रक्रिया है)। जैसा कि एक प्रतिनिधित्व का तात्पर्य है, मूल वस्तु को व्यक्त करने का एक तरीका।
इस पर नज़र रखने का दूसरा तरीका:
और फिर इससे निपटने के लिए "पूर्व कला" (या विरासत) है। इससे पहले कि भाषाएं जमीन से पूरी तरह से OO होतीं, आपके पास StrToInt () और IntToStr () जैसे पुस्तकालय कार्य होंगे। उन्होंने रूपांतरण किए, वे ऑपरेशन थे इसलिए उन्हें समथिंगसमेलसेलेसे () कहने का कोई मतलब नहीं था। सब के बाद, के रूप में की तुलना में अधिक सक्रिय है। मैं यहां डेल्फी के बारे में विशेष रूप से सोच रहा हूं।
जब C # को OO जाने के लिए महत्वाकांक्षा के साथ डिजाइन किया गया था, तो यह समझ में आया कि अब पूर्णांक ऑब्जेक्ट पर एक विधि है जो पूर्णांक को एक स्ट्रिंग में बदल देगी। हालांकि हमारे पास एक Convert Class भी है, स्ट्रिंग में कनवर्ट करना इतना सामान्य है कि इसे ऑब्जेक्ट पर एक वर्चुअल विधि बनाया गया था। हो सकता है कि डिजाइनरों को लगा हो कि ToString पुराने प्रतिमान के लोगों से अधिक परिचित है और शायद इसी वजह से हमें एक आभासी विधि ToString () मिली है न कि एक आभासी संपत्ति AsString।
toString()
?