2009-03-15 64 views
5

Tôi thấy trong một số mô hình đối tượng miền mà lớp cơ sở trừu tượng được tạo ra (thực hiện Equals và GetHashCode) cho tất cả đối tượng Entity miền để kế thừa từ nhận danh tính của chúng.Lớp cơ sở trừu tượng cho tất cả các đối tượng thực thể miền

Tôi không rõ lý do tại sao lớp cơ sở này là cần thiết và khi nào và tại sao nó nên được sử dụng. bạn có thể cung cấp cho tôi một số cái nhìn sâu sắc về vấn đề này hoặc giới thiệu cho tôi một liên kết mà nói về vấn đề này

Cảm ơn

Bây giờ tôi hiểu được lợi thế của trọng bình đẳng (liên kết này giúp http://en.csharp-online.net/CSharp_Canonical_Forms -Identity_Equality)

Trở lại với miền điều khiển thiết kế Tôi muốn mở rộng câu hỏi của mình một chút;

Tôi có một thực thể khách hàng mà tôi sử dụng guid làm nhận dạng.

Nếu tôi tạo 2 trường hợp khách hàng với chính xác các chi tiết tương tự, vì tôi đang sử dụng guid làm nhận dạng, chúng sẽ là hai đối tượng khác nhau. Nhưng vì chúng có tất cả các thuộc tính giống nhau nên chúng phải là cùng một đối tượng (hoặc nó là một thực hành ddd tốt hơn để giữ chúng độc đáo và riêng biệt?)

Cố gắng hiểu nếu tôi nên xử lý sự bình đẳng của hai đối tượng đầy đủ của chúng khớp giá trị thuộc tính. Nếu tôi đi theo hướng đó thì tôi đang xem xét việc đánh giá mức bình đẳng của lớp cơ sở ở cấp lớp phụ và thực hiện các điều kiện này hoặc có nhận dạng của thực thể một chuỗi hoặc mã băm (?) Đại diện cho các giá trị của tất cả các thuộc tính này và sử dụng Equality của lớp cơ sở.

Tôi có thể ít ra khỏi đây để cảm ơn trước vì sự kiên nhẫn.

+0

Vui lòng cung cấp chi tiết về những gì bạn đang đề cập đến. Bạn không nhìn thấy một số thực hành trong toàn ngành mà mọi người đều biết - bạn có nhiều khả năng thấy điều gì đó cụ thể hơn cho chi tiết bạn không cung cấp cho chúng tôi! –

+0

hy vọng điều này là tốt hơn - tôi đã không rõ ràng mặc dù nơi tôi nên đăng một câu hỏi thứ hai như là một theo dõi cho câu hỏi này vì vậy tôi chỉ cần đặt nó bằng cách chỉnh sửa câu hỏi ban đầu của tôi. –

Trả lời

3

Việc sử dụng thuật ngữ bình đẳng bị quá tải ở đây:

1) Bình đẳng cho Bản sắc

Nếu bạn có 2 phiên bản của cùng một Khách hàng, cả hai đều có cùng giá trị GUID - đó là cách duy nhất để đảm bảo rằng bạn đang làm việc với cùng một Pháp nhân. Trong thực tế, sẽ luôn có các phiên bản khác nhau của cùng một Thực thể (ví dụ: các ứng dụng nhiều người dùng chạy trên các máy khác nhau).

2) Bình đẳng cho giống nhau

Đây là nơi bạn đang kiểm tra 2 trường hợp có tất cả các giá trị như nhau. Ví dụ: nếu 2 nhân viên đang tìm kiếm cùng một Khách hàng và người đầu tiên sửa đổi & thì hãy lưu nó, cả hai người sẽ thấy dữ liệu khác nhau. Cả hai đều quan tâm đến cùng một Khách hàng, nhưng dữ liệu trở nên cũ.

Đối với (2), bạn chắc chắn cần một cơ chế để thực hiện việc kiểm tra.Bạn có thể so sánh từng thuộc tính (đắt tiền) hoặc bạn có thể sử dụng thuộc tính ‘phiên bản’ để phát hiện các thay đổi (xem NHibernate’s optimistic locking mechanism).

Tôi nghĩ rằng ví dụ của bạn hơi bị lôi cuốn và có thể khiến bạn xa các khía cạnh quan trọng hơn của DDD. Nếu bạn quan tâm, I sell a tool có thể giúp nắm bắt các khái niệm DDD dễ dàng hơn.

0

Bạn đã chỉ ra hai lý do tại sao nó được sử dụng.

Đối với Bình đẳng, bạn có thể không muốn luôn kiểm tra xem tham chiếu thực tế có bằng nhau hay không, vì có thể không. Bạn có thể muốn sử dụng một số loại thuộc tính nhận dạng (như ID công khai) để kiểm tra xem liệu 2 thực thể có bằng nhau hay không. Việc thực hiện cơ sở của Equals chỉ là sẽ kiểm tra xem 2 tham chiếu có bằng nhau hay không.

Theo như mã băm đó là một cách để nhận diện một cho đối tượng/loại khi sử dụng nó trong các thuật toán băm, vv

0

Tôi sẽ chỉ bằng việc kiểm tra danh tính, vì nó cho phép bạn có một thể hiện của một thực thể có chứa tình huống trước và sau, điều này có thể rất tiện dụng vào những thời điểm. Để kiểm tra xem một cá thể đã thay đổi chưa, một lá cờ Bẩn có thể thực hiện thủ thuật.

HTH, Jonathan

1

Nếu bạn đang theo dõi DDD, tôi tin rằng bạn nên kiểm tra trên sự bình đẳng giữa các đối tượng bằng ID của họ (Identity). Điều này là do các thực thể miền được định nghĩa chính và được theo dõi bởi danh tính của nó chứ không phải bởi các thuộc tính. Vì vậy, không có vấn đề làm thế nào tương tự như họ đang có với các đối tượng khác, họ vẫn còn thực thể diffirent.

Một khái niệm khác mà bạn muốn xem là đối tượng giá trị. Nó là cái gì đó mô tả một charasteristics của một đối tượng và không yêu cầu một bản sắc. Ví dụ sẽ là địa chỉ, tiền, màu sắc.

1

Bạn nên so sánh ID của các đối tượng nếu chúng là thực thể và thuộc tính của chúng trong trường hợp chúng là đối tượng giá trị. Điều đó có nghĩa là bạn không cần phải kế thừa các đối tượng giá trị của bạn từ một thực thể cơ sở, nhưng đối với các thực thể thì tốt hơn nên tạo một đối tượng.

Làm cách nào để hiểu một lớp là một thực thể hay một đối tượng giá trị? Bạn nên trả lời câu hỏi: các đối tượng của lớp đó có bằng nhau không nếu chúng có cùng một thuộc tính? Nếu có, chúng là các đối tượng giá trị. Ví dụ, hai người không bằng nhau ngay cả khi họ có cùng tên và ngày sinh - bạn cũng nên coi họ là những thực thể khác nhau. Nhưng nếu bạn có 25 xu tiền xu, bạn có thể không quan tâm những gì chính xác mảnh kim loại bạn có, tất cả họ chỉ là 25 xu tiền xu.

Có một bài viết tuyệt vời mô tả chi tiết: domain object base class

Các vấn đề liên quan