2015-10-11 20 views
8

Tôi cũng đang cố áp dụng các nguyên tắc thiết kế theo hướng miền cho ứng dụng của mình, với mô hình tên miền phong phú chứa cả hai trường dữ liệu và logic nghiệp vụ. Tôi đã đọc nhiều cuốn sách DDD, nhưng có vẻ như mô hình miền của họ (được gọi là thực thể) rất đơn giản. Nó trở thành một vấn đề khi tôi có một mô hình miền với 10-15 trường dữ liệu, chẳng hạn như một trường bên dưới:Thiết kế định hướng tên miền: Cách xử lý các mô hình phức tạp với nhiều trường dữ liệu?

class Job extends DomainModel{ 

    protected int id; 
    protected User employer; 
    protected string position; 
    protected string industry; 
    protected string requirements;  
    protected string responsibilities;  
    protected string benefits; 
    protected int vacancy; 
    protected Money salary; 
    protected DateTime datePosted; 
    protected DateTime dateStarting; 
    protected Interval duration; 
    protected String status; 
    protected float rating; 

    //business logic below 
} 

Như bạn thấy, mô hình miền này chứa rất nhiều trường dữ liệu và tất cả chúng đều quan trọng và không thể bị tước đi. Tôi biết rằng một mô hình tên miền phong phú không nên chứa các phương thức setter, mà là truyền dữ liệu của nó tới hàm tạo và các trạng thái biến đổi bằng cách sử dụng logic nghiệp vụ. Tuy nhiên, đối với mô hình miền trên, tôi không thể chuyển tất cả mọi thứ cho hàm tạo, vì nó sẽ dẫn đến 15+ tham số trong phương thức hàm tạo. Một phương thức không nên chứa nhiều hơn 6-7 tham số, bạn không nghĩ sao?

Vì vậy, tôi có thể làm gì để giải quyết một mô hình miền với nhiều trường dữ liệu? Tôi có nên cố gắng phân hủy nó không? Nếu vậy, làm thế nào? Hoặc có lẽ, tôi chỉ nên sử dụng một lớp Builder hoặc phản ánh để khởi tạo thuộc tính của nó khi instantiation vì vậy tôi sẽ không gây ô nhiễm constructor với rất nhiều đối số? Bất cứ ai có thể đưa ra một số lời khuyên? Cảm ơn.

Trả lời

6

Điều bạn đã bỏ lỡ là khái niệm về Đối tượng giá trị. Các đối tượng giá trị là các đối tượng nhỏ, không thay đổi có ý nghĩa trong miền tương ứng.

Tôi không biết các chi tiết cụ thể của tên miền của bạn, nhưng nhìn vào thực thể Job của bạn, có thể là một đối tượng giá trị JobDescription trông như thế này:

class JobDescription { 
    public JobDescription(string position, string requirements, string responsibilities) { 
     Position = position; 
     Requirements = requirements; 
     Responsibilities = responsibilities; 
    } 

    public string Position {get;} 
    public string Requirements {get;} 
    public string Responsibilities {get;} 
} 

Đây là code C#, nhưng tôi nghĩ ý tưởng phải rõ ràng bất kể ngôn ngữ bạn đang sử dụng.

Ý tưởng cơ bản là giá trị nhóm theo cách có ý nghĩa trong miền tương ứng. Điều này có nghĩa là tất nhiên các đối tượng giá trị cũng có thể chứa các đối tượng giá trị khác.

Bạn cũng nên đảm bảo rằng đối tượng giá trị được so sánh theo giá trị thay vì tham chiếu, ví dụ: bằng cách triển khai IEquatable<T> trong C#.

Nếu bạn refactor mã của bạn với phương pháp này, bạn sẽ nhận được ít trường hơn trên thực thể của bạn, do đó, sử dụng tiêm constructor (được khuyến khích) trở nên khả thi một lần nữa.


ghi chú thêm về mã ví dụ của bạn mà không được kết nối trực tiếp đến câu hỏi:

  • Mô hình miền là toàn bộ điều, một thực thể là một phần của nó. Vì vậy, lớp cơ sở của bạn nên được gọi là Entity và không phải là DomainModel.

  • Bạn nên tạo các trường trong lớp của mình private và cung cấp protected người truy cập nếu cần để duy trì đóng gói.

+0

Tôi hiểu, vâng tôi nghĩ tôi nên bắt đầu triển khai nhiều đối tượng giá trị hơn, như đối tượng Giá trị tiền tôi đã có. Cảm ơn gợi ý, tôi sẽ bắt đầu bằng cách soạn các trường dữ liệu bằng các đối tượng giá trị nhỏ hơn và sử dụng các đối tượng giá trị trong mỗi thực thể. Tôi biết các lĩnh vực bảo vệ đôi khi phá vỡ đóng gói, vì vậy tôi nên chuyển sang tư nhân trong hầu hết các trường hợp, cảm ơn quá. Mặc dù vậy, tôi không chắc chắn về mô hình miền và điều thực thể, theo hiểu biết của tôi một mô hình miền là một thực thể hoặc thực thể là một mô hình miền có nhận dạng, điều này có đúng không? –

+0

@LordYggdrasill Mô hình tên miền là tập hợp toàn bộ "những thứ" có ý nghĩa trong miền của bạn, ví dụ: thực thể, đối tượng giá trị, v.v. Xem ví dụ [bài viết này] (https://en.wikipedia.org/wiki/Domain_model), sơ đồ hiển thị một mô hình miền mẫu có chứa nhiều lớp. – theDmi

+0

Tôi hiểu, cảm ơn. Tôi hiểu điều này tốt hơn sau khi đọc một số bài viết về tổng hợp gốc. –

2

Có rất nhiều điều xảy ra trong đối tượng Mô hình miền công việc của bạn - dường như kết hợp một số lượng lớn mối quan tâm, và (ít nhất) cho thấy một số ngữ cảnh bị giới hạn, một số phân biệt để làm ví dụ.

  1. Thù lao (lương, lợi ích)
  2. vị trí tổ chức (dòng báo cáo)
  3. Person spec (kỹ năng)
  4. đặc tả công việc (trách nhiệm)
  5. , vv

Khi bạn hãy xem xét những điều tương tác với mô hình 'Công việc' của bạn, có bất kỳ điều gì cần phải kiểm tra hoặc biến đổi BOTH tài sản lương và tài sản công nghiệp, cho kỳ thi ple?

Nếu không biết đầy đủ sắc thái của tên miền, Mức lương bạn nhận được khi giữ vị trí và Ngành bạn làm việc không thực sự được kết nối, đúng không? Không phải là một điểm hùng biện; đây là những câu hỏi mà bạn CẦN hỏi các chuyên gia miền.

Nếu họ KHÔNG có bất kỳ tương tác nào thì bạn đã xác định rằng hai điều này tồn tại trong hai THÔNG TIN LIÊN LẠC khác nhau. Phía Lương không cần bất kỳ sự tương tác nào với phía Công nghiệp và ngược lại, và ngay cả khi họ đã làm, họ có cần phải được giữ như một trạng thái trong cùng một quá trình cùng một lúc không?

Hãy nghĩ về vòng đời của cách một người trở thành nhân viên; một người nộp đơn xin việc. Công việc có một đặc điểm kỹ thuật, phạm vi lương. Người tham dự một cuộc phỏng vấn. Người thuê cung cấp cho người đó vị trí. Người đó chấp nhận. Người đó hiện là nhân viên, không còn là ứng cử viên nữa. Nhân viên mới hiện đang tích luỹ kỳ nghỉ và lợi ích và có ngày bắt đầu, v.v.

DDD dạy chúng tôi rằng một quan điểm thống nhất, duy nhất trên thế giới hiếm khi phục vụ bất kỳ mối quan tâm nào một cách chính xác. Vui lòng khám phá CONTOUND BOUNDED - phần mềm của bạn sẽ mềm dẻo hơn và linh hoạt hơn.

+0

Vâng, bạn có một điểm, theo cách này, mô hình miền công việc của tôi giống như một thư mục tổng hợp, nó cũng có thể chứa các trường khác như người dùng đã áp dụng cho công việc. Id chắc chắn xem xét refactoring một số lĩnh vực vào các đối tượng miền nhỏ hơn (tôi nghĩ rằng họ sẽ được, giá trị đối tượng? Vì họ không có bản sắc bên ngoài của tổng hợp công việc gốc). –

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