ประเภทที่ไม่เปลี่ยนรูปแบบโดยทั่วไปที่สร้างขึ้นในภาษาที่ไม่ได้หมุนรอบรูปแบบที่ไม่เปลี่ยนรูปแบบจะมีแนวโน้มที่จะใช้เวลาในการพัฒนามากขึ้นในการสร้างและอาจใช้หากพวกเขาต้องการวัตถุประเภท "ผู้สร้าง" เพื่อแสดงการเปลี่ยนแปลงที่ต้องการ งานจะมีมากขึ้น แต่มีค่าใช้จ่ายล่วงหน้าในกรณีเหล่านี้) นอกจากนี้ไม่ว่าภาษานั้นจะสร้างประเภทที่ไม่เปลี่ยนรูปแบบได้ง่ายหรือไม่ก็ตาม แต่ก็มักจะต้องการการประมวลผลและค่าใช้จ่ายด้านความจำสำหรับประเภทข้อมูลที่ไม่สำคัญ
ทำให้ฟังก์ชั่นไร้ผลข้างเคียง
หากคุณกำลังทำงานในภาษาที่ไม่เกี่ยวข้องกับความไม่สามารถเปลี่ยนแปลงได้ฉันคิดว่าวิธีการปฏิบัติไม่สามารถหาทางทำให้ข้อมูลทุกชนิดไม่เปลี่ยนรูปได้ ความคิดสร้างสรรค์ที่มีศักยภาพมากกว่าซึ่งให้ประโยชน์หลายประการแก่คุณคือการมุ่งเน้นการเพิ่มจำนวนฟังก์ชั่นในระบบของคุณให้มากที่สุดซึ่งทำให้เกิดผลข้างเคียงที่ไม่เป็นศูนย์
ตัวอย่างง่ายๆหากคุณมีฟังก์ชั่นที่ทำให้เกิดผลข้างเคียงเช่นนี้:
// Make 'x' the absolute value of itself.
void make_abs(int& x);
จากนั้นเราไม่ต้องการชนิดข้อมูลจำนวนเต็มที่ไม่เปลี่ยนรูปซึ่งห้ามผู้ประกอบการเช่นการกำหนดค่าเริ่มต้นเพื่อให้ฟังก์ชันนั้นหลีกเลี่ยงผลข้างเคียง เราสามารถทำสิ่งนี้ได้ง่ายๆ:
// Returns the absolute value of 'x'.
int abs(int x);
ตอนนี้ฟังก์ชั่นไม่ยุ่งx
หรืออะไรก็ตามที่อยู่นอกขอบเขตของมันและในกรณีเล็ก ๆ น้อย ๆ นี้เราอาจจะได้โกนรอบบางอย่างโดยหลีกเลี่ยงค่าใช้จ่ายที่เกี่ยวข้องกับการอ้อม / นามแฝง อย่างน้อยรุ่นที่สองไม่ควรมีราคาแพงกว่ารุ่นแรก
สิ่งที่มีราคาแพงเพื่อคัดลอกเต็ม
แน่นอนว่ากรณีส่วนใหญ่นั้นไม่สำคัญหากเราต้องการหลีกเลี่ยงการทำฟังก์ชั่นที่ทำให้เกิดผลข้างเคียง กรณีการใช้งานจริงที่ซับซ้อนอาจมีลักษณะเช่นนี้มากขึ้น:
// Transforms the vertices of the specified mesh by
// the specified transformation matrix.
void transform(Mesh& mesh, Matrix4f matrix);
ณ จุดนี้เมชอาจต้องใช้หน่วยความจำสองร้อยเมกะไบต์ที่มีรูปหลายเหลี่ยมหลายแสนอันจุดยอดและขอบแผนที่พื้นผิวหลาย ๆ อันเป้าหมายการแปรเปลี่ยน ฯลฯ ฯลฯ มันมีราคาแพงมากที่จะคัดลอกทั้งตาข่ายนั้นเพื่อทำสิ่งนี้transform
ฟังก์ชั่นไม่มีผลข้างเคียงเช่น:
// Returns a new version of the mesh whose vertices been
// transformed by the specified transformation matrix.
Mesh transform(Mesh mesh, Matrix4f matrix);
และในกรณีเหล่านี้ที่การคัดลอกบางสิ่งบางอย่างตามปกติจะเป็นค่าโสหุ้ยที่ฉันพบว่ามีประโยชน์ในการเปลี่ยนMesh
เป็นโครงสร้างข้อมูลแบบถาวรและประเภทที่ไม่เปลี่ยนรูปแบบด้วยตัวสร้าง "แบบแอนะล็อก" เพื่อสร้างเวอร์ชันที่ปรับเปลี่ยนแล้ว สามารถคัดลอกและนับจำนวนชิ้นส่วนตื้น ๆ ที่ไม่ซ้ำใครได้ง่ายๆ ทุกอย่างมุ่งเน้นที่ความสามารถในการเขียนฟังก์ชั่นตาข่ายที่ปราศจากผลข้างเคียง
โครงสร้างข้อมูลถาวร
และในกรณีเหล่านี้ที่การทำสำเนาทุกอย่างมีราคาแพงอย่างไม่น่าเชื่อฉันพบว่าความพยายามในการออกแบบสิ่งที่ไม่เปลี่ยนรูปได้Mesh
จริง ๆ แม้ว่ามันจะมีราคาสูงชันเล็กน้อยเพราะมันไม่ได้ทำให้ความปลอดภัยของด้ายง่ายขึ้น นอกจากนี้ยังทำให้การแก้ไขแบบไม่ทำลาย (ทำให้ผู้ใช้งานเลเยอร์ mesh โดยไม่ต้องแก้ไขสำเนาต้นฉบับ), ระบบเลิกทำ (ตอนนี้ระบบยกเลิกสามารถเก็บสำเนาตาข่ายที่ไม่เปลี่ยนรูปได้ก่อนการเปลี่ยนแปลงโดยการดำเนินการโดยไม่ต้องเพิ่มหน่วยความจำ การใช้งาน) และข้อยกเว้นด้านความปลอดภัย (ตอนนี้หากมีข้อยกเว้นเกิดขึ้นในฟังก์ชั่นด้านบนฟังก์ชั่นไม่จำเป็นต้องย้อนกลับและยกเลิกผลข้างเคียงทั้งหมดเนื่องจากไม่ได้ทำให้เกิดการเริ่มต้นด้วย)
ฉันสามารถพูดได้อย่างมั่นใจในกรณีเหล่านี้ว่าเวลาที่ใช้ในการทำให้โครงสร้างข้อมูลขนาดใหญ่เหล่านี้ไม่สามารถเปลี่ยนแปลงได้ช่วยประหยัดเวลาได้มากกว่าค่าใช้จ่ายเนื่องจากฉันได้เปรียบเทียบค่าใช้จ่ายในการบำรุงรักษาของการออกแบบใหม่เหล่านี้กับแบบเดิม ๆ และการออกแบบที่ไม่แน่นอนในอดีตใช้เวลานานกว่าและมีแนวโน้มที่จะเกิดข้อผิดพลาดของมนุษย์โดยเฉพาะอย่างยิ่งในพื้นที่ที่ดึงดูดให้นักพัฒนาละเลยในช่วงเวลาวิกฤติเช่นความปลอดภัยยกเว้น
ดังนั้นฉันคิดว่าประเภทข้อมูลที่เปลี่ยนแปลงไม่ได้จริงๆจ่ายในกรณีเหล่านี้ แต่ไม่ใช่ทุกสิ่งที่จะต้องทำให้ไม่เปลี่ยนรูปแบบเพื่อให้ฟังก์ชั่นส่วนใหญ่ในระบบของคุณปราศจากผลข้างเคียง หลายสิ่งหลายอย่างมีราคาถูกพอที่จะทำสำเนาได้อย่างสมบูรณ์ แอปพลิเคชันในโลกแห่งความเป็นจริงจำนวนมากจะต้องทำให้เกิดผลข้างเคียงบางอย่างที่นี่และที่นั่น (อย่างน้อยที่สุดเช่นการบันทึกไฟล์) แต่โดยทั่วไปแล้วจะมีฟังก์ชั่นอื่น ๆ อีกมากมายซึ่งอาจปราศจากผลข้างเคียง
จุดของการมีชนิดข้อมูลที่ไม่เปลี่ยนแปลงให้ฉันคือเพื่อให้แน่ใจว่าเราสามารถเขียนจำนวนสูงสุดของฟังก์ชั่นให้เป็นอิสระจากผลข้างเคียงโดยไม่มีค่าใช้จ่ายมหากาพย์เกิดขึ้นในรูปแบบของการคัดลอกโครงสร้างข้อมูลขนาดใหญ่ด้านซ้ายและขวา ของพวกเขาจะต้องมีการแก้ไข การมีโครงสร้างข้อมูลถาวรในกรณีเหล่านั้นจึงกลายเป็นรายละเอียดการปรับให้เหมาะสมเพื่อให้เราสามารถเขียนฟังก์ชันของเราให้ปราศจากผลข้างเคียงโดยไม่ต้องเสียค่าใช้จ่ายมหาศาลในการทำเช่นนั้น
ค่าโสหุ้ยไม่เปลี่ยนรูป
ตอนนี้แนวคิดรุ่นที่ไม่แน่นอนจะมีขอบในประสิทธิภาพ มีค่าใช้จ่ายในการคำนวณที่เกี่ยวข้องกับโครงสร้างข้อมูลที่เปลี่ยนแปลงไม่ได้เสมอ แต่ฉันพบว่าเป็นการแลกเปลี่ยนที่คุ้มค่าในกรณีที่ฉันอธิบายไว้ข้างต้นและคุณสามารถมุ่งเน้นไปที่การทำให้ค่าโสหุ้ยน้อยที่สุดในธรรมชาติพอเพียง ฉันชอบวิธีการแบบนี้ที่ความถูกต้องง่ายขึ้นและการเพิ่มประสิทธิภาพกลายเป็นเรื่องยากมากกว่าการปรับให้ง่ายขึ้น แต่ความถูกต้องจะยากขึ้น มันแทบจะไม่เป็นการลดทอนความรู้สึกที่จะมีรหัสที่ทำงานได้อย่างสมบูรณ์ถูกต้องเมื่อต้องการปรับแต่งมากกว่ารหัสที่ไม่ทำงานอย่างถูกต้องตั้งแต่แรกไม่ว่าจะได้ผลลัพธ์ที่ไม่ถูกต้องรวดเร็วเพียงใด