Hiểu domain driven design theo cách bá đạo - Part 2

http://www.giaosucan.com/2018/08/hieu-domain-design-theo-cach-ba-ao-part.html

Thuật ngữ trong DDD
Mỗi lĩnh vực (domain) trong cuộc sống đều có thuật ngữ khác nhau. Dramma hàn quốc thì có thuật ngữ như uppa, ung thư. Kiếm hiệp Hoa Ngữ thì có tuyệt chiêu, bí kíp, kiếm pháp. Chính trị thì có tư tưởng HCM, lý luận Đặng Tiểu Bình, cách mạng, đường lối chính sách. DDD cũng có những thuật ngữ riêng như Ubiquitous Language, Entity, Value Object, Aggregate vân vân và mây mây. Cuốn sách của Evic giải thích thì vô cùng khó hiểu. Tuy nhiên giaosucan’s blog sẽ giải thích dần dần cho các bạn những thuật ngữ này theo cách đơn giản nhất


Ubiquitous Language



Image result for thuat ngu domain driven design
Hãy ví dụ 1 trường hợp đơn giản thế này, bạn là người Việt Nam nói tiếng Việt, cho bạn sang Thái chuyển giới, nghe bác sĩ nói toàn tiếng kiểu như
Bui hien noi tieng thai lan
Kết quả là chả hiểu gì, cho nên thế giới mới đẻ ra ngôn ngữ tiếng Anh để giao tiếp. Mọi người đều học tiếng Anh là mọi thứ OK.
Học tập ý tưởng này, Eric Evan mới đề xuất Ubiquitous language, một ngôn ngữ chung để cho developer và domain expert có thể hiểu được. Chẳng hạn về nghiệp vụ chuyển tiền thì domain expert sử dụng từ remittance, thì anh dev cũng phải sử dụng từ khóa này phản ánh trong source code của mình. Remittance trở thành 1 Ubiquitous language.
Tóm lại khi code, developer phải thể hiện Ubiquitous language trong source code của mình để domain expert khi đọc có thể hình dung ra được

Entity

Image result for domain driven design entity\
Nếu bạn hay lập trình hướng đối tượng thì sẽ hiểu rõ khái niệm về Object. Entity trong DDD thực chất là một object như vậy, tuy nhiên nó có thêm 1 thuộc tính là ID để định danh. Hiểu đơn giản theo ví dụ sau. Khi bạn đi làm cho 1 công ty nào đó thì bạn sẽ có một profile nhân viên bao gồm tên, tuổi… và mã nhân viên. Mã nhân viên là ID của bạn. và là duy nhất. Sau khi bạn nghỉ thì thông tin bao gồm ID của bạn sẽ bị xóa bỏ. Như vậy khái niệm nhân viên là 1 Entity trong DDD có định danh (ID) và có vòng đời tồn tại

Value Object

Khi bạn đi matxa thư giãn, sau khi được phục vụ full-service từ A tới Z thì bạn boa cho em tiếp viên 500K. Em tiếp viên đem 500K đấy về mua son phấn ở cửa hàng. Rõ ràng, em tiếp viên hay nhân viên cửa hàng không quan tâm đến số series hay nguồn gốc của tờ tiền 500K đấy. Các em chỉ quan tâm đến giá trị đồng tiền là 500K, còn tiền nào mà chả là tiền.
Trong DDD cũng vậy, Value Object thức chất vẫn là 1 Object nhưng không cần định danh. Đặc tính của object là Immutable, tạo ra rồi thì không thể thay đổi được. Tờ 500K thì muôn đời vẫn là 500K, ko thể biến nó về 200K được.
Đoạn code dưới là ví dụ của 1 Value Object
public class SomeValue
{
 public SomeValue(int value1, string value2)
 {
   this.Value1 = value1;
   this.Value2 = value2;
 }

 public int Value1 { get; private set; }
 public string Value2 { get; private set; }
}


Aggregate
Đây là một khái niệm khá khó hiểu trong Domain Driven Design, theo mô tả của Eric Evan như thế này
Aggregate is a pattern in Domain-Driven Design. A DDD aggregate is a cluster of domain objects that can be treated as a single unit. An example may be an order and its line-items, these will be separate objects, but it's useful to treat the order (together with its line items) as a single aggregate.
Loằng ngoằng khó hiểu quá, ta có thể hiểu Aggregate theo ví dụ thế này.
Một cô gái buổi sáng thức dậy, tự selfie rồi post lên facebook thế này.  
Girl shows facebook status


Sau khi em post lên là hàng trăm like, share comment, reply đủ cả như trên. Sau một vài ngày thả thính, em quyết định xóa status, bấm delete 1 cái toàn bộ các comment, like bay sạch trong vòng 1 nốt nhạc.
Như vậy cái status trên là một ví dự đơn giản của aggregate, nó là tổ hợp của nhiều object (Comment, like, share...) một dạng aggregate root, khi root bị xóa thì các object con của nó đều bay sạch.
Trong lập trình, aggregate root có thể mô tả dưới dạng 1 Json với cấu trúc phân tầng như sau


Những kiến thức về DDD vẫn còn nhiều, đón đọc phần sau

(Còn tiếp)

Powered by Blogger.