Immutability là gì?

Noun Programming
Tính bất biến

Trong lập trình hàm (functional programming), tính bất biến (immutability) có nghĩa là thay vì sửa đổi giá trị các biến, chúng ta tạo ra các biến mới.

Noun Programming
Bất biến

Từ bất biến (immutability) có nguồn gốc từ tiếng Latinh và có nghĩa là "không thể thay đổi". Từ đồng nghĩa chính thức của nó là "changeless" và khi áp dụng vào lập trình máy tính, ý tưởng này cũng khá giống nhau.

Nhiều nhà phát triển (developer) liên kết tính bất biến (immutability) với việc không thể thay đổi bất cứ điều gì.


var cat = "Tibbers";
cat = "Tibbles";

Ví dụ trên trong ngôn ngữ Javascript được coi là vi phạm tính bất biến (immutability) mặc dù giá trị nó không thay đổi. Các nhà phát triển thường bối rối vì nếu tính bất biến tương đương với "không thay đổi mọi thứ", thì tại sao không chỉ sử dụng const?

Khi nói đến lập trình hướng đối tượng (object-oriented programming) và lập trình hàm (functional programming), khái niệm bất biến (immutability) được áp dụng ở cấp đối tượng (object).

Nó liên quan đến trạng thái (state) và cách bạn không được phép sửa đổi sau khi nó được tạo. Mỗi ngôn ngữ đều có hệ thống quản lý trạng thái riêng và trước khi đi xa hơn, chúng ta cần hiểu chính xác trạng thái là gì.

Trong lâp trình hướng đối tượng, một trạng thái có hai phần là thuộc tính (property) và giá trị. Các thuộc tính nói chung là tĩnh, có nghĩa là chúng không thay đổi. Tuy nhiên, các giá trị được mong đợi là động (dynamic) và do đó có thể thay đổi. Điều này có nghĩa là khi các thuộc tính được thêm vào hoặc loại bỏ trạng thái của đối tượng sẽ thay đổi. Và khi loại thay đổi này có thể xảy ra, đối tượng được coi là có thể thay đổi (mutable).

Sự nhầm lẫn với tính bất biến (immutability) thường bắt đầu xung quanh đây. Điều này là do có các cấp độ khác nhau. Có những ứng dụng ở cấp độ biến (variable), ở đó const được sử dụng.

Trong ngôn ngữ Javascript, mặc dù có thể gán lại các biến và giá trị được khai báo bằng let hoặc var, nhưng bạn sẽ bắt đầu gặp sự cố khi thử điều đó với const. Giả sử chúng ta gán giá trị Kingsley cho một biến được gọi là firstName:


let firstName = "Kingsley";

Chúng ta có thể gán lại (reassign) một giá trị mới cho cùng một biến,


firstName = "John";

Điều này là có thể bởi vì chúng ta đã sử dụng let. Nếu chúng ta sử dụng const thay thế như thế này:

const lastName = "Silas";

… Chúng ta sẽ gặp lỗi khi cố gắng gán nó cho một giá trị mới;


lastName = "Doe"
// TypeError: Assignment to constant variable.

Learning English Everyday