एक अपरिवर्तनीय संग्रह पर गैर-म्यूटिंग "ऐड" विधि के लिए सबसे अच्छा नाम क्या है?


229

माफ़ करना शीर्षक के लिए खेद है - अगर मैं संक्षिप्त शीर्षक के साथ आ सकता हूं, तो मुझे सवाल पूछने की ज़रूरत नहीं है।

मान लीजिए कि मेरे पास एक अपरिवर्तनीय सूची प्रकार है। इसमें एक ऑपरेशन होता है Foo(x)जो अंत में एक अतिरिक्त तत्व के रूप में निर्दिष्ट तर्क के साथ एक नई अपरिवर्तनीय सूची देता है। तो "हैलो", "अपरिवर्तनीय", "दुनिया" के मानों के साथ तार की एक सूची बनाने के लिए आप लिख सकते हैं:

var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");

(यह C # कोड है, और मुझे C # सुझाव में सबसे अधिक दिलचस्पी है अगर आपको लगता है कि भाषा महत्वपूर्ण है। यह मूल रूप से भाषा का सवाल नहीं है, लेकिन भाषा के मुहावरे महत्वपूर्ण हो सकते हैं।)

महत्वपूर्ण बात यह है कि मौजूदा सूचियों में कोई बदलाव नहीं किया गया है Foo- इसलिए empty.Countअभी भी 0 वापस आएंगे।

अंतिम परिणाम प्राप्त करने का एक और (अधिक मुहावरेदार) तरीका होगा:

var list = new ImmutableList<string>().Foo("Hello")
                                      .Foo("immutable")
                                      .Foo("word");

मेरा सवाल है: फू के लिए सबसे अच्छा नाम क्या है?

EDIT 3 : जैसा कि मैंने बाद में खुलासा किया है, प्रकार का नाम वास्तव में नहीं हो सकता है ImmutableList<T>, जिससे स्थिति स्पष्ट हो जाती है। इसके बजाय कल्पना कीजिए कि यह है TestSuiteऔर यह अपरिवर्तनीय है क्योंकि यह जिस ढांचे का हिस्सा है, उसका पूरा हिस्सा अपरिवर्तनीय है ...

(संपादन 3 का अंत)

मेरे पास अब तक आए विकल्प:

  • Add.NET में सामान्य, लेकिन इसका अर्थ है मूल सूची का म्यूटेशन
  • Cons: मेरा मानना ​​है कि यह कार्यात्मक भाषाओं में सामान्य नाम है, लेकिन ऐसी भाषाओं में अनुभव के बिना उन लोगों के लिए अर्थहीन है
  • Plus: मेरा पसंदीदा अब तक, यह मेरे लिए उत्परिवर्तन नहीं करता है । जाहिरा तौर पर यह हास्केल में भी उपयोग किया जाता है लेकिन थोड़ी अलग अपेक्षाओं के साथ (एक हास्केल प्रोग्रामर इसे दूसरी सूची में एक मान जोड़ने के बजाय दो सूचियों को एक साथ जोड़ने की उम्मीद कर सकता है)।
  • With: कुछ अन्य अपरिवर्तनीय सम्मेलनों के साथ संगत है, लेकिन यह IMO के लिए समान "समानता" नहीं है।
  • And: बहुत वर्णनात्मक नहीं है।
  • ऑपरेटर अधिभार + के लिए: मुझे वास्तव में यह पसंद नहीं है; मुझे आमतौर पर लगता है कि ऑपरेटरों को केवल निचले स्तर के प्रकारों पर लागू किया जाना चाहिए। मैं हालांकि राजी होने को तैयार हूँ!

जो मापदंड मैं चुनने के लिए उपयोग कर रहा हूं वे हैं:

  • विधि कॉल के परिणाम का सही प्रभाव देता है (अर्थात यह एक अतिरिक्त तत्व के साथ मूल सूची है)
  • इसे यथासंभव स्पष्ट करता है कि यह मौजूदा सूची को म्यूट नहीं करता है
  • उचित लगता है जब ऊपर दूसरे उदाहरण के रूप में एक साथ जंजीर

कृपया अधिक जानकारी के लिए पूछें कि क्या मैं खुद को पर्याप्त स्पष्ट नहीं कर रहा हूं ...

संपादित करें 1: यहाँ मेरा तर्क पसंद Plusकरने के लिए है Add। कोड की इन दो पंक्तियों पर विचार करें:

list.Add(foo);
list.Plus(foo);

(और यह मेरी नजर में है एक व्यक्तिगत बात) उत्तरार्द्ध स्पष्ट रूप से गाड़ी है - यह लेखन की तरह है "x + 5," अपने आप ही एक बयान के रूप में। पहली पंक्ति ऐसी लगती है जैसे कि यह ठीक है, जब तक आपको याद न हो कि यह अपरिवर्तनीय है। वास्तव में, जिस तरह से अपने आप से अधिक ऑपरेटर अपने ऑपरेंड को म्यूट नहीं करता है, Plusवह मेरे पसंदीदा होने का एक और कारण है। ऑपरेटर ओवरलोडिंग की थोड़ी सी भी बीमारी के बिना, यह अभी भी एक ही अर्थ देता है, जिसमें शामिल हैं (मेरे लिए) ऑपरेंड (या इस मामले में विधि का लक्ष्य) को बदलना नहीं।

एडिट 2: ऐड पसंद न करने के कारण।

विभिन्न उत्तर प्रभावी रूप से हैं: "ऐड के साथ जाएं। यही DateTimeहै, और Stringऐसे Replaceतरीके आदि हैं जो अपरिवर्तनीयता को स्पष्ट नहीं करते हैं।" मैं सहमत हूँ - यहाँ पूर्वता है। हालांकि, मैं बहुत देखा है की लोगों को कॉल DateTime.Addया String.Replaceऔर उत्परिवर्तन की उम्मीद । न्यूज़ग्रुप प्रश्नों का भार होता है (और शायद एसओ अगर मैं चारों ओर खोदता हूं) तो उत्तर दिया जाता है कि "आप वापसी मूल्य की अनदेखी String.Replaceकर रहे हैं; तार अपरिवर्तनीय हैं, एक नया स्ट्रिंग वापस आ जाता है।"

अब, मुझे प्रश्न के लिए एक सूक्ष्मता प्रकट करनी चाहिए - प्रकार वास्तव में एक अपरिवर्तनीय सूची नहीं हो सकती है , लेकिन एक अलग अपरिवर्तनीय प्रकार है। विशेष रूप से, मैं एक बेंचमार्किंग ढांचे पर काम कर रहा हूं, जहां आप एक सूट में परीक्षण जोड़ते हैं, और यह एक नया सूट बनाता है। यह स्पष्ट हो सकता है कि:

var list = new ImmutableList<string>();
list.Add("foo");

कुछ भी पूरा करने के लिए नहीं जा रहा है, लेकिन जब आप इसे बदलते हैं, तो यह बहुत आसान हो जाता है:

var suite = new TestSuite<string, int>();
suite.Add(x => x.Length);

ऐसा लग रहा है कि यह ठीक होना चाहिए। जबकि यह, मेरे लिए, गलती को स्पष्ट करता है:

var suite = new TestSuite<string, int>();
suite.Plus(x => x.Length);

वह सिर्फ भीख माँग रहा है:

var suite = new TestSuite<string, int>().Plus(x => x.Length);

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

मैं केवल एक अपरिवर्तनीय सूची प्रकार के बारे में बात करके मूल प्रश्न को सरल बनाने के लिए माफी माँगता हूँ। सभी संग्रह स्व-वर्णनात्मक के रूप में काफी नहीं हैं ImmutableList<T>:)


2
@ एडम: नहीं, बाद स्पष्ट रूप से छोटी गाड़ी है। वे दोनों वास्तव में छोटी गाड़ी हैं (जैसा कि वे परिणाम के साथ कुछ भी नहीं कर रहे हैं) - लेकिन पहले मुझे छोटी गाड़ी नहीं लगती
जॉन स्कीट

36
क्या एक असत्य कुत्ता है?
माइकल मायर्स

7
कॉनसैट / कोंडोग ... मेरे लिए काम करता है! ;)
gnovice

11
अनसैट - कि एक ज़ोंबी बिल्ली होगी।
एरिक फोर्ब्स

2
@ ट्रैप: हालांकि एपीआई द्रव बनाने के संदर्भ में यह बेकार है।
जॉन स्कीट

जवाबों:


130

इस तरह की स्थितियों में, मैं आमतौर पर साथ जाता हूं Concat। यह आमतौर पर मेरा तात्पर्य है कि एक नई वस्तु बनाई जा रही है।

var p = listA.Concat(listB);
var k = listA.Concat(item);

3
यह वह है जो मैं उपयोग करता हूं, क्योंकि यह वही है जो System.Linq.Enumerable का उपयोग करता है - निर्णय पहले से ही किया गया है। :) मैं अकेला व्यक्ति नहीं हो सकता जिसने IEnumerable पर कॉनैट एक्सटेंशन के अपने स्वयं के अधिभार को परिभाषित किया हो जो कि एक एकल मान को स्वीकार किया जा सके।
डैनियल इयरविकर

9
+1 यह वह जगह है ढांचे के भीतर नामकरण निरंतरता को बनाए रखने के लिए सही जवाब।
सैम हरवेल

जब तक मैं इसे याद नहीं कर रहा हूं, System.Linq.Enumerable (और सामान्य रूप से Linq) केवल "अनुक्रम + अनुक्रम" के लिए कॉनैट () का उपयोग करता है, कभी भी "आइटम + अनुक्रम" नहीं। समस्या यह है कि कोई व्यक्ति "अन्य सूची में एक मूल्य को जोड़ने के बजाय दो सूचियों को एक साथ जोड़ने की अपेक्षा कर सकता है" स्पष्ट रूप से अन्य मूल विकल्पों में से एक का उपयोग नहीं करने के कारण के रूप में दिया गया था।
Ssswift

119

मैं विपक्ष के साथ जाना चाहता हूं, एक साधारण कारण के लिए: इसका मतलब है कि वास्तव में आप इसे क्या चाहते हैं।

  1. मैं वास्तव में मेरे कहने का बहुत बड़ा प्रशंसक हूं, खासकर सोर्स कोड में। एक नौसिखिया को विपक्ष की परिभाषा को केवल एक बार देखना होगा, लेकिन फिर उस एक हजार बार पढ़ें और उसका उपयोग करें। मुझे लगता है कि लंबे समय में, यह उन प्रणालियों के साथ काम करने के लिए अच्छा है जो सामान्य मामले को आसान बनाते हैं, भले ही ऊपर-सामने की लागत थोड़ी अधिक हो।

  2. तथ्य यह है कि यह बिना एफपी अनुभव वाले लोगों के लिए "अर्थहीन" होगा वास्तव में एक बड़ा लाभ है। जैसा कि आपने बताया, आपके द्वारा पहले से पाए गए अन्य सभी शब्दों का कुछ अर्थ है, और यह अर्थ या तो थोड़ा अलग है या अस्पष्ट है। एक नई अवधारणा में एक नया शब्द होना चाहिए (या इस मामले में, एक पुराना)। बल्कि मैं किसी को विपक्ष की परिभाषा को देखना होगा, गलत तरीके से मानने के लिए कि वह जानता है कि ऐड क्या करता है।

  3. कार्यात्मक भाषाओं से उधार लिए गए अन्य ऑपरेशन अक्सर अपने मूल नाम रखते हैं, जिसमें कोई स्पष्ट तबाही नहीं होती है। मैंने "मानचित्र" और "कम" करने के लिए समानार्थी शब्द के साथ आने के लिए कोई धक्का नहीं देखा है जो गैर-एफपीर्स के लिए अधिक परिचित हैं, और न ही मुझे ऐसा करने से कोई लाभ दिखाई देता है।

(पूर्ण प्रकटीकरण: मैं एक लिस्प प्रोग्रामर हूं, इसलिए मुझे पहले से ही पता है कि विपक्ष का क्या मतलब है।)


16
यह मत भूलो कि खोजशीलता महत्वपूर्ण है - यदि मैं "testSuite" टाइप करता हूं। और विधियों की सूची देखें, मैं एक ऐसी विधि देखना चाहूंगा जो सही बात का सुझाव दे। मैं शायद इस अपमान पर एक निरर्थक (मेरे लिए) नाम नहीं देखूंगा कि मुझे क्या चाहिए।
जॉन स्कीट

33
अगर मुझे झपकी आ रही थी, तो मैं एक विधि जोड़ूंगा जो केवल संदेश के साथ एक अपवाद को फेंक देता है = "एक ImmutableList के लिए प्रस्तुत करने के लिए विपक्ष का उपयोग करें"। :-)
केन

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

16
परंपरागत रूप से, अंत के बजाय शुरुआत में विपक्ष जोड़ता है। तो यह वर्णित विधि के लिए एक संभावित भ्रामक नाम है।
walkytalky

16
बस अगले गैर-कार्यात्मक प्रोग्रामर को एक क्लिक या 3 बचाने के लिए ... en.wikipedia.org/wiki/Cons शब्द "कंस्ट्रक्शन" से, एक्सप्रेशन "to cons x to y" का अर्थ है एक नई वस्तु के साथ निर्माण करना ( cons xy)
मिस्टर

59

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

var list = ImmutableList<string>.Empty.And("Hello")
                                      .And("Immutable")
                                      .And("Word");

मुझे खाली विचार पसंद है। अभी भी और हालांकि के बारे में आश्वस्त नहीं। यह सिर्फ एक छोटा सा दोष है।
जॉन स्कीट

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

52

जब भी मैं नामकरण के साथ जाम में होता हूं, तो मैं इंटरव्यू मारता हूं।

thHTML.com इसे "ऐड" के लिए लौटाता है:

परिभाषा: आसन्न, वृद्धि; आगे टिप्पणी करें

पर्यायवाची: affix, annex, ante, append, augment, beef up, boost, up, build up, चार्ज अप, जारी, cue in, फिगर इन, फ्लेश आउट, हीट अप, हाइक, हाइक, हाईक, ऑन, हिच, हुक अप के साथ, शामिल करें, जैक अप करें, जैज़ अप करें, एक साथ शामिल हों, पैड, पार्ले, पिगबैक, प्लग इन करें, इस पर डालें, उत्तर दें, रन अप करें, आगे कहें, स्नोबॉल, सूप अप, स्पीड अप, स्पाइक, स्टेप अप पूरक, मीठा, कील, टैग

मुझे Adjoinया अधिक की आवाज़ पसंद है Join। यही तो आप कर रहे हैं, है ना? यह विधि अन्य के शामिल होने के लिए भी लागू हो सकती है ImmutableList<>


1
मुझे 'जॉइन' करना भी पसंद है, लेकिन ज्यादातर मामलों में, जब आप 2 ऑब्जेक्ट्स से जुड़ते हैं, तो आप 1 से समाप्त होते हैं। इस मामले में, यदि आप 2 ऑब्जेक्ट्स में शामिल होते हैं, तो आप वास्तव में एक नई ऑब्जेक्ट बना रहे हैं।
प्रोग्रामर

1
मैं .NET, पर्ल, पीएचपी, या वीबीएसस्क्रिप्ट के किसी भी मामले के बारे में नहीं जानता, जहां जुड़ने का मतलब उत्परिवर्तन है। डिज़ाइन ऐसा है कि A और B C बनाने के लिए जुड़ते हैं, जहाँ C हमेशा एक नई इकाई है।
22

मुझे जॉइन करना पसंद है, और मैं पूरी तरह से थिसॉरस.कॉम से सहमत हूं :) एक नाम के बारे में संदेह होने पर हर समय इसका उपयोग करें।
Skurmedel

var सूट = नया टेस्टसुइट <string, int> () .Join (x => x.Length);
स्ली ग्रीफॉन

3
पिगीबैक के साथ जाओ, imo। या हुकअपविथ।
क्रिस मैराती-जॉर्ज

48

व्यक्तिगत रूप से, मुझे पसंद है। () के साथ। यदि मैं प्रलेखन या कोड टिप्पणियों को पढ़ने के बाद ऑब्जेक्ट का उपयोग कर रहा था, तो यह स्पष्ट होगा कि यह क्या करता है, और यह स्रोत कोड में ठीक पढ़ता है।

object.With("My new item as well");

या, आप इसके साथ "साथ" जोड़ें .. :)

object.AlongWith("this new item");

+1। "के साथ" SETL में एक infix ऑपरेटर है जो समान कार्य करता है। यदि SETL इसका उपयोग करता है तो यह सही होना चाहिए :-)
फिन

1
बाह ... अब वीबी का उपयोग कौन करता है? :) उह .. विरोध करता है .. क्या वह ज़ोर से था? हेह .. लेकिन, नहीं, पूरी गंभीरता से, यही कारण है कि मैंने "विथविथ" पर विचार किया, जो वीबी मुद्दे को हटा देगा। केवल एक लाख अलग-अलग तरीके हैं जो वह इस एक के साथ जा सकते हैं ... मेरा मतलब है, यहां तक ​​कि पागल भी हैं जैसे: object.Plus (), या Object.ExistingPlus () ... आदि ... यह एक बहुत अच्छा सवाल है। पोस्ट किया, हालांकि ... हेह ..
लैरीएफ

33

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

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

अन्य नाम: आपने उल्लेख किया है:

  • प्लस: मैं इस पर इच्छा / धुलाई कर रहा हूं। मेरे लिए यह ऐड-ऑन की तुलना में अब नॉन-म्यूटिंग ऑपरेशन होने के रूप में अलग नहीं है
  • के साथ: VB के साथ मुद्दों का कारण होगा (सजा का इरादा)
  • ऑपरेटर ओवरलोडिंग: खोज एक मुद्दा होगा

मैंने जिन विकल्पों पर विचार किया है:

  • कॉनैट: स्ट्रिंग के इम्यूटेबल हैं और इसका उपयोग करते हैं। दुर्भाग्य से यह केवल अंत तक जोड़ने के लिए वास्तव में अच्छा है
  • CopyAdd: कॉपी क्या? स्रोत, सूची?
  • AddToNewList: शायद सूची के लिए एक अच्छा है। लेकिन एक संग्रह, ढेर, कतार, आदि के बारे में क्या ...

दुर्भाग्य से वहाँ वास्तव में एक शब्द है कि प्रतीत नहीं होता है

  1. निश्चित रूप से एक अपरिवर्तनीय ऑपरेशन
  2. उपयोगकर्ताओं के बहुमत के लिए समझ में आता है
  3. 4 से कम शब्दों में प्रतिनिधित्व करता है

यह तब और भी अजीब हो जाता है जब आप सूची के अलावा अन्य संग्रह पर विचार करते हैं। उदाहरण के लिए स्टैक लें। यहां तक ​​कि प्रथम वर्ष के प्रोग्रामर आपको बता सकते हैं कि स्टैक में पुश / पॉप जोड़ी पद्धति है। यदि आप एक ImmutableStack बनाते हैं और इसे पूरी तरह से अलग नाम देते हैं, तो इसे Foo / Fop कहते हैं, आपने अपने संग्रह का उपयोग करने के लिए उनके लिए अभी और काम जोड़ा है।

संपादित करें: प्लस एडिट का जवाब

मैं देखता हूं कि आप प्लस के साथ कहां जा रहे हैं। मुझे लगता है कि एक मजबूत मामला वास्तव में हटाने के लिए माइनस होगा। अगर मैंने निम्नलिखित देखा तो मुझे निश्चित रूप से आश्चर्य होगा कि दुनिया में प्रोग्रामर क्या सोच रहा था

list.Minus(obj);

मुझे प्लस / माइनस या एक नई जोड़ी के साथ सबसे बड़ी समस्या यह है कि यह ओवरकिल की तरह लगता है। संग्रह में पहले से ही एक विशिष्ट नाम है, अपरिवर्तनीय उपसर्ग। शब्दावली को जोड़कर आगे क्यों बढ़ें जिसका इरादा पहले से किए गए अपरिवर्तनीय उपसर्ग के समान अंतर जोड़ना है।

मैं कॉल साइट तर्क देख सकता हूं। यह एकल अभिव्यक्ति के दृष्टिकोण से इसे स्पष्ट करता है। लेकिन पूरे समारोह के संदर्भ में यह अनावश्यक लगता है।

संपादित करें २

सहमत हूँ कि लोग निश्चित रूप से String.Concat और DateTime.Add द्वारा भ्रमित किए गए हैं। मैंने कई बहुत उज्ज्वल प्रोग्रामर को इस समस्या को देखा है।

हालाँकि मुझे लगता है कि ImmutableList एक अलग तर्क है। स्ट्रिंग या डेटटाइम के बारे में कुछ भी नहीं है जो इसे प्रोग्रामर के लिए अपरिवर्तनीय के रूप में स्थापित करता है। आपको बस पता होना चाहिए कि यह किसी अन्य स्रोत के माध्यम से अपरिवर्तनीय है। इसलिए भ्रम अप्रत्याशित नहीं है।

ImmutableList में वह समस्या नहीं है क्योंकि नाम परिभाषित करता है कि यह व्यवहार है। आप तर्क दे सकते हैं कि लोगों को यह पता नहीं है कि अपरिवर्तनीय क्या है और मुझे लगता है कि यह भी मान्य है। मैं निश्चित रूप से कॉलेज में वर्ष 2 के बारे में नहीं जानता था। लेकिन आपके पास एक ही मुद्दा है कि आप Add के बजाय जो भी नाम चुनेंगे।

संपादित करें 3: टेस्टसुइट जैसे प्रकारों के बारे में क्या जो अपरिवर्तनीय हैं लेकिन इसमें शब्द नहीं हैं?

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

मुझे लगता है कि यह अपरिवर्तनीय के रूप में पहचान योग्य बनाने पर ध्यान केंद्रित करने के बजाय अधिक मूल्यवान प्रयास होगा। इस तरह से आप समस्या को हल कर सकते हैं बिना हर परिवर्तन विधि को फिर से निकाले।

अब आप टेस्टसुइट को अपरिवर्तनीय के रूप में कैसे पहचान सकते हैं? आज के परिवेश में मुझे लगता है कि कुछ तरीके हैं

  1. अपरिवर्तनीय के साथ उपसर्ग: ImmutableTestSuite
  2. एक गुण जोड़ें जो इम्युटैबलिटी के स्तर का वर्णन करता है। यह निश्चित रूप से कम खोज योग्य है
  3. ज्यादा नहीं।

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


प्रश्न में प्लस ओवर के लिए मेरी प्राथमिकता के कारणों को जोड़ा है। उस तर्क पर टिप्पणियों का स्वागत करेंगे। मैं वास्तव में इस विचार के लिए खुला हूं कि मैं मूर्खतापूर्ण हूं।
जॉन स्कीट

@JaredPar: यदि प्रकार को टेस्टसुइट कहा जाता है, तो क्या होगा?
जॉन स्कीट

संपादित 3 के लिए एक और +1 देना पसंद करेंगे, लेकिन जाहिर तौर पर नहीं कर सकते। (मेरे मामले में मैं समानता प्राप्त करने की कोशिश नहीं कर रहा हूं - मेरा मानना ​​है कि अपरिवर्तनीयता कोड की ओर ले जाती है जो कि इसके लिए आसान है।) मैं अभी भी काफी आश्वस्त नहीं हूं कि ऐड को जाने का रास्ता है, लेकिन यहां उत्तर में समर्थन के लिए प्रेरक है।
जॉन स्कीट

यदि आप काम पर बातचीत में इस सवाल को छोड़ने के लिए हो सकता है, वह भी भयानक होगा, btw। मैंने सी # सूची पर चर्चा शुरू की, इसलिए कुछ सहकर्मी पहले से ही शामिल हो सकते हैं। Google पर आंतरिक रूप से भी पूछ सकते हैं ...
जॉन स्कीट

@, मुझे लगता है कि मुझे काम पर इस सवाल को छोड़ने के लिए एक अच्छी जगह पता है :)
JaredPar

27

मुझे लगता है कि यह उन दुर्लभ स्थितियों में से एक हो सकता है जहां +ऑपरेटर को अधिभार देना स्वीकार्य है । गणित की शब्दावली में, हम जानते हैं कि +कुछ और के अंत में कुछ जोड़ नहीं है। यह हमेशा दो मूल्यों को एक साथ जोड़ता है और एक नया परिणामी मूल्य लौटाता है।

उदाहरण के लिए, यह सहज रूप से स्पष्ट है कि जब आप कहते हैं

x = 2 + 2;

एक्स का परिणामी मूल्य 4 है, न कि 22।

इसी तरह,

var empty = new ImmutableList<string>();
var list1 = empty + "Hello";
var list2 = list1 + "immutable";
var list3 = list2 + "word";

यह स्पष्ट करना चाहिए कि प्रत्येक चर क्या धारण करने वाला है। यह स्पष्ट होना चाहिए कि अंतिम पंक्ति में list2नहीं बदला गया है, बल्कि इसके बजाय list3"शब्द" को जोड़ने का परिणाम सौंपा गया है list2

अन्यथा, मैं केवल फ़ंक्शन प्लस () का नाम दूंगा।


यदि आपके पास एक सामान्य सूची है, तो आप वैध रूप से पूर्णांक (कह) या पूर्णांक की दूसरी सूची जोड़ सकते हैं? तब + का यह उपयोग संघनन के साथ संघर्ष करेगा।
फिन

@finnw: मैं आपकी बात नहीं देखता। एक सूची के साथ मैं हमेशा उम्मीद करूंगा कि एपेंड का मतलब है, चाहे आप एक तत्व जोड़ रहे हों या कई।
बिल

4
पुन: प्रयोज्य एपीआई के लिए, यह भी एक अच्छा विचार है कि एक नामित विधि भी हो, यदि कोई व्यक्ति बिना परिचालक लोडिंग के आपकी भाषा का उपयोग कर रहा है।
नील

"क्या आप एक तत्व या कई जोड़ रहे हैं" - क्या होगा यदि आप सूची को एक तत्व के रूप में जोड़ना चाहते हैं? यानी, [1] + 2 = [1,2]लेकिन [1] + [2] = [1,[2]]। आप जो सुझाव दे रहे हैं वह असंगत व्यवहार है। शायद यही कारण है कि पायथन आपको इस फैशन में एक तत्व जोड़ने की अनुमति नहीं देता है ।
एमपीएन

ठीक है, सी # जैसी एक वैधानिक रूप से टाइप की गई भाषा में आप बता सकते हैं कि सूची तत्वों का प्रकार क्या है, क्या सूची की सूची या तत्वों की सूची है, इसलिए आप यह तय करने के लिए प्रकार का उपयोग कर सकते हैं कि सूची में शामिल किया गया तत्व है या संक्षिप्त दो सूची।
डोबेस वांडरमेर

22

जितना संभव हो उतना स्पष्ट होने के लिए, आप वर्डियर CopyAndAdd, या कुछ समान के साथ जाना चाह सकते हैं ।


हालांकि सभी अपरिवर्तनीय संग्रहों को जोड़ने के लिए प्रतिलिपि की आवश्यकता नहीं होती है। अपरिवर्तनीय पेड़ों के बारे में सोचें, उन्हें बस एक नया नोड चाहिए और मौजूदा पेड़ को पत्ती के रूप में उपयोग कर सकते हैं।
जारेदपार

BTW, मैंने आपकी प्रोफ़ाइल पढ़ी, फिर क्रम में उम्र और संक्षेप में आप कितने साल के थे, यह देखकर चकित रह गए। कुछ ही समय में सनत ने लात मार दी।
जारेदपार

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

दूसरी टिप्पणी: मैं कबूल करता हूं, मैंने इसे बैज के लिए किया है! मैं अपनी उम्र देना पसंद नहीं करता। (मैं वास्तव में आप से छोटी हूँ, लेकिन मैं सनकी पुराने टाइमर बहुत अच्छी तरह से करता है, तो मैं करने की जरूरत है खेल सकते हैं और मैं केवल एक ही जिनकी उम्र 89. रूप में सूचीबद्ध है नहीं कर रहा हूँ।)
माइकल मायर्स

अपरिवर्तनीय पेड़ों का तर्क एक मजबूत, अच्छा बिंदु है। तो तब EquivalentReferenceWithAdded (x) उस तर्क से लड़ता है, लेकिन बेवकूफ लगता है, और कटौती करना मुश्किल है।
TheBlastOne

21

यदि आप वास्तव में क्रिया की तरह महसूस करते हैं, तो मैं इसे एक्सटेंड () या शायद एक्सटेंडिथ () कहूंगा

विस्तार का मतलब है बिना कुछ बदले उसे कुछ और जोड़ना। मुझे लगता है कि यह C # में बहुत प्रासंगिक शब्दावली है क्योंकि यह विस्तार विधियों की अवधारणा के समान है - वे कक्षा को "स्पर्श" किए बिना एक वर्ग में एक नई विधि "जोड़ते हैं"।

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


1
अभी भी थोड़े से तात्पर्य आधार वस्तु से कुछ करने से है।
अराजकता

18

जोड़ा गया (), जोड़ा गया ()

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

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


1
अजगर भी इस सम्मेलन का उपयोग करता है। जैसे अंतर्निहित कार्य उलट () और क्रमबद्ध ()।
जो

18

मैं की mmyers सुझाव पसंद CopyAndAdd । "म्यूटेशन" थीम को ध्यान में रखते हुए, हो सकता है कि आप बड (अलैंगिक प्रजनन), ग्रो , रेप्लिकेट या इवॉल्व के साथ जा सकें ? =)

EDIT: मेरे आनुवंशिक विषय को जारी रखने के लिए, Procreate के बारे में कैसे , यह कहते हुए कि एक नई वस्तु बनाई गई है जो पिछले एक पर आधारित है, लेकिन कुछ नए जोड़े के साथ।


14

यह शायद एक खिंचाव है, लेकिन रूबी में भेद के लिए आमतौर पर इस्तेमाल किया जाने वाला अंकन है: addम्यूट नहीं; add!mutates। यदि यह आपकी परियोजना में एक व्यापक समस्या है, तो आप ऐसा कर सकते हैं (जरूरी नहीं कि गैर-वर्णनात्मक वर्णों के साथ, लेकिन उत्परिवर्तन / गैर-उत्परिवर्तन विधियों को इंगित करने के लिए लगातार एक अधिसूचना का उपयोग करके)।


+1। यह भाषा द्वारा लागू नहीं किया जाता है, लेकिन एक सम्मेलन के रूप में सहमत है। मुझे वह पसंद है।
oma


13

हो सकता है कि भ्रम इस तथ्य से उपजा हो कि आप एक में दो ऑपरेशन चाहते हैं। उन्हें अलग क्यों नहीं किया? DSL शैली:

var list = new ImmutableList<string>("Hello");
var list2 = list.Copy().With("World!");

Copyएक मध्यवर्ती वस्तु लौटाएगा, यह मूल सूची की एक परस्पर प्रतिलिपि है। Withएक नई अपरिवर्तनीय सूची लौटाएगा।

अपडेट करें:

लेकिन, इंटरमीडिएट होने के बाद, परस्पर संग्रह एक अच्छा तरीका नहीं है। मध्यवर्ती वस्तु को Copyऑपरेशन में शामिल किया जाना चाहिए :

var list1 = new ImmutableList<string>("Hello");
var list2 = list1.Copy(list => list.Add("World!"));

अब, Copyऑपरेशन एक प्रतिनिधि लेता है, जो एक परिवर्तनशील सूची प्राप्त करता है, ताकि यह प्रतिलिपि परिणाम को नियंत्रित कर सके। यह किसी तत्व को जोड़ने की तुलना में बहुत अधिक कर सकता है, जैसे तत्वों को हटाना या सूची को क्रमबद्ध करना। ImmutableListबिचौलिये अपरिवर्तनीय सूचियों के बिना प्रारंभिक सूची को इकट्ठा करने के लिए इसका उपयोग कंस्ट्रक्टर में भी किया जा सकता है ।

public ImmutableList<T> Copy(Action<IList<T>> mutate) {
  if (mutate == null) return this;
  var list = new List<T>(this);
  mutate(list);
  return new ImmutableList<T>(list);
}

अब उपयोगकर्ताओं द्वारा गलत व्याख्या की कोई संभावना नहीं है, वे स्वाभाविक रूप से सफलता के गर्त में गिर जाएंगे ।

फिर भी एक और अद्यतन:

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

var list1 = new ImmutableList<string>("Hello");
// rules is a specification object, that takes commands to run in the copied collection
var list2 = list1.Copy(rules => rules.Append("World!"));

अब आप नियमों के नामों के साथ रचनात्मक हो सकते हैं और आप केवल उस कार्यक्षमता को उजागर कर सकते हैं जिसका आप Copyसमर्थन करना चाहते हैं , न कि संपूर्ण क्षमताओं का IList

चाइनिंग उपयोग के लिए, आप एक उचित कंस्ट्रक्टर बना सकते हैं (जो चाइनिंग का उपयोग नहीं करेंगे, निश्चित रूप से):

public ImmutableList(params T[] elements) ...

...

var list = new ImmutableList<string>("Hello", "immutable", "World");

या किसी अन्य निर्माता में एक ही प्रतिनिधि का उपयोग करें:

var list = new ImmutableList<string>(rules => 
  rules
    .Append("Hello")
    .Append("immutable")
    .Append("World")
);

यह मानता है कि rules.Appendविधि वापस आती है this

यह आपके नवीनतम उदाहरण के साथ कैसा दिखेगा:

var suite = new TestSuite<string, int>(x => x.Length);
var otherSuite = suite.Copy(rules => 
  rules
    .Append(x => Int32.Parse(x))
    .Append(x => x.GetHashCode())
);

@ जोर्डाओ: क्योंकि इस प्रकार की रचना बहुत अधिक सरल रूप से जन्मजात रूप लेती है। जब मैं केवल एक चाहता हूं तो दो अलग-अलग चर क्यों होते हैं? इसी तरह मैं एक उत्परिवर्ती प्रतिलिपि नहीं बनाना चाहता हूं - मैं चाहता हूं कि सब कुछ अपरिवर्तनीय हो, क्योंकि इससे कोड होता है जो आईएमओ के बारे में तर्क करना आसान होता है।
जॉन स्कीट

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

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

केवल नाम है कि आप के लिए काम करेगा यौगिक नाम, CopyAndAppend, CopyAndAdd, आदि जैसे होने लगते हैं
Jordão

1
मैं वास्तव में अपरिवर्तनीय संग्रह के लिए एक एपीआई के रूप में इस दृष्टिकोण (सभी संपादन के साथ) का चारा बढ़ा रहा हूं। हालाँकि, मैं यह तर्क दूंगा कि डिफ़ॉल्ट विनिर्देशों के लिए सहायक तरीकों के साथ इस तरह के संयोजन , जैसे कि कॉनकट, दोनों दुनिया के सर्वश्रेष्ठ प्रदान करता है।
गांजा

11

कुछ यादृच्छिक विचार:

  • ImmutableAdd ()
  • संलग्न ()
  • ImmutableList <T> (ImmutableList <T> originalList, T newItem) कंस्ट्रक्टर

1
इम्युटेबलएड के लिए +1; एपेंड पर उत्सुक नहीं (बहुत ज्यादा StringBuilder.Append जो म्यूटिंग है) और रचनाकार संस्करण को जंजीर के रूप में दर्द है।
जॉन स्कीट

10

C # में DateTime ऐड का उपयोग करता है। तो एक ही नाम का उपयोग क्यों नहीं? जब तक आपकी कक्षा के उपयोगकर्ता समझते हैं कि कक्षा अपरिवर्तनीय है।


मेरा तर्क है कि DateTime.Add लोगों को भ्रमित करने के लिए जाना जाता है ... लेकिन मैं मानता हूं कि यह पूर्वता दिखाता है।
जॉन स्कीट

1
जैसे स्ट्रिंग को म्यूट करने के तरीके नए डेवलपर्स को भ्रमित कर रहे हैं। लेकिन जल्द ही हर कोई सीखता है कि "स्ट्रिंग्स अपरिवर्तनीय हैं"
टुंडे

9

मुझे लगता है कि आप जिस महत्वपूर्ण चीज़ को प्राप्त करने की कोशिश कर रहे हैं, वह व्यक्त करने के लिए कठिन है, इसलिए शायद इसमें एक जेनेरिक शब्द के साथ कुछ, कॉपीविथ (या इंस्टेंसप्लस) (जैसे)।


9

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

एकमात्र तरीका है कि आप अपने उपयोगकर्ताओं को किसी वस्तु को गलत तरीके से बदलने से रोकने के लिए जा रहे हैं, यह स्पष्ट करने से है, या तो ऑब्जेक्ट के नाम के माध्यम से या विधि के नाम से (जैसे कि "GetCopyWith" जैसे क्रिया विकल्पों के साथ) "CopyAndAdd")।

तो बस अपने पसंदीदा के साथ जाओ, "प्लस।"


9

सबसे पहले, एक दिलचस्प शुरुआती बिंदु: http://en.wikipedia.org/wiki/Naming_conventions_(programming) ... विशेष रूप से, नीचे "लिंक भी देखें" लिंक देखें।

मैं या तो प्लस या के पक्ष में हूं, प्रभावी रूप से समान रूप से।

प्लस और एंड दोनों गणित-आधारित व्युत्पत्ति में हैं। जैसे, दोनों गणितीय संचालन को बढ़ावा देते हैं; दोनों एक अभिव्यक्ति का उत्पादन करते हैं जो स्वाभाविक रूप से अभिव्यक्ति के रूप में पढ़ता है जो एक मूल्य में हल हो सकता है, जो कि रिटर्न वैल्यू वाले विधि के साथ फिट बैठता है। Andअतिरिक्त तर्क धारणा को सहन करता है, लेकिन दोनों शब्द सूचियों पर सहजता से लागू होते हैं। Addकिसी ऑब्जेक्ट पर की गई क्रिया को संप्रेषित करता है, जो विधि के अपरिवर्तनीय शब्दार्थ के साथ टकराव करता है।

दोनों छोटे हैं, जो विशेष रूप से ऑपरेशन की प्रधानता को देखते हुए महत्वपूर्ण हैं। सरल, अक्सर-किए जाने वाले ऑपरेशन छोटे नामों के लायक होते हैं।

अपरिवर्तनीय शब्दार्थ व्यक्त करना कुछ ऐसा है जिसे मैं संदर्भ के माध्यम से करना पसंद करता हूं। यही है, मैं केवल इसका मतलब है कि कोड के इस पूरे ब्लॉक में एक कार्यात्मक अनुभव है; मान लेना सब कुछ अपरिवर्तनीय है। हालाँकि, यह मेरे लिए हो सकता है। मैं नियम होने के लिए अपरिवर्तनीयता पसंद करता हूं; अगर यह हो गया, तो यह उसी स्थान पर बहुत कुछ कर चुका है; परिवर्तनशीलता अपवाद है।


8

चैन () या अटैच () के बारे में कैसे?


1
लगाव निश्चित रूप से परिवर्तनशील होने जैसा लगता है। हो सकता है विथअटैच्ड समझदार हो, लेकिन WithAdded के बहुत करीब है, जिसकी चर्चा ऊपर की गई है।
TheBlastOne

यह मजेदार है कि इसके साथ क्या करने की कोशिश की जा रही है, इसका वर्णन करने में कितनी बार "चेनिंग" का उल्लेख किया गया है। (5 बार), लेकिन सुझाव के रूप में पेश नहीं किया गया! visualthesaurus.comजब मैंने खोज की तो यह पहली बात है (संबद्धता नहीं) concatenate
कोड 3 नं .3

7

मैं प्लस (और माइनस) को पसंद करता हूं। वे आसानी से समझ में आते हैं और अच्छी तरह से ज्ञात अपरिवर्तनीय प्रकारों (संख्याओं) को शामिल करते हुए सीधे संचालन के लिए मैप करते हैं। 2 + 2 2 के मूल्य को नहीं बदलता है, यह एक नया, समान रूप से अपरिवर्तनीय, मान लौटाता है।

कुछ अन्य संभावनाएं:

जोड़ ()

घूस()

साथ उगना ()


6

जो लोग निवास करते हैं उनके लिए मेट , मेटविथ या सहवास के बारे में कैसे । प्रजनन के संदर्भ में स्तनधारियों को आमतौर पर अपरिवर्तनीय माना जाता है।

वहाँ भी यूनियन फेंकने जा रहे हैं। SQL से उधार लिया गया।


2
संघ के लिए +1। हालाँकि, मैं इसे सीधे सेट थ्योरी से उधार लेता हूँ। :-)
क्रिस्टोफर लेटे

क्या SQL को थ्योरी से सेट थ्योरी से ज़्यादा कुछ नहीं मिलता है?
जेसन डी

1
इसके अलावा, संघ का अर्थ है भेद .. यदि आप डुप्लिकेट (कम से कम TSQL में) को शामिल करना चाहते हैं, तो आपको यूनियन ऑल का स्पष्ट रूप से उपयोग करना होगा।
hemp

6

जाहिर तौर पर मैं इस सवाल का जवाब देने वाला पहला ओबज-सी / कोको व्यक्ति हूं।

NNString *empty = [[NSString alloc] init];
NSString *list1 = [empty stringByAppendingString:@"Hello"];
NSString *list2 = [list1 stringByAppendingString:@"immutable"];
NSString *list3 = [list2 stringByAppendingString:@"word"];

इसके साथ कोई भी कोड गोल्फ खेल जीतने के लिए नहीं जा रहा है।


+1 [object]By[Verb]ing[Object]:विधि के लिए उपसर्ग का अर्थ है कि एक नया स्ट्रिंग बस के विपरीत लौटा दिया जाएगा [verb][Object]:, जो ऑब्जेक्ट को जगह में बदल देगा।
डेव डेलॉन्ग

3
+1। मैं लोगों की वाचालता (उर्फ सेल्फ-डॉक्यूमेंटेशन) को समझ नहीं पा रहा हूं।
23

5

मुझे लगता है कि "जोड़ें" या "प्लस" ठीक लगता है। सूची की अपरिवर्तनीयता बताने के लिए सूची का नाम ही पर्याप्त होना चाहिए।


यह कोई सूची नहीं है, यह एक परीक्षण सूट है।
टैंटनर

5

हो सकता है कि कुछ ऐसे शब्द हैं जो मुझे एक प्रति बनाने की अधिक याद हैं और उदाहरण को बदलने के बजाय इसमें सामग्री जोड़ते हैं (जैसे "कॉन्टेनाटेन")। लेकिन मुझे लगता है कि अन्य कार्यों के लिए उन शब्दों के लिए कुछ समरूपता होना भी अच्छा होगा। मुझे "निकालें" के लिए एक समान शब्द का पता नहीं है कि मैं उसी तरह का सोचता हूं जैसे "कॉनसैटनेट"। "प्लस" मुझे बहुत कम अजीब लगता है। मैं यह उम्मीद नहीं कर सकता कि इसे गैर-संख्यात्मक संदर्भ में उपयोग किया जा रहा है। लेकिन यह भी मेरे गैर अंग्रेजी पृष्ठभूमि से आ सकता है।

शायद मैं इस योजना का उपयोग करूंगा

AddToCopy
RemoveFromCopy
InsertIntoCopy

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

शायद मैं सादे "ऐड" और दोस्तों का भी उपयोग करूंगा। मुझे यह पसंद है कि गणित में इसका उपयोग कैसे किया जाता है

Add 1 to 2 and you get 3

खैर, निश्चित रूप से, एक 2 एक 2 रहता है और आपको एक नया नंबर मिलता है। यह दो संख्याओं के बारे में है और किसी सूची और तत्व के बारे में नहीं है, लेकिन मुझे लगता है कि इसकी कुछ सादृश्यता है। मेरी राय में, addजरूरी नहीं कि आप किसी चीज को म्यूट करें। मैं निश्चित रूप से आपकी बात को देखता हूं कि एक अकेला बयान होने से एक addऔर नई वस्तु का उपयोग नहीं करने पर छोटी बात नहीं लगती है। लेकिन मैंने अब कुछ समय सोचा कि "ऐड" की तुलना में किसी अन्य नाम का उपयोग करने के विचार के बारे में, लेकिन मैं सिर्फ एक और नाम के साथ नहीं आ सकता हूं, बिना मुझे लगता है कि "हम्म, मुझे यह जानने के लिए दस्तावेज को देखने की आवश्यकता होगी कि क्या यह "के बारे में है क्योंकि इसका नाम इस बात से भिन्न है कि मैं" ऐड "कहलाने की अपेक्षा क्या करूंगा। बस कुछ अजीब से litb से इस बारे में सोचा, यकीन है कि यह बिल्कुल समझ में नहीं आता :)


लेकिन अपरिवर्तनीय संग्रह में एक प्रति हमेशा आवश्यक नहीं होती है। उदाहरण के लिए एक बाइनरी ट्री लें। एक नई जड़ को जोड़ने के लिए कोई कॉपी करने की आवश्यकता नहीं है, बस एक नया मान है जहाँ एक
लेप्स

KISS - कार्यान्वयन विवरण सभी विधि के नाम ज्यादा देर तक बन जाएगा शामिल करने के लिए शुरू कर दिया नामकरण हैं। "जोड़ना" काफी सरल है और काम करता है।
एम.पी.

1
@ एमपी: फिर से आप वाक्यांश "कार्यान्वयन विवरण" का उपयोग एक तरह से करते हैं, जो मुझे लगता है कि अनुपयुक्त है। चाहे वह एक लिंक्ड सूची हो या हुड के नीचे एक सरणी एक कार्यान्वयन विवरण है। मैं एपीआई को बदले बिना कार्यान्वयन को बदल सकता था। अपरिवर्तनीय पहलू कार्यान्वयन विवरण नहीं है।
जॉन स्कीट

1
सही। JaredPar, लेकिन मुझे लगता है कि यह भी महत्वपूर्ण नहीं है कि क्या यह वास्तव में पेड़ की नकल करता है या केवल मौजूदा पेड़ का उपयोग करता है और नए पेड़ के लिए पत्ते के रूप में उपयोग करता है। मेरा मतलब, कि सिर्फ एक कार्यान्वयन विस्तार। यह java के स्ट्रिंग क्लास के लिए प्रतिस्थापन क्रिया के लिए समान है (मुझे विश्वास है)।
जोहान्स स्काउब -


5

मुझे लगता है कि लगता है Plus()और Minus()या वैकल्पिक रूप से Including(), Excluding()पर उचित हैं जिसका अर्थ है अपरिवर्तनीय व्यवहार।

हालांकि, कोई भी नामकरण विकल्प कभी भी पूरी तरह से सभी के लिए स्पष्ट नहीं होगा, इसलिए मुझे व्यक्तिगत रूप से विश्वास है कि एक अच्छा xml डॉक्टर टिप्पणी यहां बहुत लंबा रास्ता तय करेगी। जब आप IDE में कोड लिखते हैं, तो VS आपके चेहरे पर इन राइट्स को फेंक देता है - उन्हें अनदेखा करना मुश्किल होता है।


4

Append- क्योंकि, ध्यान दें कि System.Stringविधियों के नाम से पता चलता है कि वे उदाहरण को उत्परिवर्तित करते हैं, लेकिन वे नहीं करते हैं।

या मुझे काफी पसंद है AfterAppending:

void test()
{
  Bar bar = new Bar();
  List list = bar.AfterAppending("foo");
}

दिनांक समय तर्क पहले की तरह, मैं पूर्वता से सहमत अगर यह तथ्य यह है कि इतने सारे प्रोग्रामर के लिए नहीं थे होता है स्ट्रिंग तरीकों चीज़ें करने की उम्मीद है। उन्हें (कभी-कभी बार-बार) कहा जाता है कि तार अपरिवर्तनीय हैं। मैं अपने क्लाइंट डेवलपर्स को सफलता के गर्त में लुभाना चाहूंगा :)
जॉन स्कीट

मुझे एपेंड ज्यादा पसंद है। यह भेद करता है कि आप संग्रह को उत्परिवर्तित नहीं कर रहे हैं, बल्कि उससे जुड़ रहे हैं।

4

list.CopyWith(element)

जैसा कि स्मालटाक :)

और यह भी list.copyWithout(element)कि एक तत्व की सभी घटनाओं को हटाता है, जो कि सबसे उपयोगी है जब इसका उपयोग list.copyWithout(null)अनसेट तत्वों को हटाने के लिए किया जाता है।


3

मैं ऐड के लिए जाऊंगा, क्योंकि मैं एक बेहतर नाम का लाभ देख सकता हूं, लेकिन समस्या हर दूसरे अपरिवर्तनीय ऑपरेशन के लिए अलग-अलग नामों को खोजने की होगी जो कि वर्ग को अपरिचित बना सकती है अगर यह समझ में आता है।


हां, मैं आपकी बात देख रहा हूं। मुझे लगता है कि मैं अभी भी प्लस को पसंद करता हूं, लेकिन यह विचार करने लायक बात है।
जॉन स्कीट

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