ชื่อที่ดีที่สุดสำหรับวิธี“ เพิ่ม” ที่ไม่กลายพันธุ์ในคอลเลกชันที่ไม่เปลี่ยนรูปแบบคืออะไร


229

ขออภัยสำหรับชื่อวาฟเฟิล - ถ้าฉันสามารถสร้างชื่อที่กระชับได้ฉันไม่ต้องถามคำถาม

สมมติว่าฉันมีประเภทรายการที่ไม่เปลี่ยนรูป มันมีการดำเนินงานFoo(x)ที่ส่งกลับรายการที่ไม่เปลี่ยนรูปใหม่ที่มีข้อโต้แย้งที่ระบุว่าเป็นองค์ประกอบพิเศษในตอนท้าย ดังนั้นเพื่อสร้างรายการของสตริงที่มีค่า "Hello", "immutable", "world" คุณสามารถเขียน:

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");

คำถามของฉันคืออะไรชื่อที่ดีที่สุดสำหรับ Foo คืออะไร?

แก้ไข 3 : เมื่อฉันเปิดเผยในภายหลังชื่อของประเภทอาจไม่เป็นจริงImmutableList<T>ซึ่งทำให้ตำแหน่งชัดเจน ลองนึกภาพว่ามันเป็นแบบนั้นTestSuiteและมันไม่เปลี่ยนรูปเพราะทั้งเฟรมมันเป็นส่วนหนึ่งของมันไม่เปลี่ยนรูป ...

(สิ้นสุดการแก้ไข 3)

ตัวเลือกฉันมาด้วยจนถึงตอนนี้:

  • Add: ทั่วไปใน. NET แต่หมายถึงการกลายพันธุ์ของรายการเดิม
  • Cons: ฉันเชื่อว่านี่เป็นชื่อปกติในภาษาที่ใช้งานได้ แต่ไม่มีความหมายสำหรับผู้ที่ไม่มีประสบการณ์ในภาษาดังกล่าว
  • Plus: ที่ชื่นชอบเพื่อให้ห่างไกลก็ไม่ได้หมายความถึงการกลายพันธุ์ให้ฉัน เห็นได้ชัดว่าสิ่งนี้ยังใช้ใน Haskellแต่ด้วยความคาดหวังที่แตกต่างกันเล็กน้อย (โปรแกรมเมอร์ Haskell อาจคาดหวังว่าจะเพิ่มสองรายการด้วยกันแทนที่จะเพิ่มค่าเดียวในรายการอื่น)
  • 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
@ อดัม: ไม่อย่างหลังมีรถบั๊กกี้อย่างชัดเจน ทั้งคู่ต่างก็บั๊กกี้จริง ๆ (เพราะพวกเขาไม่ได้ทำอะไรกับผลลัพธ์) - แต่ตัวแรกไม่ได้ดูบั๊กกี้เลย
Jon Skeet

36
เป็นสุนัขที่ไม่เจียระไนหรือไม่?
Michael Myers

7
Concat / Condog ... ได้ผลสำหรับฉัน! ;)
gnovice

11
Uncat - นั่นคือแมวผีดิบ
Erik Forbes

2
@Trap: นั่นมันดูดในแง่ของการทำให้ API ของไหล
Jon Skeet

คำตอบ:


130

Concatในสถานการณ์เช่นนั้นผมมักจะไปด้วย ซึ่งมักจะบอกเป็นนัยว่าฉันมีการสร้างวัตถุใหม่

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

3
นี่คือสิ่งที่ฉันใช้เพราะมันคือสิ่งที่ System.Linq.Enumerable use - การตัดสินใจได้ทำไปแล้ว :) ฉันไม่สามารถเป็นคนเดียวที่กำหนดส่วนขยาย Concat ของตัวเองบน IEnumerable เพื่อยอมรับค่าเดียวที่จะผนวกเข้าด้วยกัน
Daniel Earwicker

9
1 นี้เป็นคำตอบที่ถูกต้องสำหรับการรักษาความมั่นคงภายในการตั้งชื่อกรอบ
Sam Harwell

ยกเว้นว่าฉันหายไป System.Linq.Enumerable (และ Linq โดยทั่วไป) ใช้ Concat () สำหรับ "sequence + sequence" เท่านั้นโดยไม่ต้อง "item + sequence" ปัญหาที่บางคน "อาจคาดหวังว่าจะเพิ่มสองรายการด้วยกันแทนที่จะเพิ่มค่าเดียวในรายการอื่น" ได้รับอย่างชัดเจนเนื่องจากเหตุผลที่จะไม่ใช้หนึ่งในตัวเลือกดั้งเดิมอื่น ๆ
Ssswift

119

ฉันจะไปกับ Cons ด้วยเหตุผลง่ายๆข้อเดียวนั่นคือสิ่งที่คุณต้องการ

  1. ฉันเป็นแฟนตัวยงของการพูดสิ่งที่ฉันหมายถึงโดยเฉพาะอย่างยิ่งในซอร์สโค้ด มือใหม่จะต้องค้นหาคำจำกัดความของข้อเสียเพียงครั้งเดียว แต่จากนั้นอ่านและใช้งานเป็นพัน ๆ ครั้ง ฉันพบว่าในระยะยาวมันดีกว่าที่จะทำงานกับระบบที่ทำให้กรณีทั่วไปง่ายขึ้นแม้ว่าค่าใช้จ่ายล่วงหน้าจะสูงขึ้นเล็กน้อย

  2. ความจริงที่ว่ามันจะ "ไร้ความหมาย" สำหรับผู้ที่ไม่มีประสบการณ์ FP เป็นจริงประโยชน์ใหญ่ ในขณะที่คุณชี้ให้เห็นคำอื่น ๆ ทั้งหมดที่คุณพบมีความหมายบางอย่างและความหมายนั้นแตกต่างกันเล็กน้อยหรือคลุมเครือ แนวคิดใหม่ควรมีคำใหม่ (หรือในกรณีนี้คือคำเก่า) ฉันต้องการใครสักคนที่จะต้องค้นหาคำจำกัดความของข้อเสียมากกว่าที่จะคิดอย่างไม่ถูกต้องเขารู้ว่าสิ่งที่เพิ่มทำ

  3. การดำเนินการอื่น ๆ ที่ยืมมาจากภาษาที่ใช้งานได้มักจะเก็บชื่อดั้งเดิมไว้โดยไม่มีหายนะที่ชัดเจน ฉันไม่เห็นคำพ้องความหมายสำหรับคำว่า "แผนที่" และ "ลด" ซึ่งฟังดูคุ้นเคยกับผู้ที่ไม่ใช่ FPers และฉันไม่เห็นประโยชน์ใด ๆ จากการทำเช่นนั้น

(การเปิดเผยอย่างเต็มรูปแบบ: ฉันเป็นโปรแกรมเมอร์ Lisp ดังนั้นฉันจึงรู้อยู่แล้วว่าจุดด้อยหมายถึงอะไร)


16
อย่าลืมว่าความสามารถในการค้นพบนั้นสำคัญถ้าฉันพิมพ์ "testSuite" และดูรายการวิธีการฉันต้องการดูวิธีที่แนะนำสิ่งที่ถูกต้อง ฉันอาจจะไม่ค้นหาชื่อ (สำหรับฉัน) ที่ไร้สาระในความบังเอิญเป็นสิ่งที่ฉันต้องการ
Jon Skeet

33
ถ้าฉันรู้สึกว่าน่าสะอิดสะเอียนฉันจะทำวิธีการเพิ่มซึ่งก็ทำให้เกิดข้อยกเว้นกับข้อความ = "ใช้จุดด้อยเพื่อเติมลงใน ImmListList" :-)
Ken

2
มันจะไม่ฆ่าทุกคนที่จะอ่านความคิดเห็นสองสามบรรทัดอธิบายว่าทำไมชื่อนั้นคืออะไรและพูดถึงพวกเขาว่า "โครงสร้างและการตีความโปรแกรมคอมพิวเตอร์" ของ Abelson & Sussman
John R. Strohm

16
ตามเนื้อผ้าข้อเสียเพิ่มที่จุดเริ่มต้นมากกว่าจุดสิ้นสุด ดังนั้นจึงเป็นชื่อที่อาจทำให้เข้าใจผิดสำหรับวิธีการอธิบาย
walkytalky

16
เพียงเพื่อบันทึกโปรแกรมเมอร์ที่ไม่ทำงานต่อไปเพียงคลิกหรือ 3 ... en.wikipedia.org/wiki/Consจากคำว่า "สร้าง" การแสดงออก "เพื่อ cons x บน y" หมายถึงการสร้างวัตถุใหม่ด้วย ( ข้อเสีย xy)
Myster

59

ที่จริงแล้วฉันชอบAndโดยเฉพาะอย่างยิ่งในทางที่เป็นสำนวน ฉันชอบมันเป็นพิเศษหากคุณมีคุณสมบัติแบบอ่านอย่างเดียวแบบคงที่สำหรับรายการเปล่าและอาจทำให้คอนสตรัคเตอร์ส่วนตัวดังนั้นคุณต้องสร้างจากรายการว่างเสมอ

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

ฉันชอบความคิดที่ว่างเปล่า ยังไม่มั่นใจเกี่ยวกับและแม้ว่า มันเป็นเพียงเล็กน้อย blah
Jon Skeet

ดูเหมือนว่าฉันจะคิดเกี่ยวกับการสร้างรายการของสิ่งต่าง ๆ ในภาษาธรรมชาติ ถ้าคุณอ่านมันออกมาดัง ๆ ดูเหมือนว่าจะใช้งานง่ายกว่า Add หรือ Plus "list" เป็นรายการว่างเปล่าและ "Hello" และ "Immutable" และ "Word" ฉันจะยอมรับว่ามันแยกได้ชัดเจนน้อยกว่า
tvanfosson

52

เมื่อใดก็ตามที่ฉันติดขัดกับศัพท์บัญญัติฉันตี interwebs

thesaurus.comส่งคืนสิ่งนี้สำหรับ "เพิ่ม":

คำจำกัดความ: adjoin, เพิ่ม; แสดงความคิดเห็นเพิ่มเติม

คำพ้องความหมาย: คำต่อท้าย, ภาคผนวก, ante, ผนวก, เพิ่ม, เนื้อวัวเพิ่ม, เพิ่ม, สร้าง, คิดค่าบริการ, ดำเนินการต่อ, เข้าคิว, คิดเข้า, เนื้อออก, ความร้อน, ธุดงค์, ยกขึ้น, ผูกปม, ด้วย, รวม, แจ็คอัพ, แจ๊สอัพ, เข้าด้วยกัน, แผ่น, พาร์เลย์, piggyback, เสียบเข้า, เทมันลงบน, ตอบกลับ, วิ่งขึ้น, พูดต่อไป, ตบบน, ก้อนหิมะ, ซุปขึ้น, เร่งความเร็ว, เข็ม, ก้าวขึ้น, อาหารเสริม, หวาน, ตรึงบนแท็ก

ผมชอบเสียงAdjoinหรืออื่น ๆ Joinอีกมากมายเพียงแค่ นั่นคือสิ่งที่คุณทำใช่ไหม? วิธีนี้ยังสามารถนำไปใช้กับการเข้าร่วมอื่น ๆImmutableList<>'s


1
ฉันชอบ 'เข้าร่วม' แต่ในกรณีส่วนใหญ่เมื่อคุณเข้าร่วม 2 วัตถุคุณจะสิ้นสุดด้วย 1 ในกรณีนี้ถ้าคุณเข้าร่วม 2 วัตถุคุณกำลังสร้างวัตถุใหม่จริง ๆ
Outlaw Programmer

1
ฉันไม่รู้กรณีใด ๆ ใน. NET, Perl, PHP หรือแม้กระทั่ง VBScript ที่เข้าร่วมหมายถึงการกลายพันธุ์ การออกแบบนั้นทำให้ A และ B เข้าร่วมเพื่อสร้าง C โดยที่ C นั้นเป็นเอนทิตีใหม่เสมอ
spoulson

ฉันชอบเข้าร่วมและฉันเห็นด้วยกับ thesaurus.com :) ใช้มันตลอดเวลาเมื่อมีข้อสงสัยเกี่ยวกับชื่อ
Skurmedel

var suite = TestSuite ใหม่ <string, int> () .Join (x => x.Length);
Sly Gryphon

3
ไปกับ Piggyback อิโม หรือ HookUpWith
Chris Marasti-Georg

48

โดยส่วนตัวแล้วฉันชอบด้วย () ถ้าฉันใช้วัตถุหลังจากอ่านเอกสารหรือข้อคิดเห็นรหัสแล้วมันจะชัดเจนว่ามันทำอะไรและมันก็อ่านได้ในซอร์สโค้ด

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

หรือคุณเพิ่ม "พร้อม" กับมัน .. :)

object.AlongWith("this new item");

+1 "WITH" เป็นตัวดำเนินการมัดใน SETL ที่ทำสิ่งเดียวกัน หากใช้ SETL มันแล้วมันจะต้องได้รับสิทธิ :-)
finnw

1
อืม ... ใครใช้ VB อีกต่อไปแล้ว? :) อืมมมมมม .. เสียงดังมากใช่มั้ย heh .. แต่ไม่จริงจังเลยนั่นคือเหตุผลที่ฉันพิจารณา "AlongWith" ซึ่งจะลบปัญหา VB ออก มีวิธีการที่แตกต่างกันประมาณหนึ่งล้านวิธีที่เขาสามารถไปกับสิ่งนี้ ... ฉันหมายถึงแม้แต่คนที่บ้าเช่น: object.Plus () หรือ Object.ExistingPlus () ... ฯลฯ ... มันเป็นคำถามที่ดี โพสต์อย่างไรก็ตาม ... heh ..
LarryF

33

ฉันสิ้นสุดขึ้นไปกับการเพิ่มสำหรับทุกคอลเลกชันไม่เปลี่ยนรูปของฉันในBclExtras เหตุผลก็คือมันเป็นชื่อที่คาดเดาได้ง่าย ฉันไม่ได้กังวลเกี่ยวกับคนที่สับสนเพิ่มด้วยการเพิ่มการกลายพันธุ์เนื่องจากชื่อของประเภทนั้นนำหน้าด้วย Immutable

สำหรับชั่วขณะหนึ่งฉันพิจารณาจุดด้อยและชื่อสไตล์การทำงานอื่น ๆ ในที่สุดฉันก็ลดราคาลงเพราะพวกเขาไม่ค่อยรู้จัก โปรแกรมเมอร์ที่ใช้งานได้แน่นอนจะเข้าใจ แต่พวกเขาไม่ใช่ผู้ใช้ส่วนใหญ่

ชื่ออื่น ๆ : คุณพูดถึง:

  • บวก: ฉันปรารถนา / กำลังซักผ้าอยู่ สำหรับฉันนี่ไม่ได้แยกความแตกต่างว่าเป็นการดำเนินการที่ไม่กลายพันธุ์อีกต่อไปกว่าเพิ่ม
  • ด้วย: จะทำให้เกิดปัญหากับ VB (ปุนตั้งใจ)
  • ผู้ประกอบการมากไป: การค้นพบจะเป็นปัญหา

ตัวเลือกที่ฉันพิจารณา:

  • Concat: String ของนั้นไม่เปลี่ยนรูปและใช้สิ่งนี้ น่าเสียดายที่มันเพิ่มได้ดีจริงๆเท่านั้น
  • CopyAdd: คัดลอกอะไร แหล่งที่มารายการ?
  • AddToNewList: อาจดีสำหรับ List แต่สิ่งที่เกี่ยวกับ Collection, Stack, Queue, ฯลฯ ...

น่าเสียดายที่ดูเหมือนจะไม่มีคำที่เป็นจริง

  1. เป็นการดำเนินการที่ไม่แน่นอนอย่างแน่นอน
  2. ผู้ใช้ส่วนใหญ่เข้าใจได้ง่าย
  3. สามารถแทนได้ด้วยคำน้อยกว่า 4 คำ

มันจะยิ่งแปลกเมื่อคุณพิจารณาคอลเล็กชันนอกเหนือจาก List รับอินสแตนซ์ของ Stack แม้แต่โปรแกรมเมอร์ในปีแรกก็สามารถบอกคุณได้ว่า Stacks มีวิธีการคู่แบบ Push / Pop หากคุณสร้าง ImmutableStack และตั้งชื่อให้แตกต่างกันโดยสิ้นเชิงให้เรียกว่า Foo / Fop คุณเพิ่งเพิ่มงานเพื่อให้พวกเขาใช้คอลเลกชันของคุณ

แก้ไข: การตอบสนองต่อการแก้ไขเพิ่มเติม

ฉันเห็นว่าคุณกำลังจะไปกับ Plus ฉันคิดว่ากรณีที่ดีกว่านี้น่าจะเป็นลบสำหรับการลบออก หากฉันเห็นสิ่งต่อไปนี้ฉันจะสงสัยว่าในโลกนี้โปรแกรมเมอร์คิดอะไรอยู่

list.Minus(obj);

ปัญหาที่ใหญ่ที่สุดที่ฉันมีกับ Plus / Minus หรือการจับคู่ใหม่คือมันรู้สึกเหมือน overkill คอลเลกชันเองมีชื่อที่แตกต่างอยู่แล้วคำนำหน้าไม่เปลี่ยนรูป ทำไมต้องไปต่อด้วยการเพิ่มคำศัพท์ที่มีเจตนาที่จะเพิ่มความแตกต่างเช่นเดียวกับคำนำหน้าไม่เปลี่ยนรูปได้ทำไปแล้ว

ฉันสามารถดูอาร์กิวเมนต์ไซต์การโทรได้ มันทำให้ชัดเจนจากมุมมองของการแสดงออกเดียว แต่ในบริบทของฟังก์ชั่นทั้งหมดดูเหมือนว่าไม่จำเป็น

แก้ไข 2

ยอมรับว่าผู้คนสับสนโดย String.Concat และ DateTime.Add ฉันเคยเห็นโปรแกรมเมอร์ที่สว่างมากหลายคนประสบปัญหานี้

อย่างไรก็ตามฉันคิดว่า ImmutableList เป็นอาร์กิวเมนต์ที่แตกต่างกัน ไม่มีอะไรเกี่ยวกับสายอักขระหรือ DateTime ที่สร้างเป็นไม่เปลี่ยนรูปโปรแกรมเมอร์ คุณต้องรู้ว่ามันไม่เปลี่ยนรูปผ่านแหล่งอื่น ดังนั้นความสับสนจึงไม่คาดคิด

ImmutableList ไม่มีปัญหานั้นเนื่องจากชื่อกำหนดลักษณะการทำงาน คุณอาจโต้แย้งว่าผู้คนไม่รู้ว่า Immutable คืออะไรและฉันคิดว่ามันก็ใช้ได้เช่นกัน แน่นอนฉันไม่รู้จนกระทั่งประมาณ 2 ปีในวิทยาลัย แต่คุณมีปัญหาเดียวกันกับชื่ออะไรก็ตามที่คุณเลือกแทนที่จะเพิ่ม

แก้ไข 3:สิ่งที่เกี่ยวกับประเภทเช่น TestSuite ซึ่งไม่เปลี่ยนรูป แต่ไม่ประกอบด้วยคำว่า?

ฉันคิดว่าสิ่งนี้ทำให้เกิดแนวคิดที่ว่าคุณไม่ควรคิดค้นชื่อวิธีการใหม่ คือมีไดรฟ์ที่ทำให้ประเภทไม่เปลี่ยนรูปชัดเจนเพื่ออำนวยความสะดวกในการทำงานแบบขนาน หากคุณมุ่งเน้นที่การเปลี่ยนชื่อของวิธีการสำหรับการรวบรวมขั้นตอนต่อไปจะเป็นชื่อวิธีการกลายพันธุ์ในทุกประเภทที่คุณใช้ที่ไม่เปลี่ยนรูป

ฉันคิดว่ามันจะเป็นความพยายามที่มีคุณค่ามากขึ้นแทนที่จะมุ่งเน้นที่การทำให้ประเภทที่ระบุว่าไม่เปลี่ยนรูป ด้วยวิธีนี้คุณสามารถแก้ปัญหาได้โดยไม่คิดใหม่ทุกรูปแบบวิธีการกลายพันธุ์ที่นั่น

ตอนนี้คุณจะระบุ TestSuite ว่าไม่เปลี่ยนรูปได้อย่างไร ในสภาพแวดล้อมปัจจุบันฉันคิดว่ามีไม่กี่วิธี

  1. คำนำหน้าด้วย Immutable: ImmutableTestSuite
  2. เพิ่มคุณสมบัติซึ่งอธิบายระดับของ Immutablitiy นี่เป็นสิ่งที่ค้นพบได้น้อยกว่าอย่างแน่นอน
  3. ไม่มาก

เดา / ความหวังของฉันคือเครื่องมือในการพัฒนาจะเริ่มช่วยเหลือปัญหานี้โดยทำให้ง่ายต่อการระบุประเภทที่ไม่เปลี่ยนรูปแบบได้ง่ายๆโดยการเห็น (สีที่แตกต่างแบบอักษรที่แข็งแกร่งกว่า ฯลฯ ) แต่ฉันคิดว่านั่นเป็นคำตอบแม้ว่าจะเปลี่ยนชื่อวิธีทั้งหมด


ได้เพิ่มเหตุผลสำหรับการตั้งค่าของฉันสำหรับบวกมากกว่าเพิ่มไปที่คำถาม ยินดีต้อนรับความคิดเห็นเกี่ยวกับเหตุผลที่ ฉันจริงๆเปิดให้ความคิดที่ว่าฉันมีความโง่
Jon Skeet

@ JaredPar: แล้วถ้าเป็นแบบที่เรียกว่า TestSuite ล่ะ?
Jon Skeet

ชอบที่จะให้ +1 เพิ่มเติมเพื่อแก้ไข 3 แต่ไม่สามารถเห็นได้ชัด (ในกรณีของฉันฉันไม่ได้พยายามที่จะขนานกัน - ฉันเชื่อว่าความผันแปรไม่ได้นำไปสู่รหัสที่ง่ายต่อการให้เหตุผล) ฉันยังไม่เชื่อค่อนข้างมากว่า Add เป็นวิธีที่จะไป แต่การสนับสนุนสำหรับคำตอบที่นี่ โน้มน้าวใจ
Jon Skeet

หากคุณสามารถทิ้งคำถามนี้ไว้ในบทสนทนาในที่ทำงานนั่นก็ยอดเยี่ยมเช่นกัน btw ฉันเริ่มการสนทนาในรายการ C # ดังนั้นเพื่อนร่วมงานบางคนอาจมีส่วนเกี่ยวข้องอยู่แล้ว อาจจะถามภายในที่ Google เกินไป ...
จอนสกีต

@ จอนผมคิดว่าผมรู้ว่าสถานที่ที่ดีที่จะลดลงคำถามนี้ในที่ทำงาน :)
JaredPar

27

ฉันคิดว่านี่อาจเป็นหนึ่งในสถานการณ์ที่หายากเหล่านั้นซึ่งเป็นที่ยอมรับได้ในการโอเวอร์โหลดตัว+ดำเนินการ ในศัพท์คณิตศาสตร์เรารู้+ว่าไม่ได้ต่อท้ายสิ่งใดไว้ท้าย มันมักจะรวมสองค่าเข้าด้วยกันและส่งกลับค่าผลลัพธ์ใหม่

ตัวอย่างเช่นมันชัดเจนโดยสังหรณ์ใจเมื่อคุณพูด

x = 2 + 2;

ค่าผลลัพธ์ของ x คือ 4 ไม่ใช่ 22

ในทำนองเดียวกัน

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

ควรทำให้ชัดเจนว่าแต่ละตัวแปรกำลังจะถืออะไร ควรชัดเจนว่าlist2จะไม่เปลี่ยนแปลงในบรรทัดสุดท้าย แต่list3จะกำหนดผลลัพธ์ของการต่อท้าย "word" list2แทน

มิฉะนั้นฉันจะตั้งชื่อฟังก์ชั่น Plus ()


ถ้าคุณมีรายการทั่วไปซึ่งคุณสามารถเพิ่มจำนวนเต็ม (พูด) หรือรายการจำนวนเต็มอื่นได้อย่างถูกต้อง จากนั้นการใช้ + จะขัดแย้งกับการต่อข้อมูล
finnw

@finnw: ฉันไม่เห็นจุดของคุณ ด้วยรายการฉันมักจะคาดหวังว่า + จะหมายถึงผนวกไม่ว่าคุณจะเพิ่มองค์ประกอบหนึ่งหรือหลายคน
Bill the Lizard

4
สำหรับ API ที่ใช้ซ้ำได้ก็เป็นความคิดที่ดีที่จะมีเมธอดที่กำหนดชื่อไว้ในกรณีที่มีคนใช้คลาสของคุณจากภาษาที่ไม่มีผู้ให้บริการโหลดมากเกินไป
Neil

"ไม่ว่าคุณจะเพิ่มองค์ประกอบหนึ่งหรือหลายองค์ประกอบ" - ถ้าคุณต้องการเพิ่มรายการเป็นองค์ประกอบเดียว คือแต่[1] + 2 = [1,2] [1] + [2] = [1,[2]]สิ่งที่คุณแนะนำคือพฤติกรรมที่ไม่สอดคล้องกัน นี่อาจเป็นเหตุผลที่ Python ไม่อนุญาตให้คุณเพิ่มองค์ประกอบหนึ่งในรูปแบบนี้
mpen

ในภาษาที่พิมพ์แบบคงที่เช่น C # คุณสามารถบอกได้ว่าองค์ประกอบของรายการคืออะไรไม่ว่าจะเป็นรายการของรายการหรือรายการขององค์ประกอบดังนั้นคุณสามารถใช้ประเภทเพื่อตัดสินใจว่าจะเพิ่มองค์ประกอบหนึ่งที่เป็นรายการหรือเชื่อมโยงกัน ทั้งสองรายการ
Dobes Vandermeer

22

เพื่อให้ชัดเจนที่สุดคุณอาจต้องการไปกับ wordier CopyAndAddหรือสิ่งที่คล้ายกัน


คอลเลคชั่นที่ไม่เปลี่ยนรูปแบบไม่ได้ต้องการสำเนาเพื่อเพิ่ม นึกถึงต้นไม้ที่ไม่เปลี่ยนรูปพวกเขาต้องการโหนดใหม่และสามารถใช้ต้นไม้ที่มีอยู่เป็นใบไม้
JaredPar

BTW ฉันอ่านโปรไฟล์ของคุณจากนั้นอายุตามลำดับและรู้สึกประหลาดใจกับอายุของคุณ สติเตะในไม่ช้าหลังจากนั้น
JaredPar

ความคิดเห็นแรก Re: ฉันใช้ต้นไม้น้อยมากที่ความคิดนั้นไม่เคยเกิดขึ้นกับฉัน นั่นเป็นจุดที่ดี
Michael Myers

ความคิดเห็นที่สองอีกครั้ง: ฉันยอมรับฉันทำเพื่อตรา! ฉันไม่ชอบที่จะให้อายุของฉัน (จริง ๆ แล้วฉันอายุน้อยกว่าคุณ แต่ฉันสามารถเล่น crotchety old-timer ได้ดีถ้าฉันต้องการและฉันไม่ใช่คนเดียวที่อายุอยู่ในรายการ 89)
Michael Myers

อาร์กิวเมนต์ของต้นไม้ที่ไม่เปลี่ยนรูปนั้นเป็นจุดที่ดีและแข็งแกร่ง ดังนั้น EquivalentReferenceWithAdded (x) จะต่อสู้กับการโต้แย้งนั้น แต่ฟังดูโง่และยากที่จะอนุมาน
TheBlastOne

21

ฉันจะเรียกมันว่าExtend ()หรืออาจจะExtendWith ()ถ้าคุณรู้สึกว่า verbose จริงๆ

การขยายหมายถึงการเพิ่มบางสิ่งลงในอย่างอื่นโดยไม่ต้องเปลี่ยน ฉันคิดว่านี่เป็นคำศัพท์ที่เกี่ยวข้องมากใน C # เนื่องจากคล้ายกับแนวคิดของวิธีการขยาย - พวกเขา "เพิ่ม" วิธีการใหม่ในชั้นเรียนโดยไม่ต้อง "สัมผัส" ในชั้นเรียนของตัวเอง

มิฉะนั้นถ้าคุณต้องการเน้นว่าคุณไม่ได้ปรับเปลี่ยนวัตถุต้นฉบับเลยใช้คำนำหน้าบางอย่างเช่น Get- ดูเหมือนจะหลีกเลี่ยงไม่ได้สำหรับฉัน


1
ยังค่อนข้างหมายถึงการทำอะไรกับวัตถุฐาน
ความวุ่นวาย

18

เพิ่ม () ต่อท้าย ()

ฉันชอบที่จะใช้อดีตกาลสำหรับการดำเนินการกับวัตถุที่ไม่เปลี่ยนรูป มันสื่อถึงความคิดที่ว่าคุณไม่ได้เปลี่ยนวัตถุดั้งเดิมและมันง่ายต่อการจดจำเมื่อคุณเห็นมัน

นอกจากนี้เนื่องจากชื่อวิธีการกลายพันธุ์มักจะเป็นคำกริยาที่มีความตึงเครียดจึงใช้กับกรณีส่วนใหญ่ที่จำเป็นต้องเปลี่ยนชื่อวิธีที่คุณไม่รู้จัก ตัวอย่างเช่นสแต็กที่ไม่เปลี่ยนรูปได้มีวิธี "push" และ "popped"


1
Python ใช้แบบแผนนี้ด้วย เช่นฟังก์ชันในตัวกลับด้าน () และเรียงลำดับ ()
Joe

18

ฉันชอบคำแนะนำmmyersของCopyAndเพิ่ม ในการรักษาด้วยชุดรูปแบบ "การกลายพันธุ์" บางทีคุณสามารถไปกับBud (การสืบพันธุ์แบบไม่อาศัยเพศ), เติบโต , จำลอง , หรือวิวัฒนาการ ? =)

แก้ไข: เพื่อดำเนินการต่อกับชุดรูปแบบทางพันธุกรรมของฉันวิธีการเกี่ยวกับกำเนิดหมายความว่าวัตถุใหม่จะทำซึ่งขึ้นอยู่กับก่อนหน้านี้ แต่มีสิ่งใหม่ที่เพิ่มเข้ามา


14

นี่อาจเป็นการยืดออก แต่ใน Ruby มีสัญลักษณ์ที่ใช้กันทั่วไปสำหรับความแตกต่าง: addไม่กลายพันธุ์ add!การแปรรูป หากนี่เป็นปัญหาที่แพร่หลายในโครงการของคุณคุณก็สามารถทำได้เช่นกัน (ไม่จำเป็นต้องมีตัวอักษรที่ไม่ใช่ตัวอักษร แต่ใช้สัญกรณ์อย่างสม่ำเสมอเพื่อระบุวิธีการกลายพันธุ์ / ไม่กลายพันธุ์)


+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!"));

ตอนนี้คุณสามารถมีความคิดสร้างสรรค์ที่มีชื่อกฎและคุณจะสามารถสัมผัสฟังก์ชั่นที่คุณต้องการที่จะสนับสนุนไม่ได้เป็นความสามารถทั้งหมดของCopyIList

สำหรับการใช้งานเชนคุณสามารถสร้างนวกรรมิกที่สมเหตุสมผล (ซึ่งจะไม่ใช้การโยงเชน):

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.Appendthis

นี่คือสิ่งที่ดูเหมือนกับตัวอย่างล่าสุดของคุณ:

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

@ Jordao: เพราะการเรียงลำดับนี้นำไปสู่รูปแบบการทำให้มีชีวิตชีวาง่ายขึ้นมาก เหตุใดจึงมีตัวแปรสองตัวแยกกันเมื่อฉันต้องการเพียงตัวเดียว ในทำนองเดียวกันฉันไม่ต้องการที่จะสร้างสำเนาที่ไม่แน่นอน - ฉันต้องการให้ทุกอย่างไม่เปลี่ยนรูปไปตลอดเพราะนั่นนำไปสู่โค้ดที่ง่ายต่อการให้เหตุผลว่า IMO
Jon Skeet

สิ่งเหล่านี้ทั้งหมดยังค่อนข้างไม่สะดวกกว่า "Plus" ฯลฯ ขอบคุณสำหรับความคิดเห็นที่เกี่ยวข้องกับการกลายพันธุ์ แต่ฉันชอบวิธีการแบบ "ทำให้ไม่เปลี่ยนรูป" แน่นอน
Jon Skeet

บางทีก็อาจมีการตีความผิด ๆ เกี่ยวกับความหมายที่แท้จริงของการดำเนินการ ถ้าคุณทำตามเส้นทางวัตถุสเปคไม่มีการกลายพันธุ์ที่เกิดขึ้น (อย่างน้อยก็ไม่ภายนอก) วัตถุจะระบุเฉพาะสิ่งที่วัตถุไม่เปลี่ยนรูปแบบใหม่จะมีลักษณะ สิ่งที่คุณมีคือการดำเนินการที่เปลี่ยนจากวัตถุที่ไม่เปลี่ยนรูปแบบหนึ่งไปยังอีกวัตถุหนึ่งและเนื่องจากมันถูกเรียกว่า Copy จึงไม่มีที่ว่างให้เข้าใจผิด
Jordão

ชื่อเฉพาะที่เหมาะกับคุณดูเหมือนจะเป็นชื่อแบบผสมเช่น CopyAndAppend, CopyAndAdd ฯลฯ
Jordão

1
ฉันกำลังเพิ่มจำนวนขึ้นเรื่อย ๆ เกี่ยวกับวิธีการนี้ (ด้วยการแก้ไขทั้งหมด) เป็น API สำหรับคอลเลกชันที่ไม่เปลี่ยนรูป อย่างไรก็ตามฉันขอยืนยันว่าการรวมวิธีการนี้เข้ากับวิธีการช่วยเหลือสำหรับข้อมูลจำเพาะเริ่มต้นเช่น Concat นำเสนอสิ่งที่ดีที่สุดของโลกทั้งสอง
ป่าน

11

ความคิดสุ่มเล็กน้อย:

  • ImmutableAdd ()
  • ผนวก()
  • ImmutableList <T> (ImmutableList <T> originalList, T newItem) Constructor

1
+1 สำหรับ ImmutableAdd; ไม่กระตือรือร้นในการผนวก (มากเกินไปเช่น StringBuilder.Append ซึ่งการกลายพันธุ์) และรุ่นตัวสร้างเป็นความเจ็บปวดในแง่ของการผูกมัด
Jon Skeet

10

DateTime ใน C # ใช้ Add เหตุใดจึงไม่ใช้ชื่อเดียวกัน ตราบใดที่ผู้ใช้ในชั้นเรียนของคุณเข้าใจว่าคลาสนั้นไม่เปลี่ยนรูป


ฉันเถียงว่า DateTime เพิ่มความสับสนให้กับผู้คน ...
Jon Skeet

1
เช่นเดียวกับวิธีการกลายพันธุ์สตริงทำให้นักพัฒนาใหม่สับสน แต่ทุกคนเรียนรู้เร็วพอที่ "สตริงจะไม่เปลี่ยนรูป"
Tundey

9

ฉันคิดว่าสิ่งสำคัญที่คุณพยายามที่จะแสดงให้เห็นก็คือการแสดงที่ไม่ใช่การแสดงออกดังนั้นอาจมีบางคำที่มีคำทั่วไปอยู่ในนั้นเช่น CopyWith () หรือ InstancePlus ()


9

ฉันไม่คิดว่าภาษาอังกฤษจะทำให้คุณไม่สามารถตีความได้อย่างชัดเจนในขณะที่ใช้คำกริยาที่มีความหมายเหมือนกันกับ "เพิ่ม" "บวก" เกือบทำ แต่คนยังสามารถทำผิดได้

วิธีเดียวที่คุณจะป้องกันผู้ใช้ของคุณจากการเข้าใจผิดวัตถุสำหรับบางสิ่งที่ไม่แน่นอนคือการทำให้ชัดเจนโดยผ่านชื่อของวัตถุเองหรือผ่านชื่อของวิธีการ (เช่นเดียวกับตัวเลือก verbose เช่น "GetCopyWith" หรือ "CopyAndAdd")

ดังนั้นไปกับรายการโปรดของคุณ "บวก"


9

ก่อนอื่นจุดเริ่มต้นที่น่าสนใจ: http://en.wikipedia.org/wiki/Naming_conventions_(programming) ... โดยเฉพาะให้ตรวจสอบลิงก์ "ดูเพิ่มเติม" ที่ด้านล่าง

ฉันชอบทั้งบวกหรืออย่างมีประสิทธิภาพเท่ากัน

บวกและและเป็นทั้งคณิตศาสตร์ในนิรุกติศาสตร์ เช่นนี้ทั้งการดำเนินการทางคณิตศาสตร์ connot; ทั้งให้ผลลัพธ์ที่แสดงออกซึ่งอ่านตามธรรมชาติเป็นนิพจน์ที่อาจแก้ไขเป็นค่าซึ่งเหมาะกับวิธีที่มีค่าส่งคืน Andมีความหมายแฝงตรรกะเพิ่มเติม แต่ทั้งสองคำมีผลบังคับใช้กับรายการ Addหมายถึงการกระทำที่กระทำกับวัตถุซึ่งขัดแย้งกับความหมายที่ไม่เปลี่ยนแปลงของวิธีการ

ทั้งสองสั้นซึ่งเป็นสิ่งสำคัญโดยเฉพาะอย่างยิ่งให้ความสำคัญของการดำเนินงาน การดำเนินการที่ง่ายและดำเนินการบ่อยครั้งควรได้รับชื่อที่สั้นกว่า

การแสดงความหมายที่ไม่เปลี่ยนรูปนั้นเป็นสิ่งที่ฉันชอบทำผ่านบริบท นั่นคือฉันต้องการบอกเป็นนัยว่าบล็อกโค้ดทั้งหมดนี้มีความรู้สึกใช้งานได้ สมมติว่าทุกอย่างไม่เปลี่ยนรูป นั่นอาจเป็นเพียงฉัน ฉันชอบที่จะไม่เปลี่ยนเป็นกฎ ถ้าทำเสร็จก็ทำหลายอย่างในที่เดียวกัน ความไม่แน่นอนเป็นข้อยกเว้น


8

วิธีการเกี่ยวกับ Chain () หรือ Attach ()


1
แนบดูเหมือนว่าจะกลายพันธุ์ อาจ WithAttached จะฉลาด แต่ใกล้ With Withded ซึ่งได้รับการกล่าวถึงข้างต้น
TheBlastOne

เป็นเรื่องตลกที่มีการกล่าวถึง "การผูกมัด" หลายครั้งในการอธิบายสิ่งที่พยายามทำกับสิ่งนี้ (5 ครั้ง) แต่ไม่เสนอเป็นคำแนะนำ! มันเป็นสิ่งแรกที่ขึ้นมาบนvisualthesaurus.com(ไม่มีสังกัด) concatenateเมื่อฉันค้นหา
cod3monk3y

7

ฉันชอบเครื่องหมายบวก (และเครื่องหมายลบ) พวกมันสามารถเข้าใจได้ง่ายและแมปโดยตรงกับการปฏิบัติการที่เกี่ยวข้องกับประเภทที่ไม่เปลี่ยนรูปซึ่งรู้จักกันดี 2 + 2 ไม่ได้เปลี่ยนค่าเป็น 2 แต่จะส่งกลับค่าใหม่ที่ไม่เปลี่ยนแปลงอย่างเท่าเทียมกัน

ความเป็นไปได้อื่น ๆ :

Splice ()

Graft ()

Accrete ()


6

วิธีการเกี่ยวกับเพื่อน , mateWithหรือมีเพศสัมพันธ์สำหรับผู้ที่ปฏิบัติ ในแง่ของการทำซ้ำสัตว์เลี้ยงลูกด้วยนมโดยทั่วไปถือว่าไม่เปลี่ยนรูป

จะโยนสหภาพออกไปที่นั่นด้วย ยืมมาจาก SQL


2
+1 สำหรับยูเนี่ยน อย่างไรก็ตามฉันขอยืมโดยตรงจากทฤษฎีเซต :-)
Christoffer Lette

SQL ไม่ได้มีคำศัพท์มากมายจากทฤษฎีเซตใช่หรือไม่
34499 Jason D

1
นอกจากนี้ Union ยังหมายถึงความแตกต่าง .. หากคุณต้องการรวมรายการที่ซ้ำกัน (อย่างน้อยใน TSQL) คุณต้องใช้ Union All อย่างชัดเจน
ป่าน

6

เห็นได้ชัดว่าฉันเป็นคนแรกที่ Obj-C / Cocoa ตอบคำถามนี้

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]:ซึ่งจะกลายพันธุ์วัตถุในสถานที่
Dave DeLong

3
+1 ฉันไม่เข้าใจความเกลียดชังของผู้คนต่อการใช้คำฟุ่มเฟื่อย (aka เอกสารคู่มือ)
hatfinch

5

ฉันคิดว่า "เพิ่ม" หรือ "บวก" ฟังดูดี ชื่อของรายการควรเพียงพอที่จะถ่ายทอดรายการที่ไม่สามารถเปลี่ยนแปลงได้


มันไม่มีรายการมันเป็นชุดทดสอบ
tstenner

5

อาจมีบางคำที่ทำให้ฉันจำได้มากขึ้นในการทำสำเนาและเพิ่มเนื้อหาลงในนั้นแทนที่จะกลายพันธุ์ตัวอย่าง (เช่น "Concatenate") แต่ฉันคิดว่าการมีความสมมาตรสำหรับคำเหล่านั้นสำหรับการกระทำอื่น ๆ จะดีเช่นกัน ฉันไม่รู้คำที่คล้ายกันสำหรับ "ลบ" ที่ฉันคิดเหมือน "Concatenate" "Plus" ฟังดูแปลก ๆ สำหรับฉัน ฉันไม่คิดว่ามันจะถูกใช้ในบริบทที่ไม่ใช่ตัวเลข แต่นั่นอาจมาจากภูมิหลังที่ไม่ใช่ภาษาอังกฤษของฉัน

บางทีฉันอาจจะใช้รูปแบบนี้

AddToCopy
RemoveFromCopy
InsertIntoCopy

สิ่งเหล่านี้มีปัญหาของตัวเองเมื่อฉันคิดถึงมัน ใคร ๆ ก็คิดว่าพวกเขาเอาบางสิ่งออกไปหรือเพิ่มบางสิ่งลงในอาร์กิวเมนต์ที่กำหนด ไม่แน่ใจเกี่ยวกับมันเลย ฉันคิดว่าคำพูดเหล่านั้นไม่เล่นบทสนทนาที่ดี พิมพ์คำเกินไป

บางทีฉันก็แค่ใช้ "เพิ่ม" ธรรมดาและเพื่อนด้วย ฉันชอบวิธีที่ใช้ในวิชาคณิตศาสตร์

Add 1 to 2 and you get 3

แน่นอนว่า 2 ยังคงเป็น 2 และคุณได้รับหมายเลขใหม่ นี่เป็นตัวเลขสองตัวไม่ใช่เกี่ยวกับรายการและองค์ประกอบ แต่ฉันคิดว่ามันมีความคล้ายคลึงกัน ในความคิดของฉันaddไม่ได้แปลว่าคุณกลายพันธุ์อะไร แน่นอนฉันเห็นจุดของคุณที่มีคำสั่งโดดเดี่ยวที่มีเพียงaddและไม่ใช้วัตถุใหม่ที่ส่งคืนไม่ได้ดูบั๊ก แต่ตอนนี้ฉันก็คิดบางครั้งเกี่ยวกับความคิดในการใช้ชื่ออื่นที่ไม่ใช่ "เพิ่ม" แต่ฉันไม่สามารถหาชื่ออื่นได้โดยไม่ทำให้ฉันคิดว่า "อืมฉันต้องดูเอกสารประกอบเพื่อทราบว่า มันเกี่ยวกับ "เพราะชื่อนั้นแตกต่างจากสิ่งที่ฉันคาดว่าจะเรียกว่า" เพิ่ม " แค่คิดแปลก ๆ เกี่ยวกับเรื่องนี้จาก litb ไม่แน่ใจว่ามันสมเหตุสมผลเลย :)


แต่สำเนาไม่จำเป็นเสมอไปในคอลเลกชันที่ไม่เปลี่ยนรูป ใช้ต้นไม้ไบนารีเช่น เพิ่มรากใหม่ไม่จำเป็นต้องมีการคัดลอกเพียงค่าใหม่ที่หนึ่งของใบไม้เป็นต้นไม้ที่เก่า
JaredPar

KISS - หากการตั้งชื่อเริ่มรวมรายละเอียดการใช้งานชื่อวิธีการทั้งหมดจะยาวเกินไป "เพิ่ม" นั้นง่ายพอและทำงานได้ดี
mP

1
@mP: อีกครั้งคุณใช้วลี "รายละเอียดการใช้งาน" ในแบบที่ฉันเชื่อว่าไม่เหมาะสม ไม่ว่าจะเป็นรายการที่เชื่อมโยงหรืออาร์เรย์ภายใต้ประทุนเป็นรายละเอียดการใช้งาน ฉันสามารถเปลี่ยนการใช้งานได้โดยไม่ต้องเปลี่ยน API ด้านที่ไม่เปลี่ยนรูปไม่ได้เป็นรายละเอียดการใช้งาน
Jon Skeet

1
ขวา. JaredPar แต่ฉันคิดว่ามันก็ไม่สำคัญเช่นกันที่จะคัดลอกต้นไม้จริง ๆหรือใช้ต้นไม้ที่มีอยู่แล้วใช้เป็นใบไม้สำหรับต้นไม้ใหม่ที่ส่งคืน ฉันหมายถึงนั่นเป็นเพียงรายละเอียดการปฏิบัติ มันเหมือนกันสำหรับ (ฉันเชื่อว่า) การดำเนินการ substring สำหรับคลาสสตริงของ java
Johannes Schaub - litb


5

ผมคิดว่าPlus()และMinus()หรือผลัดกันIncluding(), Excluding()มีความเหมาะสมที่อ้างพฤติกรรมไม่เปลี่ยนรูป

อย่างไรก็ตามไม่มีตัวเลือกการตั้งชื่อที่จะทำให้ทุกคนชัดเจนอย่างสมบูรณ์ดังนั้นฉันเองเชื่อว่าความคิดเห็น xml doc ที่ดีจะไปไกลมากที่นี่ VS ขว้างสิ่งเหล่านี้ในหน้าของคุณเมื่อคุณเขียนโค้ดใน IDE - มันยากที่จะมองข้าม


4

Append- เพราะโปรดทราบว่าชื่อของSystem.Stringวิธีการแนะนำให้พวกเขากลายพันธุ์อินสแตนซ์ แต่พวกเขาไม่

หรือฉันชอบAfterAppending:

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

เช่นเดียวกับข้อโต้แย้ง DateTime ก่อนหน้านี้ผมเห็นด้วยกับความสำคัญถ้ามันไม่ได้สำหรับความจริงที่ว่าโปรแกรมเมอร์จำนวนมากเพื่อทำคาดหวังวิธีสตริงที่จะทำสิ่ง พวกเขาต้องบอก (บางครั้งซ้ำ ๆ ) ว่าสตริงนั้นไม่เปลี่ยนรูป ฉันต้องการที่จะล่อให้นักพัฒนาลูกค้าของฉันลงไปในหลุมของความสำเร็จ :)
จอนสกีต

ฉันชอบผนวกมากขึ้น มันแตกต่างว่าคุณไม่ได้กลายพันธุ์คอลเลกชัน แต่เข้าร่วมกับมัน

4

list.CopyWith(element)

Smalltalk เช่นเดียวกับ :)

และยังlist.copyWithout(element)ลบองค์ประกอบทั้งหมดที่เกิดขึ้นซึ่งมีประโยชน์มากที่สุดเมื่อใช้list.copyWithout(null)เพื่อลบองค์ประกอบที่ไม่ได้ตั้งค่า


3

ฉันจะไปหาเพิ่มเพราะฉันเห็นประโยชน์ของชื่อที่ดีกว่า แต่ปัญหาคือการหาชื่อที่แตกต่างกันสำหรับการดำเนินการที่ไม่เปลี่ยนรูปแบบอื่น ๆ ซึ่งอาจทำให้ชั้นไม่คุ้นเคยถ้ามันเหมาะสม


ใช่ฉันเห็นประเด็นของคุณ ฉันคิดว่าฉันยังคงชอบ Plus อยู่ แต่มันก็คุ้มที่จะพิจารณา
Jon Skeet

ขอบคุณจอน ฉันรอคอยที่จะใช้กรอบงานของคุณ ฉันเพิ่งอ่านเกี่ยวกับมันและมันดูดีมาก ขอบคุณอีกครั้ง.
Joan Venge
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.