Domain Model được hiểu như thế nào?
02/03/2022 13:36 pm | Lượt xem : 6939
Ở bài đăng này, Tenten sẽ cung cấp cho bạn những thông tin về Domain Model và những layer liên quan đến Domain model. Hãy cùng đón đọc ở bài đăng dưới đây: Bạn đang muốn xây dựng một trang web của riêng mình
Contents
Domain Model được hiểu như thế nào?
Domain model là cách thức chúng ta hiểu biết về thế giới thực và những vấn đề mà ứng dụng của chúng ta cần giải quyết, là cách thức thiết kế kiến trúc ở mức độ hệ thống chứ không phải mức độ class như MVC hay những design pattern khác.
Ví dụ như bạn không thể xây dựng một hệ thống ngân hàng nếu bạn không có một chút hiểu biết gì về nghiệp vụ ngân hàng. Với cách thức làm thông thường khi xây dựng một hệ thống là chúng ta có có 1 bản thiết kế có thể là psd hay picture hay là một tệp tin spec, sau khi phân tích từ tệp tin design chúng ta xác định mình cần làm gì và bắt đầu code.
Domain model: là các class đại diện cho các domain, hiểu là các đối tượng thuộc business như Client, Report, Department,… chẳng hạn. Trong ứng dụng thực, các class đại diện cho kết quả tính toán, các class làm tham số đầu vào cho service tính toán,… được coi là domain model.
Entity: cũng là domain model nhưng tương ứng với table trong DB, có thể map vào DB được. Lưu ý chỉ có entity mới có thể đại diện cho data trong DB.
Các dạng data có hậu tố tương ứng, trừ entity. Ví dụ entity User không có hậu tố, nếu là domain model thì là UserModel, hoặc với DTO thì là UserDto,… cũng vậy.
Tuy nhiên với quy mô Domain Model lại ngược lại, chúng ta phải đi từ domain, hay nói cách thức khác là đi từ tổng quát nghiệp vụ của project sau đó mới đến phần design.Trong đó ứng dụng sẽ được phân thành 4 layer như sau:
User Interface Layer: làm nhiệm vụ biểu diễn thông tin trực quan cho user và dịch những user command ( ở đây chúng ta có thể hiểu là những sự kiện xảy ra trên giao diện khi được trigger ( nhấn nút trên những UI input control ) là những sẽ được dịch thành những command xử lý ở những tầng dưới.
Application Layer: Tầng này được thiết kế khá mỏng ( thin ) với ít logic xử lý chỉ để làm nhiệm vụ coordinate những Activity của Application và không chứa Business Logic, nó không chứa state của những Business Object mà chỉ chứa state của Application Task Progress. Chúng ta có thể tưởng tượng phần này gần giống với những Controller trong quy mô MVC chỉ làm nhiệm vụ forward những task đến nơi cần xử lý.
Domain Layer: Đây là trái tim của ứng dụng ( Business Software ), những state của Business Object đều tọa lạc ở đây. Việc lưu trữ ( persistence ) những Business Object và những state của nó được chuyển giao cho tầng Infrastructure ở dưới. Trái tim của quy mô này đó là ở phần Domain Layer, những nghiệp vụ sẽ được mô tả tại đây, và cấu trúc source code rất được tổ chức theo tên những nghiệp vụ chứ không để kiểu view, controller như truyền thống
Infrastructure Layer: Đóng vai trò đồng tình thư viện ( supporting libraries )cho những tầng khác. Nó đồng tình cơ chế tiếp xúc ( communication ) giữa những Layer với nhau, cũng như đồng tình những chức năng khác như lưu trữ ( persistence ) những Business Object của tầng Domain model.
Xây dựng kiến thức Domain Model
Để xây dựng kiến thức về Domain Model bạn phải là người trực tiếp ở trong ngành nghề đó, nhưng nếu thế thì bạn lại không phải là coder nữa. Vấn đề là bạn cần ngồi xuống đàm đạo với những người liên quan có kinh nghiệm và kiến thức trong ngành nghề đó.
Ví dụ: Khi bạn muốn xây dựng hệ thống quản trị đường bay, rõ ràng là chỉ những người trong ngành hàng không mới đủ kiến thức, và mỗi khi họ nói về một khái niệm mới nào bạn liên tưởng ngay đến một object, properties hay method trong lập trình, cách thức máy bay cất cánh, đường bay như vậy nào làm bạn liên tưởng đếndriven cách thức điều phối của từng class cũng như cách thức mà một máy bay có thể bay từ địa điểm này đến địa điểm khác.
Tuy nhiên mỗi người một ngành nghề, để chuyển hóa từ thông tin mà những người trong ngành hàng không nói sang những thực thể trong lập trình chúng ta cần phải có một ngôn ngữ chung hay còn gọi là Ubiquitous language.
Ubiquitous Language
Ví dụ: Với Domain model ví dụ ngành 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 tôi. 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 tôi để domain expert khi đọc có thể tưởng tượng ra được.
Entity
Nếu bạn hay lập trình hướng đối tượng người dùng thì sẽ hiểu rõ khái niệm về Object. Entity trong Domain model thực chất là một object như vậy, tuy vậy nó lại thêm 1 thuộc tính là ID để định danh.
Hiểu đơn giản theo ví dụ sau. Khi bạn là nhân viên của Sun* bạn sẽ có thông tin trên hệ thống wsm và có mã nhân viên B****** , tên tuổi vv.. trong hệ thống Domain model và khi bạn nghỉ công ty thì mọi thông tin của bạn sẽ bị xóa khỏi. Như vậy khái niệm nhân viên đó là 1 Entity.
Value object
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. Một value object sẽ không có ý nghĩa gì nếu không được tích hợp một entity nào đó.
Ví dụ: bạn là một thực thể nhân viên, rõ ràng thỉnh thoảng bạn không cần phải quan tâm mã nhân viên của tôi, nhưng công ty lại quan tâm để lưu trữ thông tin và trích xuất thông tin về bạn trải qua mã nhân viên, và mã nhân viên ấy thực sự vô nghĩa nếu không được gán vào một nhân viên cụ thể, ở đây đó là bạn. Và đương nhiên mã nhân viên của bạn thì không thay đổi đúng không nào.
Tính tương đồng (Aggregate)
Khá là trừu tượng, tuy vậy bạn cũng có thể hiểu đơn gian đó là khi một thực thể bị xóa khỏi nó sẽ bị kéo theo xóa khỏi những thực thể khác. Chẳng hạn bạn có 1 bài viết trên Facebook, bài post ấy là 1 entity post, một post lại có rất nhiều entity comment và entity like, nếu bạn xóa bài post ấy đi thì kéo theo comment và like cũng bị xóa khỏi.
Bạn đang muốn xây dựng một trang web của riêng mình
Lời kết
Trên đây là một số khái niệm quan trọng về Domain model và những thông tin liên quan tới Domain model, vấn đề này thực sự là một quy mô rất hay nhưng lại khó tiếp cận vì khá là khó hiểu. Hy vọng những san sẻ này sẽ giúp ích cho chúng ta trong quá trình làm việc hay đơn giản chỉ là dùng một quy mô mới trong quá trình xây dựng dự án. Cảm ơn mọi người đã theo dõi