Evans giới thiệu trong cuốn sách "Thiết kế hướng tên miền" của mình trong Chương 6 "Uẩn" khái niệm về cốt liệu. Ông còn định nghĩa thêm các quy tắc để chuyển khái niệm đó thành một triển khai (Evans 2009, trang 128-129):
ENTITY gốc có thể trao các tham chiếu đến ENTITY bên trong cho các đối tượng khác, nhưng các đối tượng đó chỉ có thể sử dụng chúng tạm thời và chúng không thể giữ tham chiếu.
Sau khi xây dựng các quy tắc khác, ông tóm tắt chúng vào đoạn này:
Phân cụm các Thực thể và Đối tượng Giá trị thành Tập hợp và xác định ranh giới xung quanh mỗi Đối tượng. Chọn một Thực thể làm gốc của mỗi Tập hợp và kiểm soát tất cả quyền truy cập vào các đối tượng bên trong đường biên thông qua thư mục gốc. Cho phép các đối tượng bên ngoài chỉ giữ các tham chiếu đến thư mục gốc. Tham chiếu thoáng qua cho các thành viên nội bộ chỉ có thể được đưa ra để sử dụng trong một hoạt động duy nhất. Bởi vì root kiểm soát quyền truy cập, nó không thể bị che khuất bởi những thay đổi đối với bên trong. Sự sắp xếp này làm cho nó thực tế để thực thi tất cả các bất biến cho các đối tượng trong Tổng hợp và cho toàn bộ Tổng thể trong bất kỳ thay đổi trạng thái nào.
Vì vậy, việc sử dụng tạm thời chính xác có nghĩa là gì?
Đồng nghiệp của tôi hiểu rằng chỉ có gốc tổng hợp mới hiển thị giao diện chung cho khách hàng. Khách hàng sẽ không có cơ hội gọi bất kỳ hoạt động nào trên một thực thể khác ngoài gốc tổng hợp.
Sự hiểu biết của tôi về các câu trích dẫn là khác nhau. Tôi hiểu rằng nó thực sự rõ ràng cho phép khách hàng gọi các hoạt động trên các thực thể nội bộ. Tuy nhiên chỉ sau khi nhận được chúng từ gốc.
Vì vậy, hãy có một ví dụ cụ thể:
Hãy nói rằng Cart
bao gồm nhiều Items
. Mỗi cái Item
có một Quantity
. Mô hình nên hỗ trợ trường hợp sử dụng "Tăng số lượng của một Mục cụ thể". Không có bất biến nào có thể bị vi phạm, điều này ảnh hưởng đến mọi thứ bên ngoài Vật phẩm.
Là một mô hình vi phạm các quy tắc được trích dẫn ở trên, khi khách hàng có thể thực hiện việc này bằng cách gọi cart.item(itemId).increaseQuantity()
hoặc khách hàng chỉ được phép gọi một cart.increaseItemQuantity(itemId)
? Điều gì sẽ là lợi ích của sau này?
cart.increaseItemQuantity(itemId)
, nếu không vì lý do nào khác ngoài việc vi phạm Luật của Demeter. Gọi điện cart.increaseItemQuantity(itemId)
cho phép bạn thực hiện những việc như cập nhật tổng số tiền của giỏ hàng.