วัตถุที่เปลี่ยนไม่ได้กับคอลเลกชันที่ไม่เปลี่ยนรูป
หนึ่งในจุดที่ดีที่สุดในการอภิปรายเกี่ยวกับวัตถุที่เปลี่ยนแปลงไม่ได้และไม่เปลี่ยนรูปคือความเป็นไปได้ของการขยายแนวคิดของการเปลี่ยนแปลงไม่ได้ไปยังคอลเลกชัน วัตถุที่ไม่เปลี่ยนรูปเป็นวัตถุที่มักจะแสดงถึงโครงสร้างตรรกะเดียวของข้อมูล (ตัวอย่างเช่นสตริงที่ไม่เปลี่ยนรูป) เมื่อคุณมีการอ้างอิงถึงวัตถุที่ไม่เปลี่ยนรูปเนื้อหาของวัตถุจะไม่เปลี่ยนแปลง
คอลเลกชันที่ไม่เปลี่ยนรูปคือชุดที่ไม่เคยเปลี่ยนแปลง
เมื่อฉันทำการดำเนินการกับคอลเลกชันที่ไม่แน่นอนฉันจะเปลี่ยนคอลเลกชันและสถานที่ทั้งหมดที่มีการอ้างอิงถึงคอลเลกชันจะเห็นการเปลี่ยนแปลง
เมื่อฉันทำการดำเนินการกับคอลเลกชันที่ไม่เปลี่ยนรูปแบบการอ้างอิงจะถูกส่งกลับไปยังคอลเลกชันใหม่ที่สะท้อนถึงการเปลี่ยนแปลง เอนทิตีทั้งหมดที่มีการอ้างอิงถึงคอลเลกชันรุ่นก่อนหน้าจะไม่เห็นการเปลี่ยนแปลง
การใช้งานที่ชาญฉลาดไม่จำเป็นต้องคัดลอก (โคลน) การรวบรวมทั้งหมดเพื่อให้การเปลี่ยนแปลงไม่ได้ ตัวอย่างที่ง่ายที่สุดคือสแต็กที่นำมาใช้เป็นรายการที่เชื่อมโยงเดี่ยวและการดำเนินการพุช / ป๊อป คุณสามารถนำโหนดทั้งหมดกลับมาใช้ใหม่จากคอลเลกชันก่อนหน้านี้ในคอลเลกชันใหม่โดยเพิ่มเพียงโหนดเดียวสำหรับการพุชและไม่โคลนโหนดสำหรับป๊อปอัพ การดำเนินการ push_tail ในรายการที่เชื่อมโยงเดี่ยวไม่ง่ายหรือมีประสิทธิภาพ
ตัวแปร / การอ้างอิงที่เปลี่ยนแปลงไม่ได้กับ Mutable
ภาษาที่ใช้งานได้บางอย่างใช้แนวคิดของความไม่สามารถเปลี่ยนแปลงได้ที่จะอ้างอิงวัตถุด้วยตัวเองซึ่งอนุญาตให้มีการมอบหมายการอ้างอิงเดียวเท่านั้น
- ใน Erlang สิ่งนี้เป็นจริงสำหรับ "ตัวแปร" ทั้งหมด ฉันสามารถกำหนดวัตถุให้กับการอ้างอิงได้เพียงครั้งเดียว ถ้าฉันจะดำเนินการกับคอลเลกชันฉันจะไม่สามารถมอบหมายคอลเลกชันใหม่ให้กับการอ้างอิงเก่า (ชื่อตัวแปร)
- สกาล่ายังสร้างสิ่งนี้เป็นภาษาที่มีการอ้างอิงทั้งหมดที่ถูกประกาศด้วยvarหรือval , vals เป็นการมอบหมายเพียงครั้งเดียวและส่งเสริมสไตล์การทำงาน แต่ vars ช่วยให้โครงสร้างโปรแกรม C-like หรือ Java-like มากขึ้น
- ต้องการการประกาศ var / val ในขณะที่ภาษาดั้งเดิมหลายภาษาใช้ตัวดัดแปลงเสริมเช่นสุดท้ายใน java และconstใน C
ความง่ายในการพัฒนาเทียบกับประสิทธิภาพ
เกือบทุกครั้งที่เหตุผลในการใช้ออบเจ็กต์ที่ไม่เปลี่ยนรูปคือการโปรโมตการเขียนโปรแกรมฟรีที่มีผลข้างเคียงและการใช้เหตุผลอย่างง่าย ๆ เกี่ยวกับโค้ด คุณไม่ต้องกังวลเกี่ยวกับข้อมูลพื้นฐานที่ถูกเปลี่ยนแปลงโดยเอนทิตีอื่นถ้าวัตถุไม่เปลี่ยนรูป
ข้อเสียเปรียบหลักคือประสิทธิภาพ นี่คือบทความเกี่ยวกับการทดสอบอย่างง่ายที่ฉันทำใน Javaเปรียบเทียบวัตถุที่ไม่เปลี่ยนรูปและไม่แน่นอนในปัญหาของเล่น
ปัญหาด้านประสิทธิภาพเป็นสิ่งที่สงสัยในหลาย ๆ แอปพลิเคชั่น แต่ไม่ใช่ทั้งหมดซึ่งเป็นสาเหตุที่ทำให้แพคเกจตัวเลขจำนวนมากเช่นคลาส Numpy Array ใน Python อนุญาตให้มีการอัปเดต In-Place ของอาร์เรย์ขนาดใหญ่ สิ่งนี้จะมีความสำคัญสำหรับพื้นที่แอปพลิเคชันที่ใช้ประโยชน์จากเมทริกซ์ขนาดใหญ่และการดำเนินการเวกเตอร์ ปัญหาข้อมูลขนาดใหญ่แบบขนานและการคำนวณอย่างเข้มข้นช่วยให้สามารถเร่งความเร็วได้อย่างยอดเยี่ยมด้วยการใช้งานในสถานที่
string
เป็นสิ่งที่เปลี่ยนแปลงไม่ได้อย่างน้อยใน. NET และฉันคิดว่าในภาษาที่ทันสมัยอื่น ๆ อีกมากมายเช่นกัน