บทนำ
ในโลกของการเขียนโปรแกรม เรามักจะพบคำว่า Immutable (เปลี่ยนแปลงค่าไม่ได้) และ Mutable (เปลี่ยนแปลงค่าได้) อยู่เสมอ โดยเฉพาะในการจัดการข้อมูล ตัวแปร หรือโครงสร้างข้อมูล ซึ่งความเข้าใจเรื่องนี้จะช่วยให้เราเขียนโปรแกรมได้อย่างมีประสิทธิภาพและปลอดภัยยิ่งขึ้น
Immutable คืออะไร?
Immutable หมายถึง ค่าของข้อมูลไม่สามารถถูกเปลี่ยนแปลงได้หลังจากที่ถูกกำหนดแล้ว เช่น ค่าตัวแปรที่ถูกกำหนดด้วย const
ใน JavaScript หรือ final
ใน Java
ตัวอย่างใน JavaScript
const name = 'Alice'; name = 'Bob'; // ❌ Error: Assignment to constant variable
ตัวอย่างใน Python
name = "Alice" name[0] = "M" # ❌ Error: 'str' object does not support item assignment
Mutable คืออะไร?
Mutable หมายถึง ค่าของข้อมูลสามารถเปลี่ยนแปลงได้ เช่น การเปลี่ยนแปลงค่าภายใน list หรือ dictionary ใน Python หรือ array ใน JavaScript
ตัวอย่างใน Python
names = ['Alice', 'Bob'] names[1] = 'Eve' # ✅ เปลี่ยนค่าได้ print(names) # ['Alice', 'Eve']
ตัวอย่างใน JavaScript
const arr = ['Alice', 'Bob']; arr[1] = 'Eve'; // ✅ แม้ใช้ const แต่ค่าภายใน array เปลี่ยนได้ console.log(arr); // ['Alice', 'Eve']
ภาษาโปรแกรมกับ Immutable/Mutable
ภาษา | ค่าที่ Immutable | ค่าที่ Mutable |
---|---|---|
JavaScript | String, Number | Array, Object |
Python | String, Tuple, int | List, Dict, Set |
Java | String, Wrapper Classes (Integer, Boolean) | Array, custom objects |
Rust | ค่า default immutable | ต้องใช้ mut keyword |
Go | String | Slices, Maps |
ข้อดีของ Immutable
- ✅ ลดปัญหา side-effect จากการเปลี่ยนค่าโดยไม่ตั้งใจ
- ✅ ทำให้ code thread-safe ง่ายขึ้น
- ✅ เหมาะกับ Functional Programming
ข้อเสียของ Immutable
- 🔁 ต้องสร้าง object ใหม่ทุกครั้งที่ต้องการเปลี่ยนค่า
- 💾 อาจใช้ memory มากขึ้นหากไม่จัดการดี
เมื่อไรควรใช้ Immutable?
- 📦 เมื่อข้อมูลไม่ควรถูกเปลี่ยน เช่น config
- 🚀 ในระบบ concurrent เพื่อเลี่ยง race condition
- 🔄 ในการสร้าง cache ที่ไม่เปลี่ยนแปลง
เมื่อไรควรใช้ Mutable?
- 🧮 ในกรณีข้อมูลเปลี่ยนแปลงบ่อย เช่น list ของ cart
- ⚡ เพื่อประหยัด memory และ performance
เทคนิคการจัดการ Immutable อย่างมีประสิทธิภาพ
- ใช้ library ช่วย เช่น
immer.js
สำหรับ JavaScript - ใช้
copy-on-write
แทนการ clone ทั้ง object
import produce from 'immer'; const nextState = produce(state, draft => { draft.user.name = 'NewName'; });
สรุป
ความเข้าใจเรื่อง Immutable vs Mutable คือพื้นฐานที่สำคัญในการออกแบบซอฟต์แวร์ที่ปลอดภัย มีประสิทธิภาพ และง่ายต่อการดูแล หากคุณใช้มันอย่างถูกต้อง จะช่วยลด bug และเพิ่มความน่าเชื่อถือของระบบได้อย่างมาก ✨
บทความนี้ใช้เวลาอ่าน 10 – 15 นาที เขียนโดยทีมงาน poolsawat.com