tonghoangvu
Member
Sẵn topic về clean architecture nên mình tiện hỏi luôn. Khi các bác dùng clean architecture thì các bác có dùng DDD để modeling business logic không? Hay vẫn theo cách cũ là data objects + xử lý trong services?
cái này tuỳ hoàn cảnh, em thì có, đã là DDD thì business logic k được dính với bất kỳ một cái gì liên quan đến tầng infrastructure trong đó, đó là nguyên tắc, Còn khi apply vào thực tế thì em nghĩ còn tuỳ vào điều kiện cuj thể để đưa ra quyết địnhSẵn topic về clean architecture nên mình tiện hỏi luôn. Khi các bác dùng clean architecture thì các bác có dùng DDD để modeling business logic không? Hay vẫn theo cách cũ là data objects + xử lý trong services?
thì req như vậy thì chia service thôi? ủa có gì sai? nói linh tinhô bị sao đấy, tôi nói rõ requirement của tôi r đấy, ô giải quyết đi, tôi có vẽ vời thêm chức năng gì đâu ?
Thường thì nếu như domain object to quá thì fence nên nghĩ tới việc tìm cách chia nhỏ nó ra là được.đây là pet project mình đang tạm setup.
Xem tệp đính kèm 2105121
Gồm có: DDD + CQRS + Clean Architecture (C#)
Có vài điều mình vẫn còn đang khá lăn tăn.
1/ DDD khá cồng kềnh, mapping giữa internal properties(getters, setters bên Java) bằng constructor --> constructor bị phình to khá nhiều nếu entity có nhiều properties
2/ để gọi là clean thực sự thì ko hẳn, vì để tháo bớt depedency từ Domain Layer thì lại dùng interface để "cheat" dependency diagram.
3/Khi thử sử dụng DDD, khi load cả AggregateRoot (nhiều entities) lên memory thì kinh khủng. Phải kèm thêm rất nhiều Design khác đi kèm để tăng performance. Tầng Domain ko kèm DB ở bên trong, nên hầu như mọi thứ đều làm trên memory. Trước đây cũng vì code kiểu này mà product mình từng làm chết trên production vì host trên con server lởm (share resource VPS)
4/ DDD + Clean code + CQRS thực sự RẤT CỒNG KỀNH và RẤT NHIỀU BOILERPLATE code. Cụ thể là boilerplate ở CQRS.
Flow Cơ bản của mình là: API Controller -> Command -> Command Handler -> Repository -> UnitOfWork(Db)
5/ Phần test, mình không thích xài Mock Test lắm, nhưng khá là đồng tình là có thể setup và móc thẳng 1 DB test(in memory db)
mình còn tính làm thêm phần event sourcing nữa. Đã setup thử cho 1 entity, cũng khá ổn, mà để stress test thử xem coi chịu đc nhiệt ko. Ko đc thì phải coi lại phần designThường thì nếu như domain object to quá thì fence nên nghĩ tới việc tìm cách chia nhỏ nó ra là được.
Còn từ Api Controller -> Command Handler -> Repo thì fence ko phải implement tầng service như bình thường thì mình ko nghĩ là phải boilerplate nhiều gì đâu. Xài Cqrs không thôi với flow như fence kể thì ổn mà.
.Có builder pattern mà bác1/ DDD khá cồng kềnh, mapping giữa internal properties(getters, setters bên Java) bằng constructor --> constructor bị phình to khá nhiều nếu entity có nhiều properties

nó vẫn là reinvent the wheel cái wrapper cho getter/setter. Mình hơi dị ứng với chain call vì nó là code smell trong Clean CodeCó builder pattern mà bác![]()
. Dev hay bị cuốn vào Overengineering, nhiều khi một cái service rất đơn giản vài ngàn user, mà nhồi một lố architect + công nghệ vô 
đúng. Để áp dụng DDD đúng như Martin Flower hay như trong sách thì nó rất là bí bách, vì quá nhiều layer. Cứ mỗi layer thì phải làm data mapping -> rất dễ bị convert data error hoặc bị duplicate data model.Đợt tôi có xem video này quan điểm khá hay về clean code. Chung quy lại là tùy dự án mà áp dụng thôi, code tốt và dễ maintain chưa chắc cần follow clean code. Dev hay bị cuốn vào Overengineering, nhiều khi một cái service rất đơn giản vài ngàn user, mà nhồi một lố architect + công nghệ vô
Cái mapping thì đúng là khá cồng kềnh nhưng mà nên follow như thế. Mỗi layers nên có 1 mapping riêng để tránh bug, nhiều thằng dev nó get set loạn xạ cả lên mà ko qui định rõ ràng thì nhiều lúc sẽ dính reference change + việc set nó dupplicate rất nhiều nơi.mình còn tính làm thêm phần event sourcing nữa. Đã setup thử cho 1 entity, cũng khá ổn, mà để stress test thử xem coi chịu đc nhiệt ko. Ko đc thì phải coi lại phần design.
Tựu chung lại là app CRUD ko nên làm DDD, xài clean arch + CQRS là ổn.
1 phần nữa thường fence sẽ thiếu đó là phần integration với các services khác qua rest hoặc qua message queue thường thì sẽ đặt ở sau tầng repository. Và tầng này cũng phải có data object riêng vì liên quan nhiều tới external communication.cứ qua mỗi 1 mapper là chắc chắn sẽ có bug nếu map sai. Vì thế phải thêm 1 tầng test nữa, khá rối rắm. Mình cứ đơn giản, đã thêm service layer và đã bỏ.Cái mapping thì đúng là khá cồng kềnh nhưng mà nên follow như thế. Mỗi layers nên có 1 mapping riêng để tránh bug, nhiều thằng dev nó get set loạn xạ cả lên mà ko qui định rõ ràng thì nhiều lúc sẽ dính reference change + việc set nó dupplicate rất nhiều nơi.
Nên thằng domain object sẽ chỉ có private set thôi.
Fence code nhiều thì thấy nó ổn1 phần nữa thường fence sẽ thiếu đó là phần integration với các services khác qua rest hoặc qua message queue thường thì sẽ đặt ở sau tầng repository. Và tầng này cũng phải có data object riêng vì liên quan nhiều tới external communication.
Cái mình bực nhất là các mapper thôi, kinh nghiệm của mình thì nên né những cái như AutoMapper ra và tuyệt đối ko dùng. Vừa tốn thời gian học library code vừa khó clean.
Cẩn thận thôi, code nhiều thì sẽ ko có cái bug nào cả. Xưa dính mấy bug về reference mới khó chứ bug về việc mapping liếc mắt cái nhìn ra ngay, sửa đơn giảncứ qua mỗi 1 mapper là chắc chắn sẽ có bug nếu map sai. Vì thế phải thêm 1 tầng test nữa, khá rối rắm. Mình cứ đơn giản, đã thêm service layer và đã bỏ.
mình cũng ko dùng Mapper lib nào cả. Tự map tay thôi vì kinh nghiệm trước có làm 1 dự án nó map projection bị sai. Nên từ đó map tay sẽ tốt hơn.
Mình cũng code khá nhiều nên cũng muốn làm gì đó đơn giản là đc, vừa đủ tầng cho clean, vừa ko quá cồng kềnh.

Nhiều layer thì liên quan gì DDD nhỉ? DDD là cách model business thành code mà.Để áp dụng DDD đúng như Martin Flower hay như trong sách thì nó rất là bí bách, vì quá nhiều layer.
à mình nhầm, phải là constraint của DDD.Nhiều layer thì liên quan gì DDD nhỉ? DDD là cách model business thành code mà.
1. b làm cách nào thì nếu đã clean code, mỗi component sẽ đều có prop riêng, chứ ai lại đi dùng ouput của 1 component khác.đây là pet project mình đang tạm setup.
Xem tệp đính kèm 2105121
Gồm có: DDD + CQRS + Clean Architecture (C#)
Có vài điều mình vẫn còn đang khá lăn tăn.
1/ DDD khá cồng kềnh, mapping giữa internal properties(getters, setters bên Java) bằng constructor --> constructor bị phình to khá nhiều nếu entity có nhiều properties
2/ để gọi là clean thực sự thì ko hẳn, vì để tháo bớt depedency từ Domain Layer thì lại dùng interface để "cheat" dependency diagram.
3/Khi thử sử dụng DDD, khi load cả AggregateRoot (nhiều entities) lên memory thì kinh khủng. Phải kèm thêm rất nhiều Design khác đi kèm để tăng performance. Tầng Domain ko kèm DB ở bên trong, nên hầu như mọi thứ đều làm trên memory. Trước đây cũng vì code kiểu này mà product mình từng làm chết trên production vì host trên con server lởm (share resource VPS)
4/ DDD + Clean code + CQRS thực sự RẤT CỒNG KỀNH và RẤT NHIỀU BOILERPLATE code. Cụ thể là boilerplate ở CQRS.
Flow Cơ bản của mình là: API Controller -> Command -> Command Handler -> Repository -> UnitOfWork(Db)
5/ Phần test, mình không thích xài Mock Test lắm, nhưng khá là đồng tình là có thể setup và móc thẳng 1 DB test(in memory db)
mình chưa hiểu ý này của bạn phàn output của component khác lắm.1. b làm cách nào thì nếu đã clean code, mỗi component sẽ đều có prop riêng, chứ ai lại đi dùng ouput của 1 component khác.