2009-08-26 31 views
9

Hãy nói rằng tôi có thực thể điển hình xeDDD: lớp con & các đơn vị gốc

class Car : Entity 
{ 
    public double MaxSpeed { get; set; } 
    public Color Color { get; set; } 
    /* ... */ 
} 

thực thể này, trong mô hình tên miền của tôi, sẽ là đơn vị gốc của một tổng hợp.

Bây giờ, giả sử tôi chuyên chuyên về ô tô. Tôi tạo ra một Ferrari, và các chủ sở hữu hạnh phúc của Ferraris muốn gọi cho họ bằng một biệt danh:

class Ferrari : Car 
{ 
    public string Nickname { get; set; } 
} 

Hãy nói rằng tôi có tổ chức khác, các Công ty thực thể. Nó sẽ là thực thể gốc gốc của một số khác Tổng hợp. Có nhiều người đang làm việc trên một công ty, được đại diện bởi tổ chức Người. Người có thể có xe hơi. Nhưng Tổng thống của một công ty thường là rất phong phú và loại người này, họ có Ferraris:

class President : Person 
{ 
    public Ferrari Ferrari { get; set; } 
} 

Trong tình huống này, tôi có tổ chức Tổng thống, là người bên các Công ty tổng hợp, đang giữ một tham chiếu đến một chiếc Ferrari, một chuyên môn của thực thể gốc của một tổng hợp khác.

Điều này có đúng theo quan điểm của DDD không? Tôi có nên/nên xem xét việc chuyên môn hóa các thực thể gốc là các thực thể gốc của cùng một tổng hợp không? Tôi có nghĩa là, trong tên miền tôi mô tả, là thực thể Ferrari cũng là thực thể gốc của xe tổng hợp (kể từ Ferrari cũng là một chiếc xe)?


Bây giờ chúng ta hãy nói rằng tôi phải tồn tại mô hình này cho một cơ sở dữ liệu. Tôi nghĩ rằng câu hỏi của tôi không phụ thuộc vào khuôn khổ OR/M mà tôi sẽ sử dụng.

Làm cách nào để tôi tạo bảng giữ Ô tô? Tôi có nên xây dựng một bảng ô tô duy nhất, với cột "CarType" (giá trị có thể có: "Xe hơi", "Ferrari") và cột Biệt hiệu không có giá trị không?

Hoặc tôi có nên xây dựng một bảng cho Ô tô và bảng cho Ferraris, cái sau có PK FK của Ô tô không?

Cảm ơn!

Trả lời

2

Tôi nghĩ bạn bắt đầu mất rất nhiều tính linh hoạt của hệ thống bằng cách tạo các loại cụ thể của các thực thể này. Loại mối quan hệ mà bạn ngụ ý là thứ mà tôi thường nói với thực thể "Loại". Ví dụ, bạn có một chiếc xe hơi. Ferrari là một loại xe hơi. Hai thực thể được sinh ra từ đó là Ô tô và CarType.

Cách bạn đang nói về việc thực hiện nó, bạn sẽ phải thêm các thực thể mới mỗi khi một loại mới được giới thiệu. Nếu tất cả những gì bạn đang cố gắng nắm bắt là "biệt danh" của chiếc xe, tôi sẽ nghĩ rằng đó chỉ là một phần dữ liệu khác, và không phải là một thực thể khác. Trừ khi bạn có dữ liệu khác (tức làcác tên thuộc tính khác nhau) và/hoặc sự khác biệt về hành vi trong các thực thể Ô tô cho các loại khác nhau, bạn không đạt được nhiều với phương pháp này. Tôi muốn có các phương thức kho lưu trữ như FindCarByType() và xử lý một loại thực thể để giảm rủi ro.

Tôi không phải là chuyên gia DDD, và tôi đang đấu tranh với một số khái niệm (hoặc giống như đấu tranh với nhiều cách giải thích của một số khái niệm). Tôi thấy rằng không có một thực hiện 100% tinh khiết, và rằng có những sắc thái đối với từng triển khai mà tôi đã thấy.

Sửa Làm theo

tôi thấy rằng tôi không nhận định một phần của những gì bạn đã viết. Tôi thấy biệt danh đó không dành cho tất cả các loại xe, mà chỉ dành cho Ferrari: Xe hơi. Tôi nghĩ rằng câu trả lời thực sự là "nó phụ thuộc". Bạn có bao nhiêu chuyên môn về miền trong phần còn lại của mô hình? Có một biệt hiệu có thể phổ biến giữa các thực thể Ferrari, nhưng nó có độc quyền không? Nó không chỉ là về dữ liệu thực tế, mà là các yêu cầu. Về cơ bản nó đi xuống đến bao nhiêu chuyên ngành của bạn đang mong đợi trong các thực thể này.

+0

Tuyệt vời! Cảm ơn bạn! Trên thực tế, trong hệ thống "thực sự" của tôi, "Ô tô" là rất quan trọng, nhưng "Ferrari" là điều quan trọng nhất trong miền của tôi, mà tôi không thể theo dõi, tôi phải thống kê về nó. –

4

Bạn không nên sử dụng thừa kế để tạo mô hình miền của mình vì bạn sẽ sớm gặp sự cố khi mô hình bắt đầu trở nên phức tạp.

Chủ tịch chỉ đơn giản là vai trò của một người và một người có thể có nhiều vai trò. Có lẽ tổng thống chỉ có một vai trò nhưng đó chỉ đơn giản là ngẫu nhiên bằng cách chọn ví dụ sai.

Ferrari cũng không được kế thừa từ ô tô. Nó không rõ ràng trên ví dụ Ferrari, bởi vì họ chỉ làm một loại xe nhưng xem xét công ty làm cho nhiều loại như xe tải, xe sedan, hatchback, xe tải và như vậy. Bạn có thể sẽ muốn tạo các lớp cho mọi loại sẽ kế thừa từ lớp xe. Và sau đó ... bạn sẽ tạo ra năm lớp Toyota sẽ kế thừa từ mỗi loại? Chẳng hạn như ...

Car -> Sedan -> ToyotaSedan 
Car -> Truck -> ToyotaTruck 
Car -> Hatchback -> ToyotaHatchback 

Điều đó thật lố bịch.

Tuyên bố từ chối trách nhiệm: Tôi không biết gì về xe hơi. Tuy nhiên ...

Không sử dụng thừa kế để tạo mô hình miền của bạn. Không bao giờ.

Hãy thử nó mà không kế thừa và nó cũng sẽ trở nên rõ ràng cách duy trì miền của bạn.

+0

Cảm ơn, lubos.Nhưng trong trường hợp này, trong miền "thực" của tôi, tôi có * "xe hơi", và có những chiếc xe "chung chung" và 2 loại xe đặc biệt, "Ferrari" và "Porsche" phải được theo dõi, mặc dù chúng về cơ bản là "Ô tô". –

+3

vẫn còn, tránh kế thừa. ngay cả khi bạn không, bạn sẽ phải trong một hoặc hai năm vì mô hình của bạn có thể sẽ phức tạp hơn trong tương lai để nắm bắt các yêu cầu mới và thừa kế sẽ gây ra rất nhiều đau đớn trong thiết kế của bạn. sách giáo khoa ví dụ để giải thích thừa kế như Cat và Dog là cả Động vật và Vòng tròn và Hình vuông đều là Hình dạng cho ấn tượng sai sự thừa kế thực sự là gì và người lập trình thường lạm dụng khái niệm mạnh mẽ này để mô hình hóa miền. đọc thêm tại đây: http://www.geocities.com/tablizer/oopbad.htm#overeng (Tôi không phải là tác giả) –

+0

Bài viết rất hay! Cảm ơn! –

3

Nói chung khi bạn vượt qua ranh giới tổng hợp gốc, bạn chỉ cho phép tham chiếu là ID của tập hợp gốc khác. Sau đó, bạn sử dụng ID đó để tra cứu tổng hợp khác trong kho lưu trữ của nó.

Vì vậy, trong trường hợp của bạn, bạn muốn Tổng thống có ID xe hơi và nếu bạn cần làm gì đó cho xe của Tổng thống, bạn sẽ sử dụng ID xe hơi để chuyển đến kho lưu trữ để lấy xe. Tổng thống sẽ không có một tham chiếu đến chính chiếc xe.

Bây giờ, về chiếc Ferrari đó. Thật khó để thực thi điều đó trong thuật ngữ DDD chuẩn. Thông thường bạn sẽ đặt một số xác nhận về việc chuyển nhượng một chiếc xe cho một tổng thống. Hoặc có thể có một CarBuyingService chỉ dành cho Chủ tịch mà chắc chắn rằng bạn làm cho nó đúng. Thông thường trong các chuyên ngành DDD không phải là các tập hợp gốc của chúng.

+0

Bạn là người duy nhất thực sự trả lời câu hỏi –

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