คำถามติดแท็ก immutability

23
หากวัตถุที่ไม่เปลี่ยนรูปนั้นดีทำไมผู้คนยังคงสร้างวัตถุที่เปลี่ยนแปลงได้ [ปิด]
หากออบเจ็กต์ที่ไม่เปลี่ยนรูปแบบนั้นดีง่ายและให้ประโยชน์ในการเขียนโปรแกรมพร้อมกันเหตุใดโปรแกรมเมอร์จึงต้องสร้างออบเจ็กต์ที่เปลี่ยนแปลงไม่ได้² ฉันมีประสบการณ์สี่ปีในการเขียนโปรแกรม Java และอย่างที่ฉันเห็นสิ่งแรกที่ผู้คนทำหลังจากสร้างคลาสคือสร้าง getters และ setters ใน IDE (ทำให้มันไม่แน่นอน) มีการขาดการรับรู้หรือเราสามารถใช้วัตถุที่เปลี่ยนแปลงได้ในสถานการณ์ส่วนใหญ่หรือไม่? ¹ วัตถุที่ไม่เปลี่ยนรูปนั้นเป็นวัตถุที่ไม่สามารถแก้ไขสถานะได้หลังจากสร้างขึ้นแล้ว ² วัตถุที่ไม่แน่นอนเป็นวัตถุที่สามารถแก้ไขได้หลังจากที่มันถูกสร้างขึ้น

6
ทำไม Java 8 ถึงไม่รวมคอลเลกชันที่ไม่เปลี่ยนรูป?
ทีมงาน Java ได้ทำงานอย่างยอดเยี่ยมในการขจัดอุปสรรคในการเขียนโปรแกรมการทำงานใน Java 8 โดยเฉพาะอย่างยิ่งการเปลี่ยนแปลงของ java.util Collections ทำหน้าที่ได้อย่างยอดเยี่ยมในการแปลงสายสัมพันธ์ให้เป็นการดำเนินการที่รวดเร็วมาก เมื่อพิจารณาว่างานที่พวกเขาทำเพิ่มฟังก์ชันชั้นหนึ่งและวิธีการทำงานในคอลเลกชันได้ดีเพียงใดทำไมพวกเขาถึงล้มเหลวในการจัดหาคอลเลกชันที่ไม่เปลี่ยนรูปแบบหรือแม้แต่อินเตอร์เฟสคอลเล็กชันที่ไม่เปลี่ยนรูปแบบโดยสิ้นเชิง โดยไม่ต้องเปลี่ยนรหัสใด ๆ ที่มีอยู่ทีม Java สามารถเพิ่มอินเทอร์เฟซที่ไม่เปลี่ยนรูปได้ซึ่งเป็นอินเทอร์เฟซที่ไม่เปลี่ยนรูปได้ลบเมธอด "set" และทำให้อินเตอร์เฟสที่มีอยู่ขยายออกจากพวกเขาเช่นนี้ ImmutableIterable ____________/ | / | Iterable ImmutableCollection | _______/ / \ \___________ | / / \ \ Collection ImmutableList ImmutableSet ImmutableMap ... \ \ \_________|______________|__________ | \ \___________|____________ | \ | \___________ | …

6
การไม่เปลี่ยนรูปแบบทำให้ประสิทธิภาพใน JavaScript แย่ลงหรือไม่?
ดูเหมือนว่าจะมีแนวโน้มล่าสุดใน JavaScript ต่อการรักษาโครงสร้างข้อมูลที่ไม่เปลี่ยนรูป ตัวอย่างเช่นถ้าคุณต้องการเปลี่ยนคุณสมบัติเดียวของวัตถุควรสร้างวัตถุใหม่ทั้งหมดด้วยคุณสมบัติใหม่และคัดลอกคุณสมบัติอื่นทั้งหมดจากวัตถุเก่าแล้วปล่อยให้วัตถุเก่ารวบรวมขยะ (นั่นคือความเข้าใจของฉันต่อไป) ปฏิกิริยาเริ่มต้นของฉันคือดูเหมือนว่ามันจะไม่ดีต่อประสิทธิภาพ แต่แล้วเหมือนห้องสมุดImmutable.jsและRedux.jsนั้นเขียนขึ้นโดยคนที่ฉลาดกว่าฉันและดูเหมือนจะมีความกังวลอย่างมากสำหรับการทำงานจึงทำให้ผมสงสัยว่าความเข้าใจของฉันของขยะ (และผลกระทบต่อประสิทธิภาพของมัน) เป็นสิ่งที่ผิด มีประโยชน์ด้านประสิทธิภาพต่อการเปลี่ยนแปลงไม่ได้ที่ฉันพลาดไปหรือไม่และพวกเขามีค่ามากกว่าข้อเสียในการสร้างขยะจำนวนมากหรือไม่?

11
ทำไม String ถึงไม่เปลี่ยนรูปใน Java?
ฉันไม่เข้าใจเหตุผลของมัน ฉันมักจะใช้คลาส String เหมือนนักพัฒนาอื่น ๆ แต่เมื่อฉันแก้ไขค่าของมันอินสแตนซ์ใหม่ของ String ที่สร้างขึ้น สิ่งที่อาจเป็นสาเหตุของการไม่เปลี่ยนรูปแบบสำหรับคลาส String ใน Java? ฉันรู้ว่ามีทางเลือกบางอย่างเช่น StringBuffer หรือ StringBuilder มันเป็นเพียงความอยากรู้

4
ทำไมคอลเลกชัน Java จึงถูกนำไปใช้กับ“ วิธีการเสริม” ในอินเตอร์เฟส
ในระหว่างการนำไปใช้ครั้งแรกของฉันการขยายเฟรมเวิร์กคอลเลกชัน Java ฉันค่อนข้างประหลาดใจที่เห็นว่าอินเตอร์เฟสการรวบรวมมีวิธีการประกาศเป็นทางเลือก ผู้ดำเนินการคาดว่าจะโยน UnsupportedOperationExceptions หากไม่ได้รับการสนับสนุน สิ่งนี้ทำให้ฉันกลายเป็นตัวเลือกการออกแบบ API ที่แย่ทันที หลังจากอ่านหนังสือ "Effective Java" ที่ยอดเยี่ยมของ Joshua Bloch แล้วหลังจากเรียนรู้ว่าเขาอาจต้องรับผิดชอบต่อการตัดสินใจเหล่านี้ ฉันคิดว่าการประกาศอินเทอร์เฟซสองรายการ: คอลเลกชันและ MutableCollection ซึ่งขยายคอลเลกชันด้วยวิธีการ "ทางเลือก" จะทำให้รหัสลูกค้าที่บำรุงรักษาได้มากขึ้น มีบทสรุปที่ดีของปัญหาที่เป็นที่นี่ มีเหตุผลที่ดีหรือไม่ที่เลือกวิธีเสริมแทนที่จะใช้สองอินเตอร์เฟส

5
เมื่อใดที่ไม่ควรใช้นักแสดงใน akka / erlang
ฉันทำงานกับ akka มา 7-8 เดือนแล้วทุกวัน เมื่อฉันเริ่มฉันจะทำงานกับแอพพลิเคชั่นและสังเกตว่านักแสดงจะถูกใช้โดยทั่วไปทุกครั้งที่อยู่ในระบบของนักแสดงเพื่อสื่อสารระหว่างวัตถุส่วนใหญ่ ดังนั้นฉันจึงทำแบบเดียวกัน - หมุนนักแสดงคนอื่นให้กับ x / y / z สำหรับฉันดูเหมือนว่านี่อาจเป็นการพิจารณาที่ไม่เจาะจงเกินไปเพิ่มความซับซ้อนในที่ที่ไม่ต้องการ - แต่ฉันไม่สามารถหาการอภิปรายว่าควรใช้นักแสดงกับซิงโครนัสธรรมดาหรือแม้แต่ async ตรรกะผ่านฟิวเจอร์ส ฉันเริ่มไตร่ตรองท่าทางของฉันหลังจากเพื่อนร่วมงานของฉันพูดถึงสิ่งที่คล้ายกัน ฉันรู้หลายกรณีเมื่อเร็ว ๆ นี้ซึ่งฉันได้ไตร่ตรองงานแล้วหลีกเลี่ยงการสร้างนักแสดงคนอื่นเพราะฉันสามารถบรรลุผลลัพธ์เดียวกันได้อย่างปลอดภัยในการใช้งานที่ไม่เปลี่ยนรูป - เช่นสิ่งที่ต้องการรับค่าการกำหนดค่าจาก db หรือไฟล์ที่คุณเข้าถึงไม่บ่อยนัก รอผลคือกรณีการใช้งานจริง โดยเฉพาะอย่างยิ่งสำหรับฉันดูเหมือนว่ากรณีใด ๆ ที่คุณเล่นกับรัฐที่ไม่เปลี่ยนรูปนักแสดงสร้างความซับซ้อนและปริมาณงานที่ จำกัด - ฟังก์ชั่นที่บริสุทธิ์ในวัตถุเช่นสามารถเรียกได้พร้อมกันโดยไม่มีความเสี่ยงในระดับเดียวกัน นักแสดงสามารถดำเนินการได้ทีละข้อความเท่านั้น ข้อควรพิจารณาอื่นคือคุณจะต้องรอเธรดถ้าคุณต้องรอผลจนกว่าคุณจะเริ่มใช้ฟิวเจอร์ส แต่กรณีที่คุณไม่ต้องกังวลเกี่ยวกับการส่งข้อความ async หรือมาตราส่วนดูเหมือนว่าอาจจะเกินจ้างนักแสดง ดังนั้นคำถามของฉันคือ - มีเวลาไม่ดีที่จะใช้นักแสดงหรือไม่? ฉันอยากรู้ว่า erlang มีลักษณะอย่างไรและจะต้องการข้อมูลเชิงลึกของผู้อื่นอย่างแท้จริง หรือถ้ามีหลักการบางอย่างที่นักแสดงใช้

9
การเปลี่ยนแปลงไม่ได้จะคุ้มค่ามากหรือไม่เมื่อไม่มีการเห็นพ้องด้วย?
ดูเหมือนว่าความปลอดภัยของเธรดมักถูกกล่าวถึงบ่อยครั้งว่าเป็นประโยชน์หลักของการใช้ประเภทที่ไม่เปลี่ยนรูปและโดยเฉพาะอย่างยิ่งคอลเลกชัน ฉันมีสถานการณ์ที่ฉันต้องการตรวจสอบให้แน่ใจว่าวิธีการจะไม่แก้ไขพจนานุกรมสตริง (ซึ่งไม่เปลี่ยนรูปใน C #) ฉันต้องการ จำกัด สิ่งต่าง ๆ ให้มากที่สุด อย่างไรก็ตามฉันไม่แน่ใจว่าการเพิ่มการพึ่งพาแพ็คเกจใหม่ (Microsoft Immutable Collections) นั้นคุ้มค่าหรือไม่ ประสิทธิภาพไม่ใช่ปัญหาใหญ่เช่นกัน ดังนั้นฉันเดาว่าคำถามของฉันคือการแนะนำให้สะสมอย่างไม่เปลี่ยนรูปแบบเมื่อไม่มีข้อกำหนดเรื่องประสิทธิภาพการทำงานที่หนักหน่วงและไม่มีปัญหาเรื่องความปลอดภัยของเธรดหรือไม่? พิจารณาความหมายที่มีค่า (ตามตัวอย่างของฉัน) อาจจะใช่หรือไม่ใช่ข้อกำหนดก็ได้เช่นกัน

2
Alan Kay หมายถึงอะไรโดย“ การมอบหมาย” ในประวัติศาสตร์ยุคแรกของ Smalltalk
ฉันได้อ่านประวัติต้นของสมอลล์ทอล์คและมีการกล่าวถึง "การมอบหมาย" สองสามอย่างซึ่งทำให้ฉันถามความเข้าใจเกี่ยวกับความหมายของมัน: แม้ว่า OOP มาจากแรงจูงใจหลายอย่าง แต่ก็เป็นศูนย์กลาง มาตราส่วนขนาดใหญ่คือการค้นหาโครงร่างโมดูลที่ดีกว่าสำหรับระบบที่ซับซ้อนที่เกี่ยวข้องกับการซ่อนรายละเอียดและมาตราส่วนขนาดเล็กคือการค้นหาการมอบหมายรุ่นที่ยืดหยุ่นมากขึ้นแล้วพยายามกำจัดมันทั้งหมด (จากปี1960-66 - OOP ยุคแรกและแนวคิดการก่อสร้างอื่น ๆ ของอายุหกสิบเศษมาตรา I) สิ่งที่ผมได้จาก Simula ก็คือว่าตอนนี้คุณสามารถใช้ทดแทนการผูกและการมอบหมายกับเป้าหมาย สิ่งสุดท้ายที่คุณต้องการให้โปรแกรมเมอร์ทำคือยุ่งกับสถานะภายในแม้ว่าจะถูกนำเสนอเป็นรูปเป็นร่าง แต่วัตถุที่ควรจะนำเสนอเป็นเว็บไซต์ของพฤติกรรมในระดับสูงที่เหมาะสมมากขึ้นเพื่อใช้เป็นส่วนประกอบแบบไดนามิก (... ) มันเป็นเรื่องที่โชคร้ายที่สิ่งที่เรียกว่า "การเขียนโปรแกรมเชิงวัตถุ" ในทุกวันนี้เป็นเพียงการเขียนโปรแกรมแบบเก่า ๆ โปรแกรมจำนวนมากถูกโหลดด้วยการดำเนินการ "สไตล์การมอบหมาย" ซึ่งขณะนี้ทำโดยขั้นตอนการเชื่อมต่อที่มีราคาแพงกว่า (จากสไตล์ "เชิงวัตถุ"ส่วนที่ IV) ฉันถูกต้องในการตีความเจตนาว่าวัตถุนั้นมีความหมายว่าเป็นส่วนหน้าและวิธีการใด ๆ (หรือ "ข้อความ") ที่มีวัตถุประสงค์เพื่อตั้งค่าตัวแปรอินสแตนซ์บนวัตถุ (เช่น "การมอบหมาย") เป็นการเอาชนะวัตถุประสงค์หรือไม่ การตีความนี้ดูเหมือนจะได้รับการสนับสนุนโดยสองข้อความในภายหลังในหัวข้อที่สี่: เทคนิคสี่อย่างที่ใช้ร่วมกัน - สถานะถาวร, พหุสัณฐาน, การสร้างอินสแตนซ์และวิธีการตามเป้าหมายสำหรับวัตถุ สิ่งเหล่านี้ไม่จำเป็นต้องใช้ "ภาษาเชิงวัตถุ" ซึ่ง ALGOL …

7
การเขียนโปรแกรมที่ไม่เปลี่ยนรูปแบบและ Object Oriented
ในภาษา OOP ส่วนใหญ่โดยทั่วไปวัตถุจะเปลี่ยนแปลงไม่ได้ด้วยชุดข้อยกเว้นที่ จำกัด (เช่น tuples และสตริงใน python) ในภาษาที่ใช้งานได้ส่วนใหญ่ข้อมูลจะไม่เปลี่ยนรูป วัตถุที่เปลี่ยนแปลงไม่ได้และไม่เปลี่ยนรูปแบบนำรายชื่อทั้งข้อดีและข้อเสียมาเอง มีภาษาที่พยายามจะแต่งงานกับแนวคิดทั้งสองอย่างเช่นสกาล่าที่คุณมีข้อมูลที่ไม่แน่นอนและไม่เปลี่ยนรูปแบบ (ประกาศอย่างชัดเจน) (โปรดแก้ไขให้ฉันถ้าฉันผิดฉันมีความรู้เรื่องสกาล่ามากกว่า จำกัด ) คำถามของฉันคือไม่สมบูรณ์ (! sic) เปลี่ยนไม่ -ie วัตถุที่ไม่สามารถกลายพันธุ์เมื่อมันได้รับ created- ทำให้รู้สึกใด ๆ ในบริบท OOP แล้ว? มีการออกแบบหรือการนำโมเดลดังกล่าวไปใช้หรือไม่? โดยพื้นฐานแล้วความไม่สามารถเปลี่ยนแปลงได้ (สมบูรณ์) และ OOP ตรงกันข้ามหรือมุมฉากหรือไม่? แรงจูงใจ: ใน OOP ปกติแล้วคุณจะดำเนินการกับข้อมูลการเปลี่ยนแปลง (การกลายพันธุ์) ข้อมูลพื้นฐานทำให้การอ้างอิงระหว่างวัตถุเหล่านั้น เช่นวัตถุของคลาสที่Personมีสมาชิกfatherอ้างอิงPersonวัตถุอื่น หากคุณเปลี่ยนชื่อพ่อสิ่งนี้จะปรากฏแก่วัตถุลูกทันทีโดยไม่จำเป็นต้องอัปเดต การไม่เปลี่ยนรูปคุณจะต้องสร้างวัตถุใหม่สำหรับทั้งพ่อและลูก แต่คุณจะมีข้อผิดพลาด kerfuffle น้อยลงมากเมื่อใช้วัตถุที่แชร์หลายเธรด GIL และอื่น ๆ

5
ความไม่สามารถเปลี่ยนรูปแบบได้ทั้งหมดไม่จำเป็นต้องล็อคในการเขียนโปรแกรมแบบหลายโปรเซสเซอร์หรือไม่?
ส่วนที่ 1 ชัดเจนไม่สามารถตัดทอนความต้องการล็อคในการเขียนโปรแกรมแบบมัลติโปรเซสเซอร์ลดความต้องการนั้นหรือมีกรณีที่ความไม่สามารถเปลี่ยนได้เพียงอย่างเดียวไม่เพียงพอหรือไม่? สำหรับฉันดูเหมือนว่าคุณสามารถเลื่อนการประมวลผลและรัฐแค็ปซูลได้นานก่อนที่โปรแกรมส่วนใหญ่จะต้องทำอะไรบางอย่างจริง (อัปเดตแหล่งข้อมูลสร้างรายงานยกเว้นข้อยกเว้น ฯลฯ ) การกระทำดังกล่าวสามารถทำได้โดยไม่ล็อคหรือไม่? การกระทำเพียงแค่โยนวัตถุแต่ละชิ้นออกไปและสร้างใหม่แทนที่จะเปลี่ยนแบบเดิม (มุมมองที่หยาบคายของการเปลี่ยนแปลงไม่ได้) ให้การป้องกันที่สมบูรณ์จากการโต้แย้งระหว่างกระบวนการหรือมีมุมที่ยังต้องล็อค? ฉันรู้ว่าโปรแกรมเมอร์และนักคณิตศาสตร์ที่ใช้งานได้จำนวนมากชอบพูดถึง "ไม่มีผลข้างเคียง" แต่ใน "โลกแห่งความจริง" ทุกอย่างมีผลข้างเคียงแม้ว่าจะถึงเวลาที่ต้องใช้คำสั่งเครื่อง ฉันสนใจทั้งคำตอบเชิงทฤษฎี / วิชาการและคำตอบเชิงปฏิบัติ / โลกแห่งความจริง หากความไม่สามารถเปลี่ยนแปลงได้ปลอดภัยตามขอบเขตหรือสมมติฐานบางอย่างฉันต้องการทราบว่าขอบเขตของ "เขตปลอดภัย" คืออะไรกันแน่ ตัวอย่างของขอบเขตที่เป็นไปได้: I / O ยกเว้น / ข้อผิดพลาด การโต้ตอบกับโปรแกรมที่เขียนเป็นภาษาอื่น การโต้ตอบกับเครื่องอื่น ๆ (ทางกายภาพเสมือนหรือตามทฤษฎี) ขอขอบคุณเป็นพิเศษสำหรับ @JimmaHoffa สำหรับความคิดเห็นของเขาซึ่งเริ่มต้นคำถามนี้! ส่วนที่ 2 การเขียนโปรแกรมหลายตัวประมวลผลมักจะใช้เป็นเทคนิคการเพิ่มประสิทธิภาพ - เพื่อให้โค้ดทำงานได้เร็วขึ้น เมื่อไหร่ที่จะใช้การล็อคกับวัตถุที่ไม่เปลี่ยนรูปได้เร็วขึ้น? เมื่อพิจารณาถึงขีด จำกัด ที่กำหนดไว้ในกฎหมายของ Amdahlคุณสามารถบรรลุประสิทธิภาพที่เหนือกว่าทุกประการ (ไม่ว่าจะมีหรือไม่มีตัวเก็บขยะที่พิจารณา) กับวัตถุที่ไม่เปลี่ยนรูปหรือการล็อควัตถุที่ไม่แน่นอน …

7
ความแตกต่างระหว่างไม่เปลี่ยนรูปและ const
ฉันมักจะเห็นคำศัพท์immutableและconstใช้สลับกันได้ อย่างไรก็ตามจากประสบการณ์ (เล็กน้อย) ของฉันทั้งสองต่างกันมากใน 'สัญญา' ที่พวกเขาทำในรหัส: ไม่เปลี่ยนรูปทำให้สัญญาที่วัตถุนี้จะไม่เปลี่ยนแปลงใด ๆ (เช่น Python tuples, สตริง Java) Const ทำสัญญาที่อยู่ในขอบเขตของตัวแปรนี้มันจะไม่ถูกแก้ไข (ไม่มีสัญญาใด ๆ เกี่ยวกับสิ่งที่เธรดอื่น ๆ อาจทำกับวัตถุที่ชี้ไปในช่วงเวลานี้เช่นคีย์เวิร์ด C / C ++) เห็นได้ชัดว่าทั้งสองไม่เทียบเท่ากันยกเว้นภาษานั้นเป็นแบบเธรดเดียว (PHP) หรือมีทั้งระบบการพิมพ์เชิงเส้นหรือแบบ uniquness (Clean, Mercury, ATS) ครั้งแรกฉันเข้าใจแนวคิดทั้งสองนี้ถูกต้องหรือไม่ ประการที่สองหากมีความแตกต่างทำไมพวกเขาเกือบใช้เฉพาะแทนกันได้?

5
อย่าประกาศอินเตอร์เฟสสำหรับวัตถุที่ไม่เปลี่ยนรูป
อย่าประกาศอินเตอร์เฟสสำหรับวัตถุที่ไม่เปลี่ยนรูป [แก้ไข] เมื่อวัตถุที่เป็นปัญหาแสดงถึง Data Transfer Objects (DTOs) หรือ Plain Old Data (PODs) นั่นเป็นแนวทางที่สมเหตุสมผลหรือไม่? ถึงตอนนี้ฉันมักจะสร้างอินเตอร์เฟสสำหรับคลาสที่ปิดผนึกซึ่งไม่เปลี่ยนรูป (ข้อมูลไม่สามารถเปลี่ยนแปลงได้) ฉันพยายามระวังตัวเองว่าจะไม่ใช้อินเทอร์เฟซที่ใดก็ตามที่ฉันสนใจเกี่ยวกับการไม่เปลี่ยนรูป โชคไม่ดีที่อินเทอร์เฟซเริ่มแพร่หลายรหัส (และไม่ใช่เพียงรหัสของฉันที่ฉันกังวล) คุณเลิกใช้งานอินเทอร์เฟซแล้วต้องการส่งไปยังโค้ดที่ต้องการสมมติว่าสิ่งที่ส่งผ่านไปนั้นไม่สามารถเปลี่ยนแปลงได้ เนื่องจากปัญหานี้ฉันจึงพิจารณาไม่ประกาศส่วนต่อประสานสำหรับวัตถุที่ไม่เปลี่ยนรูป สิ่งนี้อาจมีเครือข่ายที่เกี่ยวข้องกับการทดสอบหน่วย แต่นอกเหนือจากนั้นสิ่งนี้ดูเหมือนจะเป็นแนวทางที่สมเหตุสมผลหรือไม่? หรือมีรูปแบบอื่นที่ฉันควรใช้เพื่อหลีกเลี่ยงปัญหา "อินเตอร์เฟซการแพร่กระจาย" ฉันเห็น? (ฉันใช้วัตถุที่ไม่เปลี่ยนรูปแบบเหล่านี้ด้วยเหตุผลหลายประการ: ส่วนใหญ่เพื่อความปลอดภัยของเธรดเนื่องจากฉันเขียนโค้ดแบบมัลติเธรดจำนวนมาก แต่เพราะมันหมายความว่าฉันสามารถหลีกเลี่ยงการทำสำเนาชุดป้องกันวัตถุที่ส่งผ่านไปยังวิธีต่างๆ หลายกรณีเมื่อคุณรู้ว่าบางสิ่งบางอย่างไม่เปลี่ยนรูป - ซึ่งคุณไม่ได้รับถ้าคุณได้ส่งมอบอินเทอร์เฟซที่จริงแล้วบ่อยครั้งที่คุณไม่สามารถทำสำเนาการป้องกันของวัตถุที่อ้างอิงผ่านทางอินเทอร์เฟซ การดำเนินการโคลนหรือวิธีการทำให้เป็นอนุกรมใด ๆ ... ) [แก้ไข] เพื่อให้บริบทมากขึ้นด้วยเหตุผลของฉันที่ต้องการทำให้วัตถุไม่เปลี่ยนรูปให้ดูโพสต์บล็อกนี้จาก Eric Lippert: http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/ ฉันควรชี้ให้เห็นว่าฉันกำลังทำงานกับแนวคิดระดับล่างบางอย่างที่นี่เช่นรายการที่จัดการ / ส่งต่อในคิวงานแบบมัลติเธรด สิ่งเหล่านี้คือ DTO นอกจากนี้โจชัวโบลชแนะนำให้ใช้วัตถุที่ไม่เปลี่ยนรูปในหนังสือของเขาที่มีประสิทธิภาพชวา ติดตาม ขอบคุณสำหรับความคิดเห็นทั้งหมด ฉันตัดสินใจที่จะไปข้างหน้าและใช้แนวทางนี้สำหรับ DTOs …
27 c#  immutability 

8
การใช้ประโยชน์ไม่ได้ในการออกแบบฐานข้อมูล
หนึ่งในรายการในจาวาที่มีประสิทธิภาพของ Joshua Bloch คือความคิดที่ว่าคลาสควรยอมให้มีการเปลี่ยนแปลงอินสแตนซ์น้อยที่สุดเท่าที่จะเป็นไปได้ บ่อยครั้งที่ข้อมูลของวัตถุนั้นยังคงอยู่ในฐานข้อมูลของบางรูปแบบ สิ่งนี้ทำให้ฉันคิดถึงความคิดที่ไม่สามารถเปลี่ยนแปลงได้ภายในฐานข้อมูลโดยเฉพาะอย่างยิ่งสำหรับตารางที่แสดงถึงเอนทิตีเดียวภายในระบบที่ใหญ่กว่า บางสิ่งที่ฉันได้ทำการทดลองเมื่อเร็ว ๆ นี้คือแนวคิดของการพยายามลดการอัปเดตที่ฉันทำกับแถวของตารางที่เป็นตัวแทนวัตถุเหล่านี้และพยายามที่จะทำการแทรกให้มากที่สุดเท่าที่จะทำได้ ตัวอย่างที่ชัดเจนของสิ่งที่ฉันกำลังทดลองใช้เมื่อไม่นานมานี้ หากฉันรู้ว่าฉันอาจต่อท้ายระเบียนด้วยข้อมูลเพิ่มเติมในภายหลังฉันจะสร้างตารางอื่นเพื่อแสดงว่าเรียงลำดับเช่นสองคำจำกัดความของตารางต่อไปนี้: create table myObj (id integer, ...other_data... not null); create table myObjSuppliment (id integer, myObjId integer, ...more_data... not null); หวังว่าจะเห็นได้ชัดว่าชื่อเหล่านี้ไม่ใช่คำต่อคำ แต่เป็นเพียงการสาธิตความคิด นี่เป็นวิธีการที่เหมาะสมในการสร้างแบบจำลองการคงอยู่ของข้อมูลหรือไม่ มันคุ้มค่าหรือไม่ที่จะพยายาม จำกัด การอัปเดตที่ดำเนินการบนโต๊ะโดยเฉพาะอย่างยิ่งสำหรับการกรอกข้อมูลที่เป็นโมฆะสำหรับข้อมูลที่อาจไม่มีอยู่เมื่อสร้างเรกคอร์ด? มีบางครั้งที่วิธีการเช่นนี้อาจทำให้เกิดอาการปวดอย่างรุนแรงในภายหลังหรือไม่?

7
มีวิธีปฏิบัติสำหรับโครงสร้างโหนดที่เชื่อมโยงที่จะไม่เปลี่ยนรูป?
ฉันตัดสินใจเขียนรายการที่ลิงก์เดี่ยว ๆ และมีแผนที่จะทำให้โครงสร้างโหนดเชื่อมโยงภายในไม่เปลี่ยนรูป ฉันวิ่งเข้าไปในอุปสรรค์ ว่าฉันมีโหนดเชื่อมโยงต่อไปนี้ (จากaddการดำเนินการก่อนหน้า): 1 -> 2 -> 3 -> 4 5และบอกว่าผมต้องการที่จะผนวก การทำเช่นนี้ตั้งแต่โหนด4จะไม่เปลี่ยนรูปฉันต้องสร้างสำเนาใหม่ของ4แต่แทนที่ของสนามใหม่ที่มีโหนดnext 5ปัญหาคือตอนนี้3กำลังอ้างอิงเก่า4; 5หนึ่งโดยไม่ต้องต่อท้าย ตอนนี้ฉันต้องการคัดลอก3และแทนที่nextฟิลด์เพื่ออ้างอิง4สำเนา แต่ตอนนี้2กำลังอ้างอิงเก่า3... หรือกล่าวอีกนัยหนึ่งเมื่อต้องการต่อท้ายรายการทั้งหมดจะต้องคัดลอก คำถามของฉัน: ความคิดของฉันถูกต้องหรือไม่ มีวิธีการผนวกโดยไม่คัดลอกโครงสร้างทั้งหมดหรือไม่ เห็นได้ชัดว่า "จาวาที่มีประสิทธิภาพ" มีคำแนะนำ: คลาสควรจะไม่เปลี่ยนรูปเว้นแต่จะมีเหตุผลที่ดีมากที่ทำให้พวกเขาเปลี่ยนแปลงได้ ... นี่เป็นกรณีที่ดีสำหรับการเปลี่ยนแปลงหรือไม่? ฉันไม่คิดว่านี่เป็นคำตอบที่ซ้ำกันเนื่องจากฉันไม่ได้พูดถึงรายการ เห็นได้ชัดว่าจะต้องมีการเปลี่ยนแปลงเพื่อให้สอดคล้องกับอินเทอร์เฟซ (โดยไม่ต้องทำอะไรบางอย่างเช่นการรักษารายการใหม่ภายในและดึงมันออกมาผ่านทะเยอทะยานในความคิดที่สองแม้ว่าแม้จะต้องมีการกลายพันธุ์; ฉันกำลังพูดถึงว่า internals ของรายการจะต้องไม่เปลี่ยนรูป

4
ฉันจะจัดการ setters ในฟิลด์ที่ไม่เปลี่ยนรูปแบบได้อย่างไร
ฉันมีชั้นเรียนสองreadonly intสาขา พวกเขาถูกเปิดเผยเป็นคุณสมบัติ: public class Thing { private readonly int _foo, _bar; /// <summary> I AM IMMUTABLE. </summary> public Thing(int foo, int bar) { _foo = foo; _bar = bar; } public int Foo { get { return _foo; } set { } } public int Bar { get { …

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