Hỏi về Thiết kế hướng đối tượng: Anemic Domain Model vs Rich Domain Model

Chào anh chị, trên thực tế em tạm thấy các class model, entity chỉ được dùng để làm khuôn tạo dữ liệu. Còn các use case như Đăng nhập sẽ được các layer hay class khác đảm nhiệm.

Nhưng trong sách giáo khoa thì có rất nhiều class chứa thuộc tính của entity cùng các method cụ thể luôn. Không biết liệu code theo phong cách này có ổn không khi mà hệ thống lớn lên ạ ?

Xin được chia sẻ trải nghiệm, em cảm ơn ạ !

1. Sách giáo khoa:

2. Thực tế:

1 Like

Khoản này thì theo thực tế đi em.

1 Like

Hỏi ngược lại bạn một xíu là mục đích code của sách giáo khoa là gì? Là để dạy cơ bản OOP hay là dạy cách code chuẩn công nghiệp?
Giống như việc dạy về đệ quy thì sẽ implement hàm tính giai thừa def fact(n): return 1 if n<2 else n*fact(n-1) chứ không dạy implement kiểu lặp hay dùng hàm có sẵn cả…
Sau này khi ra thực tế, cũng có lúc code tốt nhất không phải là code chạy nhanh nhất hay là code tốn ít resources nhất, mà là code cùi bắp nhưng được viết kịp deadline mà thôi…

Em suy nghĩ 1 ngày vẫn chưa tìm được lý do kỹ thuật hợp lý ở trường hợp này.

Em thấy code thực tế thượng vàng hạ cám rất nhiều, do đó không nghĩ nó có 1 quy chuẩn về kiến trúc,
em xin hỏi bác là xây dựng class theo sách giáo khoa có nhược điểm gì mà rất ít người dùng ? Nó có vi phạm nguyên tắc nào không ?

Hai cách nêu trên là các phương pháp mô hình hóa phần business logic:

  • Cách 1 là rich domain model, phân chia logic cho các domain object (có data + behavior)
  • Cách 2 là anemic domain model, tách thành data structure + class xử lý trên đó (thường là Service)

Đúng như bạn nói, thực tế dùng cách 2 rất nhiều, vì đơn giản và đủ tốt cho hầu hết ứng dụng. Nhược điểm là khó mở rộng khi business phức tạp. Vì suy cho cùng anemic domain model chỉ là procedural programming (function + struct).

Dùng rich domain model thì có 1 vấn đề lớn nhất là mapping giữa domain layer và database. Việc này cần nhiều kinh nghiệm xử lý để tránh impact performance (xem thêm persist aggregate trong DDD).

3 Likes

Cảm ơn bác nhiều ạ, em sẽ xem thêm về những nguồn bác khuyên bảo

Code trong sgk chỉ giúp người học hiểu được một kiến thức nào đó nên nó không cần đề cao quy chuẩn.

Code trong thực tế thì thượng vàng hạ cám tùy thuộc vào trình độ dev, quy mô và yêu cầu của dự án, khách hàng. Mục tiêu tiên quyết là giải quyết được vấn đề. Tuy nhiên ở những dự án lớn thì cần phải cấu trúc để đảm bảo tính logic về nghiệp vụ, dễ dàng bảo dưỡng, phát triển tính năng, phối hợp nhiều người làm song song… etc.
Nhiều dự án còn bắt buộc theo convention, chính xác đến từng cách đặt tên, dấu chấm, dấu cách, không được trộn lẫn lộn C và C++ …

2 Likes

Bạn có thể tìm hiểu thêm về DDD (Domain Driven Design). Cùng method nhưng đặt ở layer, class khác nhau thì nó làm việc khác nhau.

VD
Student change_password, có thể hash pwd, set lại property, validate “business logic” nhưng ko thực hiện IO vào DB, api calls,etc.
API Controller change_password có thể làm việc validate request cơ bản và format response. UserAccountService change_password có thể làm việc IO vào db để lấy ra entity, gọi entity change_password, save entity,etc

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?