โปรดทราบว่าสิ่งนี้มีคุณสมบัติเหมาะสมสำหรับคุณหรือไม่ แต่ในภาษาที่ใช้งานได้เช่น Standard ML ทุกอย่างจะไม่เปลี่ยนรูปโดยค่าเริ่มต้น การกลายพันธุ์ได้รับการสนับสนุนผ่านref
ประเภทการรับรู้ทั่วไป ดังนั้นint
ตัวแปรจึงไม่เปลี่ยนรูปและref int
ตัวแปรจึงเป็นคอนเทนเนอร์ที่ไม่แน่นอนสำหรับint
s โดยพื้นฐานแล้วตัวแปรคือตัวแปรจริงในความหมายทางคณิตศาสตร์ (ค่าที่ไม่รู้จัก แต่คงที่) และref
s คือ "ตัวแปร" ในแง่การเขียนโปรแกรมที่จำเป็น - เซลล์หน่วยความจำที่สามารถเขียนและอ่านได้ (ฉันชอบเรียกพวกเขาว่ามอบหมายได้)
ฉันคิดว่าปัญหาที่เกิดขึ้นกับconst
สองเท่า อันดับแรก C ++ ขาดการรวบรวมขยะซึ่งจำเป็นต้องมีโครงสร้างข้อมูลถาวรที่ไม่สำคัญ const
ต้องลึกซึ้งเพื่อให้ความรู้สึกใด ๆ แต่การมีค่าที่ไม่เปลี่ยนรูปแบบใน C ++ นั้นไม่สามารถทำได้
ประการที่สองใน C ++ คุณต้องเลือกที่จะไม่เข้าconst
ร่วม แต่เมื่อคุณลืมconst
บางสิ่งบางอย่างและแก้ไขในภายหลังคุณจะสิ้นสุดในสถานการณ์ "พิษพิษ" ที่ระบุไว้ในคำตอบของ @ RobY ซึ่งการconst
เปลี่ยนแปลงจะเรียงซ้อนกันตลอดรหัส หากconst
เป็นค่าเริ่มต้นคุณจะไม่พบว่าตัวเองใช้const
ย้อนหลัง นอกจากนี้การเพิ่มconst
ทุกที่เพิ่มเสียงรบกวนในรหัส
ฉันสงสัยว่าภาษากระแสหลักที่ตามมา (เช่น Java) ถูกหล่อหลอมอย่างหนักด้วยความสำเร็จของ C และ C ++ และวิธีคิด ตรงประเด็นแม้จะมีการรวบรวมขยะ API การรวบรวมภาษาส่วนใหญ่จะมีโครงสร้างข้อมูลที่ไม่แน่นอน ความจริงที่ว่าทุกสิ่งทุกอย่างไม่แน่นอนและไม่สามารถเปลี่ยนแปลงได้นั้นถูกมองว่าเป็นเรื่องมุมที่พูดถึงปริมาณความคิดที่จำเป็นหลังภาษายอดนิยม
แก้ไข : หลังจากสะท้อนความคิดเห็นของ greenoldmanฉันตระหนักว่าconst
ไม่เกี่ยวกับการเปลี่ยนแปลงของข้อมูลโดยตรง const
เข้ารหัสเป็นประเภทของวิธีการว่ามีผลข้างเคียงกับอินสแตนซ์หรือไม่
เป็นไปได้ที่จะใช้การกลายพันธุ์เพื่อให้เกิดพฤติกรรมที่โปร่งใสในการอ้างอิง สมมติว่าคุณมีฟังก์ชั่นที่เรียกว่าเมื่อต่อเนื่องส่งกลับค่าที่แตกต่าง - stdin
ตัวอย่างเช่นฟังก์ชั่นที่อ่านตัวอักษรตัวเดียวจาก เราสามารถใช้แคช / บันทึกผลลัพธ์ของฟังก์ชันนี้เพื่อสร้างค่าอ้างอิงที่โปร่งใส สตรีมจะเป็นรายการที่ลิงก์ซึ่งโหนดจะเรียกใช้ฟังก์ชันในครั้งแรกที่คุณพยายามดึงค่าของพวกเขา แต่จากนั้นแคชผลลัพธ์ ดังนั้นหากstdin
constains Hello, world!
เป็นครั้งแรกที่คุณพยายามที่จะเรียกคืนค่าของโหนดแรกก็จะอ่านหนึ่งและผลตอบแทนchar
H
หลังจากนั้นก็จะยังคงกลับมาโดยไม่ต้องโทรต่อการอ่านH
char
ในทำนองเดียวกันโหนดที่สองจะอ่านchar
จากstdin
ครั้งแรกที่คุณพยายามดึงค่ามาครั้งนี้กลับมาe
และแคชผลลัพธ์
สิ่งที่น่าสนใจที่นี่คือคุณได้เปลี่ยนกระบวนการที่บอกสถานะโดยเนื้อแท้เป็นวัตถุที่ดูเหมือนไร้สัญชาติ แต่มันเป็นสิ่งจำเป็นที่จะกลายพันธุ์รัฐภายในของวัตถุ (โดยแคชผล) เพื่อให้บรรลุนี้ - กลายพันธุ์เป็นผลเป็นพิษเป็นภัย มันเป็นไปไม่ได้ที่จะทำให้เราCharStream
const
แม้ว่ากระแสจะทำตัวเหมือนค่าที่ไม่เปลี่ยนรูป ตอนนี้คิดว่ามีความเป็นStream
อินเตอร์เฟซกับวิธีการและฟังก์ชั่นทั้งหมดของคุณคาดหวังconst
const Streams
คุณCharStream
ไม่สามารถใช้อินเทอร์เฟซได้!
( แก้ไข 2:เห็นได้ชัดว่ามีคำหลัก C ++ ที่เรียกmutable
ว่าจะทำให้เราโกงและทำCharStream
const
อย่างไรก็ตามช่องโหว่นี้ทำลายconst
การค้ำประกัน - ตอนนี้คุณไม่แน่ใจจริงๆว่าบางสิ่งจะไม่กลายพันธุ์ด้วยconst
วิธีการของฉันฉันคิดว่าไม่ใช่ ไม่ดีเนื่องจากคุณต้องขอช่องโหว่อย่างชัดเจน แต่คุณยังต้องพึ่งพาระบบการให้เกียรติอย่างสมบูรณ์)
ประการที่สองสมมติว่าคุณมีฟังก์ชั่นระดับสูง - นั่นคือคุณสามารถส่งผ่านฟังก์ชั่นเป็นอาร์กิวเมนต์ไปยังฟังก์ชั่นอื่น ๆ const
ness เป็นส่วนหนึ่งของลายเซ็นของฟังก์ชันดังนั้นคุณจะไม่สามารถส่งผ่านconst
ฟังก์ชันที่ไม่เป็นอาร์กิวเมนต์ไปยังฟังก์ชันที่คาดหวังconst
ฟังก์ชันได้ การบังคับใช้const
ที่นี่แบบสุ่มสี่สุ่มห้าจะนำไปสู่การสูญเสียความเห็นแก่ตัว
ในที่สุดการจัดการconst
วัตถุไม่ได้รับประกันว่ามันจะไม่ทำให้เกิดการเปลี่ยนแปลงสถานะภายนอก (คงที่หรือทั่วโลก) ที่อยู่ด้านหลังของคุณดังนั้นconst
การรับประกันจึงไม่แข็งแรงเท่าที่ปรากฏในตอนแรก
มันไม่ชัดเจนสำหรับฉันว่าการเข้ารหัสว่ามีหรือไม่มีผลข้างเคียงในระบบประเภทนั้นเป็นสิ่งที่ดีในระดับสากล