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

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

7
คอลเลกชันที่ไม่เปลี่ยนรูปไม่ได้ vs
จากภาพรวม Collections Framework : คอลเลกชันที่ไม่สนับสนุนการดำเนินการปรับเปลี่ยน (เช่นadd, removeและclear) จะเรียกว่าunmodifiable คอลเลกชันที่ไม่ unmodifiable มีความสามารถปรับเปลี่ยนได้ คอลเลกชันที่ยังรับประกันได้ว่าการเปลี่ยนแปลงในไม่มีCollectionวัตถุที่จะมองเห็นได้จะเรียกว่าไม่เปลี่ยนรูป คอลเลกชันที่ไม่ได้เปลี่ยนรูปเป็นไม่แน่นอน ฉันไม่เข้าใจความแตกต่าง ความแตกต่างระหว่างunmodifiableและไม่เปลี่ยนรูปที่นี่คืออะไร

13
จะหลีกเลี่ยงปัญหา“ พารามิเตอร์มากเกินไป” ในการออกแบบ API ได้อย่างไร
ฉันมีฟังก์ชั่น API นี้: public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d, string e, string f, out Guid code) ฉันไม่ชอบมัน เนื่องจากลำดับพารามิเตอร์มีความสำคัญเกินความจำเป็น การเพิ่มฟิลด์ใหม่กลายเป็นเรื่องยาก มันยากที่จะเห็นสิ่งที่ถูกส่งผ่าน มันยากกว่าที่จะ refactor method เป็นชิ้นส่วนเล็ก ๆ เพราะมันจะสร้างโอเวอร์เฮดอีกครั้งในการส่งผ่านพารามิเตอร์ทั้งหมดในฟังก์ชั่นย่อย รหัสอ่านยากกว่า ฉันคิดขึ้นมาด้วยความคิดที่ชัดเจนที่สุด: ให้อ็อบเจกต์ห่อหุ้มข้อมูลแล้วส่งไปรอบ ๆ แทนที่จะส่งแต่ละพารามิเตอร์ทีละหนึ่ง นี่คือสิ่งที่ฉันมาด้วย: public class DoSomeActionParameters { public string A; public string B; public DateTime C; public …

14
อาร์เรย์ไม่เปลี่ยนรูปใน Java
มีทางเลือกที่ไม่เปลี่ยนรูปแบบไปยังอาร์เรย์ดั้งเดิมใน Java หรือไม่? การสร้างอาร์เรย์แบบดั้งเดิมfinalนั้นไม่ได้ขัดขวางการทำสิ่งที่ต้องการ final int[] array = new int[] {0, 1, 2, 3}; array[0] = 42; ฉันต้องการให้องค์ประกอบของอาร์เรย์ไม่สามารถเปลี่ยนแปลงได้

14
"dict ที่แช่แข็ง" จะเป็นอย่างไร?
ชุดที่แช่แข็งเป็น frozenet รายการแช่แข็งอาจเป็น tuple คำสั่งแช่แข็งจะเป็นอย่างไร? dict ที่เปลี่ยนแปลงไม่ได้ hashable ฉันคิดว่ามันอาจจะเป็นอะไรที่คล้ายcollections.namedtupleๆ กัน แต่นั่นก็เหมือนทict-แช่แข็งคีย์ (dict แบบครึ่งแข็ง) ไม่ใช่เหรอ A "frozendict" ควรพจนานุกรมแช่แข็งมันควรจะมีkeys, values, getฯลฯ และการสนับสนุนin, forฯลฯ อัปเดต: * มีอยู่: https://www.python.org/dev/peps/pep-0603

8
ข้อผิดพลาด:“ ไม่สามารถแก้ไขค่าที่ส่งคืนได้” c #
ฉันใช้คุณสมบัติที่ใช้งานอัตโนมัติ ฉันเดาวิธีที่เร็วที่สุดในการแก้ไขปัญหาต่อไปนี้คือการประกาศตัวแปรสำรองของฉันเอง public Point Origin { get; set; } Origin.X = 10; // fails with CS1612 ข้อความแสดงข้อผิดพลาด: ไม่สามารถแก้ไขค่าที่ส่งคืนของ 'expression' ได้เนื่องจากไม่ใช่ตัวแปร มีความพยายามในการแก้ไขชนิดของค่าที่เป็นผลลัพธ์ของนิพจน์กลาง เนื่องจากค่าไม่คงอยู่ค่าจะไม่เปลี่ยนแปลง เมื่อต้องการแก้ไขข้อผิดพลาดนี้ให้เก็บผลลัพธ์ของนิพจน์ในค่าระดับกลางหรือใช้ประเภทการอ้างอิงสำหรับนิพจน์กลาง

14
Enums ใน Javascript กับ ES6
ฉันกำลังสร้างโปรเจ็กต์ Java เก่าใน Javascript และตระหนักว่าไม่มีวิธีที่ดีในการทำ enums ใน JS สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือ: const Colors = { RED: Symbol("red"), BLUE: Symbol("blue"), GREEN: Symbol("green") }; Object.freeze(Colors); การconstเก็บรักษาไม่ให้Colorsถูกกำหนดใหม่และการแช่แข็งจะป้องกันไม่ให้คีย์และค่ากลายพันธุ์ ฉันใช้ Symbols Colors.REDไม่เท่ากับ0หรืออย่างอื่นนอกจากตัวมันเอง สูตรนี้มีปัญหาหรือไม่? มีวิธีที่ดีกว่า? (ฉันรู้ว่าคำถามนี้ค่อนข้างซ้ำ แต่Q / As ก่อนหน้านี้ทั้งหมดค่อนข้างเก่าและ ES6 ทำให้เรามีความสามารถใหม่ ๆ ) แก้ไข: อีกวิธีหนึ่งที่เกี่ยวข้องกับปัญหาการทำให้เป็นอนุกรม แต่ฉันเชื่อว่ายังมีปัญหาเรื่องขอบเขต const enumValue = (name) => Object.freeze({toString: () => name}); const Colors …

15
ลบคุณสมบัติในวัตถุที่ไม่เปลี่ยนแปลง
ฉันใช้ Redux ในตัวลดของฉันฉันกำลังพยายามลบคุณสมบัติออกจากวัตถุเช่นนี้: const state = { a: '1', b: '2', c: { x: '42', y: '43' }, } และฉันต้องการมีบางอย่างเช่นนี้โดยไม่ต้องเปลี่ยนสถานะเดิม: const newState = { a: '1', b: '2', c: { x: '42', }, } ฉันเหนื่อย: let newState = Object.assign({}, state); delete newState.c.y แต่ด้วยเหตุผลบางอย่างมันจะลบคุณสมบัติจากทั้งสองรัฐ ช่วยฉันทำอย่างนั้นได้ไหม

8
ข้อดีของการเขียนโปรแกรมไร้สัญชาติ?
เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้เกี่ยวกับการเขียนโปรแกรมเชิงฟังก์ชัน (โดยเฉพาะ Haskell แต่ฉันได้อ่านบทเรียนเกี่ยวกับ Lisp และ Erlang แล้วด้วย) ในขณะที่ฉันพบว่าแนวคิดนี้ให้ความกระจ่างมาก แต่ฉันก็ยังไม่เห็นด้านที่เป็นประโยชน์ของแนวคิด "ไม่มีผลข้างเคียง" ข้อดีของมันคืออะไร? ฉันพยายามคิดในแนวความคิดที่ใช้งานได้ แต่มีบางสถานการณ์ที่ดูซับซ้อนเกินไปโดยไม่สามารถบันทึกสถานะได้ด้วยวิธีง่ายๆ (ฉันไม่คิดว่า monads ของ Haskell 'ง่าย') การเรียนรู้ Haskell (หรือภาษาอื่นที่ใช้งานได้หมดจด) ในเชิงลึกจะคุ้มค่าหรือไม่? การเขียนโปรแกรมแบบใช้งานได้หรือไร้สัญชาติมีประสิทธิผลมากกว่าขั้นตอนหรือไม่? เป็นไปได้ไหมที่ฉันจะใช้ Haskell หรือภาษาอื่นที่ใช้งานได้ในภายหลังหรือฉันควรเรียนรู้เพื่อความเข้าใจเท่านั้น ฉันสนใจประสิทธิภาพน้อยกว่าประสิทธิภาพการทำงาน ดังนั้นฉันจึงถามเป็นหลักว่าฉันจะทำงานได้ดีกว่าในภาษาที่ใช้งานได้ดีกว่าขั้นตอน / เชิงวัตถุ / อะไรก็ตาม

7
Swift make method พารามิเตอร์ไม่แน่นอน?
ฉันจะจัดการกับข้อผิดพลาดนี้โดยไม่ต้องสร้างตัวแปรเพิ่มเติมได้อย่างไร func reduceToZero(x:Int) -> Int { while (x != 0) { x = x-1 // ERROR: cannot assign to 'let' value 'x' } return x } ฉันไม่ต้องการสร้างตัวแปรเพิ่มเติมเพื่อเก็บค่าของ x เป็นไปได้ไหมที่จะทำในสิ่งที่ฉันต้องการ?

10
วิธีที่ถูกต้องในการผลักดันเข้าสู่สถานะอาร์เรย์
ดูเหมือนว่าฉันจะมีปัญหาในการส่งข้อมูลไปยังอาร์เรย์สถานะ ฉันพยายามบรรลุด้วยวิธีนี้: this.setState({ myArray: this.state.myArray.push('new value') }) แต่ฉันเชื่อว่านี่เป็นวิธีที่ไม่ถูกต้องและทำให้เกิดปัญหาเกี่ยวกับความไม่แน่นอน?

13
เหตุใด C # จึงไม่อนุญาตให้ใช้ตัวแปรโลคัลแบบอ่านอย่างเดียว
มีการถกเถียงอย่างเป็นกันเองกับเพื่อนร่วมงานเกี่ยวกับเรื่องนี้ เรามีความคิดบางอย่างเกี่ยวกับเรื่องนี้ แต่สงสัยว่ากลุ่ม SO คิดอย่างไรกับเรื่องนี้?

6
คอลเลกชัน Java ไม่เปลี่ยนรูป
จากเอกสารJava 1.6 Collection Framework : คอลเลกชันที่ไม่สนับสนุนการดำเนินการปรับเปลี่ยนใด ๆ (เช่นadd, removeและclear) จะเรียกว่าunmodifiable [ ... ] คอลเลกชันที่ยังรับประกันว่าการเปลี่ยนแปลงในวัตถุเก็บไม่เคยจะมองเห็นได้จะเรียกว่าไม่เปลี่ยนรูป เกณฑ์ที่สองทำให้ฉันสับสนเล็กน้อย เนื่องจากคอลเล็กชันแรกไม่สามารถแก้ไขได้และสมมติว่าการอ้างอิงคอลเลกชันดั้งเดิมถูกกำจัดออกไปการเปลี่ยนแปลงที่อ้างถึงในบรรทัดที่สองคืออะไร? มันหมายถึงการเปลี่ยนแปลงขององค์ประกอบที่อยู่ในคอลเลกชันเช่นสถานะขององค์ประกอบหรือไม่? คำถามที่สอง: เพื่อให้คอลเลกชันไม่เปลี่ยนรูปจะต้องดำเนินการอย่างไรในการจัดหาผู้รับประกันเพิ่มเติมที่ระบุไว้ หากสถานะขององค์ประกอบในคอลเล็กชันถูกอัพเดตโดยเธรดจะเพียงพอสำหรับความไม่เปลี่ยนรูปหรือไม่ที่การอัปเดตเหล่านั้นในสถานะจะไม่ปรากฏบนเธรดที่มีคอลเล็กชันที่ไม่เปลี่ยนรูป เพื่อให้คอลเลกชันไม่เปลี่ยนรูปจะมีวิธีการอย่างไรในการให้การค้ำประกันเพิ่มเติมที่ระบุไว้?

6
ฉันจะสร้างคลาสที่ไม่เปลี่ยนรูปได้อย่างไร
ฉันกำลังสร้างคลาสที่ไม่เปลี่ยนรูป ฉันได้ทำเครื่องหมายคุณสมบัติทั้งหมดเป็นแบบอ่านอย่างเดียว ฉันมีรายการสิ่งของในชั้นเรียน แม้ว่าคุณสมบัติเป็นแบบอ่านอย่างเดียวรายการก็สามารถแก้ไขได้ การเปิดเผยรายการ IE ที่ไม่สามารถเปลี่ยนแปลงได้ทำให้ไม่เปลี่ยนรูป ฉันอยากรู้ว่ากฎพื้นฐานที่ต้องปฏิบัติตามเพื่อให้คลาสไม่เปลี่ยนรูปคืออะไร?
113 c#  .net  immutability 

22
สตริง Python ไม่เปลี่ยนรูปหรือไม่? แล้วทำไม a +“” + b ถึงใช้งานได้?
ความเข้าใจของฉันคือสตริง Python ไม่เปลี่ยนรูป ฉันลองใช้รหัสต่อไปนี้: a = "Dog" b = "eats" c = "treats" print a, b, c # Dog eats treats print a + " " + b + " " + c # Dog eats treats print a # Dog a = a + " " + b + …

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

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