Bạn có trạng thái khi bạn liên kết các giá trị (số, chuỗi, cấu trúc dữ liệu phức tạp) với một danh tính và một thời điểm.
Ví dụ, số 10 tự nó không đại diện cho bất kỳ trạng thái nào: nó chỉ là một số được xác định rõ và sẽ luôn là chính nó: số tự nhiên 10. Như một ví dụ khác, chuỗi "HELLO" là một chuỗi gồm năm ký tự và nó được mô tả hoàn toàn bởi các ký tự mà nó chứa và trình tự xuất hiện. Trong năm triệu năm nữa, chuỗi "HELLO" vẫn sẽ là chuỗi "HELLO": một giá trị thuần túy.
Để có trạng thái, bạn phải xem xét một thế giới trong đó các giá trị thuần túy này được liên kết với một số loại thực thể có bản sắc . Danh tính là một ý tưởng nguyên thủy: nó có nghĩa là bạn có thể phân biệt hai thứ bất kể thuộc tính nào khác mà chúng có thể có. Ví dụ: hai chiếc xe cùng mẫu, cùng màu, ... là hai chiếc xe khác nhau.
Với những điều này với danh tính, bạn có thể đính kèm các thuộc tính cho chúng, được mô tả bằng các giá trị thuần túy. Ví dụ, xe của tôi có tài sản là màu xanh. Bạn có thể mô tả sự thật này bằng cách liên kết các cặp
("colour", "blue")
đến xe của tôi Cặp ("màu", "màu xanh") là một giá trị thuần túy mô tả trạng thái của chiếc xe cụ thể đó.
Nhà nước không chỉ liên quan đến một thực thể cụ thể, mà còn liên quan đến một thời điểm cụ thể. Vì vậy, bạn có thể nói rằng hôm nay, xe của tôi có trạng thái
("colour", "blue")
Ngày mai tôi sẽ sơn lại màu đen và trạng thái mới sẽ là
("colour", "black")
Lưu ý rằng trạng thái của một thực thể có thể thay đổi, nhưng danh tính của nó không thay đổi theo định nghĩa. Tất nhiên, miễn là thực thể tồn tại, tất nhiên: một chiếc xe có thể được tạo ra và phá hủy, nhưng nó sẽ giữ bản sắc của nó trong suốt cuộc đời của nó. Không có nghĩa gì để nói về danh tính của một cái gì đó chưa tồn tại / nữa.
Nếu các giá trị của các thuộc tính gắn liền với một thực thể nhất định thay đổi theo thời gian, bạn nói rằng trạng thái của thực thể đó là có thể thay đổi . Nếu không, bạn nói rằng nhà nước là bất biến .
Việc triển khai phổ biến nhất là lưu trữ trạng thái của một thực thể trong một số loại biến (biến toàn cục, biến thành viên đối tượng), tức là lưu trữ ảnh chụp nhanh hiện tại của trạng thái. Trạng thái có thể thay đổi sau đó được triển khai bằng cách sử dụng phép gán: mỗi thao tác gán thay thế ảnh chụp nhanh trước đó bằng một ảnh mới. Giải pháp này thường sử dụng các vị trí bộ nhớ để lưu trữ ảnh chụp nhanh hiện tại. Ghi đè vị trí bộ nhớ là một thao tác phá hủy thay thế ảnh chụp nhanh bằng một ảnh mới. ( Ở đây bạn có thể tìm thấy một cuộc nói chuyện thú vị về phương pháp lập trình hướng địa điểm này .)
Một cách khác là xem các trạng thái tiếp theo (lịch sử) của một thực thể dưới dạng luồng (có thể là chuỗi vô hạn) của các giá trị, xem ví dụ Chương 3 của SICP . Trong trường hợp này, mỗi ảnh chụp nhanh được lưu trữ tại một vị trí bộ nhớ khác nhau và chương trình có thể kiểm tra các ảnh chụp nhanh khác nhau cùng một lúc. Ảnh chụp nhanh không sử dụng có thể được thu gom rác khi không còn cần thiết.
Ưu điểm / nhược điểm của hai phương pháp
- Cách tiếp cận 1 tiêu thụ ít bộ nhớ hơn và cho phép xây dựng một ảnh chụp nhanh mới hiệu quả hơn vì nó không liên quan đến việc sao chép.
- Cách tiếp cận 1 ngầm đẩy trạng thái mới đến tất cả các phần của chương trình có tham chiếu đến nó, cách tiếp cận 2 sẽ cần một số cơ chế để đẩy ảnh chụp nhanh đến các quan sát viên của nó, ví dụ như dưới dạng một sự kiện.
- Cách tiếp cận 2 có thể giúp ngăn ngừa các lỗi trạng thái không nhất quán (ví dụ: cập nhật trạng thái một phần): bằng cách xác định một hàm rõ ràng tạo ra trạng thái mới từ trạng thái cũ, việc phân biệt giữa các ảnh chụp nhanh được tạo ra tại các thời điểm khác nhau sẽ dễ dàng hơn.
- Cách tiếp cận 2 mang tính mô đun hơn ở chỗ nó cho phép dễ dàng tạo ra các khung nhìn về trạng thái độc lập với chính trạng thái, ví dụ như sử dụng các hàm bậc cao hơn như
map
và filter
.