Bởi đối tượng Thông minh, tôi xem xét bất kỳ đối tượng Miền nào biết giá trị thuộc tính ban đầu của nó nếu thuộc tính bị thay đổi. Các đối tượng thông minh thường có một lớp cơ sở và thực hiện các thuộc tính bằng cách sử dụng các phương thức GetPropertyValue/SetPropertyValue. Mặt khác, các đối tượng POCO thường không có lớp cơ sở và thực hiện các thuộc tính đơn giản.Đối tượng miền - "Đối tượng thông minh" so với POCO
public class SmartObject : BaseDomainObject
{
public int id
{
get { return (int)this.GetPropertyValue("Id"); }
set { this.SetPropertyValue("Id", value); }
}
}
public class POCO
{
public int id { get; set; }
}
Tôi thích đối tượng thông minh bởi vì nó làm rất nhiều công việc khó khăn cho tôi. Tôi có thể dễ dàng thêm tất cả những tính năng hữu ích để BaseDomainObject và có chúng trong tất cả các lớp miền bắt nguồn của tôi:
tính- chung (như Id, Status ...)
- tượng trạng thái theo dõi (mới, sửa đổi, không thay đổi)
- tất cả các thuộc tính nâng cao sự kiện vào những thay đổi sở hữu (thực hiện INotifyProperyChanged)
- các lớp thừa kế có thể được tự động được serializable (mặc dù tôi hiếm khi tìm thấy điều này hữu ích)
- tôi có thể có tất cả các hành vi này khác mà có thể hữu ích - Clone/Đồng bộ/IsPropertyDirty ...
Mặt khác, POCO rất đơn giản và không phụ thuộc vào bất kỳ lớp cơ sở nào.
Ngày nay tôi ở đây rất nhiều POCO ca ngợi vì:
- nó có thể được gửi qua dây (thường là trình duyệt web như JSON)
- nó là tinh khiết
Mặt khác tay Tôi nghĩ rằng những lý do trên là sai lầm vì:
- DTO là dành cho chuyển khoản và không phải là đối tượng miền. Hành vi đóng gói dữ liệu nếu bị mất khi đối tượng miền được tuần tự hóa thành JSON.
- điều này theo đuổi các đường nối tinh khiết như đuổi theo nhiều mô hình miền thiếu máu hơn mà không có logic hay bất kỳ thông minh nào gắn liền với nó.
Với tất cả những điều này buồn, tôi vẫn thích POCO và nó gây lỗi cho tôi. Ý kiến của bạn là gì?
Nếu bạn đang phấn đấu cho một mô hình tên miền phong phú, đừng gây ô nhiễm nó với các mối quan tâm về hạ tầng kỹ thuật. Tất cả những điều bạn đã đề cập - theo dõi trạng thái, tài sản đã thay đổi sự kiện, tuần tự hóa - không có thứ nào trong số này có liên quan đến miền. Họ không làm gì để mã hóa sự phức tạp của miền kinh doanh thành mô hình. – MattDavey
Mặt khác, một POCO cũng không làm gì để mã hóa sự phức tạp của miền vào mô hình. Vì vậy, theo tiêu chuẩn DDD, cả hai cách tiếp cận đều rất kém. – MattDavey
@MattDavey Tôi đồng ý với nhận xét đầu tiên của bạn nhưng tôi không chắc chắn về điều sau. POCO! = Thiếu máu, nếu đó là những gì bạn đang ngụ ý. Định hướng đối tượng cũ đồng bằng * * bao gồm hành vi và nếu có, Hành vi miền, ngoài dữ liệu. – guillaume31