DDD Bounded Bối cảnh & Tên miền?


16

Tôi đã làm việc trong một ứng dụng tương đối phức tạp với 10 bảng cơ sở dữ liệu (Tập hợp, Thực thể / Đối tượng Giá trị) và áp dụng DDD. Tại thời điểm này, về cơ bản, DDD-Lite có nghĩa là có Ứng dụng / Dịch vụ miền, Mô hình miền (Thực thể, Đối tượng giá trị) và Kho lưu trữ.

Tôi đã chọn một cuốn sách Thực hiện DDD và điều đầu tiên anh ấy nhắc đến là DDD-Lite và Bối cảnh và các sự kiện miền bị thiếu là những lỗi đầu tiên thường thấy khi bắt đầu DDD.

Hiện tại tôi đã thử tổ chức Mô hình miền theo các mối quan hệ Tổng hợp và sử dụng các không gian tên để thể hiện nó.

Tôi không thấy lợi ích / nhược điểm liên quan đến việc tách dự án Mô hình miền thành các bối cảnh giới hạn riêng biệt (chưa). Có lẽ nó sẽ trở nên rõ ràng sau này nhưng tôi muốn một số phản hồi thực tế về Bối cảnh bị ràng buộc (và có thể cả các tên miền phụ, v.v. nếu chúng liên kết với nó).


Dường như với tôi, điều duy nhất xác định bối cảnh giới hạn riêng biệt là cần phân biệt ngôn ngữ học và sự khác biệt hoạt động liên quan, tức là nó được gọi là sản phẩm ở một khu vực và sản phẩm ở một khu vực khác nhưng chúng khác nhau, vì vậy chúng tôi cần hai sản phẩm và cả hai đều có thể ' t trong cùng một mô hình (cùng tên, v.v.). Vậy tại sao chúng ta không thay đổi tên để thể hiện ngữ nghĩa khác nhau của chúng? Họ có thể có một mô hình để cai trị tất cả. Subdomains là tự nhiên nhưng tôi không thấy bối cảnh bị ràng buộc tại thời điểm này. Chỉ cần suy nghĩ lớn ở đây ...
Ashley Aitken

Tôi đoán bạn đã nhận ra lý do tại sao việc chia tách tên miền của bạn trên các bối cảnh có lợi nhuận. Vì vậy, những gì có thể hữu ích bây giờ là cách đúng để xác định chúng, để xác định ranh giới của bối cảnh. Đây là cách tôi thực hiện: Medium.com/@wrong.about/ Kẻ
Zapadlo

Câu trả lời:


20

Hãy xem xét một công ty có một vài bộ phận khác nhau:

  • Phát triển phần mềm
  • Nhân sự
  • Kế toán

Bạn có thể đưa ra một mô hình người dùng có thể đại diện rõ ràng cho tất cả các lĩnh vực kinh doanh đó không? Hãy nghĩ về thực thể Người dùng có thể trông như thế nào trong mỗi người. Có lẽ nó được chia thành ba thực thể khác nhau:

  • Nhà phát triển
  • Nhân viên
  • Người được trả tiền

Nỗ lực để khởi tạo một người dùng trong mỗi bối cảnh là khác nhau đáng kể. Có lẽ nó giống như thế này:

  • Nhân viên mới (ssn, tên, tham gia, hẹn hò, giới tính)
  • Nhà phát triển mới (Nhân viên, máy trạm, thông tin đăng nhập)
  • Người nhận thanh toán mới (Nhân viên, vai trò)

xin lỗi, thật khó để minh họa chính xác nếu không có mô hình miền thích hợp để tham khảo

Nếu bạn đã sử dụng một triển khai ngây thơ và sử dụng một thực thể người dùng duy nhất, thì đó sẽ là một mô hình dữ liệu thiếu máu chứa đầy các getters và setters, bởi vì bạn không thể đại diện đầy đủ cho người dùng ở mọi nơi.

Có những ranh giới rõ ràng trong kinh doanh, vì vậy thật hữu ích khi mô hình hóa chúng theo cách đó. Người dùng đăng nhập so với người dùng trong hệ thống bảng lương so với người dùng chơi trò chơi đều rất khác nhau, ngay cả khi họ là một phần của cùng một hệ thống lớn.

Suy nghĩ theo một cách khác - bây giờ bạn có thể tạo mã quản lý nhà phát triển của mình thật nhẹ và độc lập với phần còn lại của hệ thống. Nó có thể sử dụng các loại chính xác hơn với ít hành lý để lo lắng. Đây là bước để xây dựng các hệ thống con nhỏ hơn mà cuối cùng có thể được trích xuất ra khỏi ứng dụng của chính nó.


Cảm ơn ví dụ hỗ trợ giúp minh họa các nhu cầu khác nhau của 3 BC.
lko

Không phải là cách tôi đã từng thấy những khái niệm này: thông thường, Employeekhông phải là a User, nó a User. Đơn Usergiản chỉ là một thực thể thông qua đó một người có thể đăng nhập và truy cập một hoặc nhiều ứng dụng trong tổ chức. Và Employeekhông phải lúc nào cũng có một User. Ngoài ra, thông thường bạn không nhận được một ứng dụng đơn giản cho các phòng ban khác nhau; thông thường, mỗi bộ phận có các ứng dụng riêng, mỗi bộ chứa mô hình miền riêng. Vì vậy, với tôi câu trả lời này không giúp làm rõ sự cần thiết phải có các bối cảnh giới hạn riêng biệt trong cùng một cơ sở mã.
Rogério

@ Rogério sự phản đối của bạn thực sự là một ví dụ tuyệt vời về lý do tại sao điều quan trọng là phải xác định chính xác các ngôn ngữ phổ biến được sử dụng trong mọi bối cảnh bị ràng buộc :)
MauganRa

Tôi chỉ tự hỏi trong các trường hợp khi chúng tôi có hệ thống quản lý khách hàng, khi chúng tôi gọi điện để truy vấn các đơn đặt hàng hoặc thanh toán, v.v. chúng tôi sẽ bị hoãn trong khi chúng tôi được chuyển đến bộ phận thích hợp. Kiến thức tên miền của từng bộ phận phát huy tác dụng - gây khó chịu cho khách hàng trong các tình huống này. Có lẽ chúng ta có thể đổ lỗi cho DDD vì đã buộc phải phân tách giữa các bối cảnh này.
Andez

16

Tôi có thể cho bạn một ví dụ khác. Hãy xem xét bạn có một số hệ thống thương mại điện tử. Bạn sẽ có sản phẩm ở đó, tuy nhiên sản phẩm sẽ là một phần của ít nhất hai miền khác nhau:

  • Danh mục sản phẩm, nơi bạn giữ mô tả sản phẩm của mình và tất cả các thuộc tính
  • Hàng tồn kho, nơi bạn có mức tồn kho sản phẩm

Nếu bạn có một bối cảnh giới hạn cho cả hai miền, giải pháp của bạn có thể nhanh chóng trở thành một quả bóng lớn bởi vì bạn sẽ bắt đầu tham khảo chéo nó. Cuối cùng, bạn sẽ không có hai tên miền nữa. Hàng tồn kho sản phẩm của bạn sẽ được tha hồ tham khảo danh mục sản phẩm và ngược lại. Vì kết quả của việc này, bạn sẽ không thể thay đổi một tên miền mà không chạm vào tên miền khác ngay cả khi bạn hoàn toàn nhận ra điều này là không bắt buộc. Các mô hình của bạn trở nên phụ thuộc lẫn nhau và liên kết chặt chẽ, và phụ thuộc theo chiều hướng xấu - bị phụ thuộc vào việc thực hiện.

Tuy nhiên, nếu bạn có hai bối cảnh bị ràng buộc, tất cả các thay đổi bạn thực hiện trong một tên miền sẽ không ảnh hưởng đến vùng kia ngay khi bạn giữ cho các kênh liên lạc của mình rõ ràng. Điều đó có nghĩa là bạn cần phải sao chép dữ liệu nhưng đây là chi phí ít nhất để trả cho ứng dụng dựa trên thành phần được ghép nối một cách mất mát. Các miền của bạn có thể nói chuyện với nhau bằng các sự kiện tên miền. Ngay cả khi bạn không có kế hoạch để có ứng dụng dựa trên SOA ngay từ đầu, bạn sẽ có thể mở rộng đến mức đó khi bạn cần với nỗ lực tương đối thấp vì bạn chỉ thay đổi vận chuyển cho các sự kiện trong miền của mình, giữ nguyên ý tưởng phía sau.

Cập nhật: Có một kỹ năng tốt trên SkillMatter, từ Eric Evans. Ông đưa ra một sự tương tự của câu chuyện cũ, khi một số người mù mô tả một con voi từ quan điểm của họ. Vì mỗi người chỉ có thể chạm vào một phần của con voi, nên họ mô tả nó như một "cái cây", "bức tường", "con rắn", "sợi dây". Và mỗi người trong số họ là đúng trong bối cảnh của họ. Bối cảnh bị ràng buộc là nơi ngôn ngữ phổ biến sống. Bên ngoài bối cảnh, các thuật ngữ này có thể có ý nghĩa hoàn toàn khác nhau nhưng bên trong bối cảnh, ngôn ngữ giống nhau trên nhiều lĩnh vực. Greg Young mạnh mẽ đề nghị bắt đầu đọc cuốn sách màu xanh từ chương 11, vì các khái niệm cơ bản, quan trọng nhất được giải thích ở đó. Việc tập trung vào các mẫu chiến thuật ở phần đầu của cuốn sách khiến cho cách tiếp cận "ánh sáng DDD" này trở nên rất phổ biến,


1
+1 để cũng đưa ra sự trùng lặp. Lúc đầu hơi khó hiểu ("Tôi có làm sai không?!) nhưng nó hoàn toàn tự nhiên, trong mọi trường hợp, bắt buộc.
Adrian Schneider

Trong kịch bản này, các Productlớp này có cùng giả thuyết chia sẻ cùng một ID (ví dụ: cả hai bảng BC riêng biệt đều có khóa ngoại với bảng có một ID sản phẩm duy nhất) không? Có lẽ khi liên lạc với Sự kiện Miền, họ có thể sử dụng ID đó?
lko

1
Tất cả phụ thuộc vào việc lưu trữ được chọn. Không cần thiết phải sử dụng id kỹ thuật để tham chiếu tên miền chéo. Nó cũng không nên thực hiện giao tiếp giữa các bối cảnh.
Alexey Zimarev

1
Có vẻ như đã đến lúc lấy cuốn sách màu xanh ra khỏi kệ và đọc những chương sau đó
Markus Pscheidt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.