thảo luận Clean Architecture có thật sự giúp ta code tốt hơn?

  • Người tạo chủ đề Người tạo chủ đề soibac123bk
  • Ngày bắt đầu Ngày bắt đầu
- Mình có đọc cuốn Clean Architecture có tác giả Robert Martin, lúc mới đọc thì cảm thấy như tìm được chân lý vậy nhưng sau khi áp dung nó vào trong công việc thì thấy thưc sự có nhiều vấn đề, cụ thể như sau:

  • Khối lượng code sẽ phình ra rất nhiều, và tồn tại rất nhiều boilerplate => code rất chán.
  • Trong giai đoạn đầu của project, khi mà requirements thay đổi liên tục thì để sửa code được implement theo clean architecture rất tốn thời gian cụ thể: phải sửa entities, repository, business logic ...
  • Hầu hết chúng ta đang sử dụng framework và hầu hết những framework này đều không tuân thủ Clean Architecture, nên để áp dụng nó mình phải bỏ những phần được framework hỗ trợ, và chọn cách đi lòng vòng hơn để tuân thủ SOLID. Đôi lúc thấy bản thân mình như chế tạo lại cái bánh xe vậy.

Đó là những khó khăn mình đang gặp phải khi áp dụng clean architecture vào các dự án hiện tại của mình. Để áp dụng được thì không khó, nhưng thực sự thấy có quá nhiều vấn đề. Mong các cao nhân trên đây chia sẻ về kiến trúc này và chia sẻ thêm về kiến trúc code trong các dự án hiện tại của mọi người.
Mình cũng là người áp dụng các nguyên lý trong Clean Architecture (CA) khá thường xuyên.
Mình có một số chia sẻ sau:
1. Về SOLID. Những nguyên lý ở mức class như SOLID thì mình thấy là anh em lập trình viên OO nên hoặc thậm chí phải nắm vững và áp dụng thường xuyên.
Ngay nay, DDD đang quay lại như một xu thế, và SOLID có thể được áp dụng tốt trong vùng từ Use Case Layer cho tới Domain Layer (2 vòng tròn trong cùng của Clean Architecture).
2. Về Component Principles. Đây là các nguyên lý hướng mình đến việc xây dựng ứng dụng từ các khối module. Nó vẫn rất ổn khi áp dụng vào 2 lớp trong.
3. Framework, là thứ mà Robert C. Martin (tác giả của Clean Architecture) rất hạn chế khuyên dùng. Ông thường nói Framework làm quá nhiều thứ mà mình không cần trong những ứng dụng cụ thể. Mình thì thấy không nên khắt khe quá. Mình vẫn dùng, nhưng ở tầng Adapters trong Hexagonal.

Đúng là áp dụng CA ngay ban đầu là khó và không nên.
4. Tham chiếu sang DDD, mình thấy có một hướng đi rất phù hợp như thế này. Trong tổ chức, phần mềm thường sẽ phục vụ một chiến lược kinh doanh nào đó. Và tổ chức đó hoạt động trong một domain. Mình cần xác định ra các subdomain. Có 3 loại:
a. Core subdomain: là nơi cần tối ưu để mang lại sự cạnh tranh với đối thủ trên thị trường. Ví dụ, mình viết ứng dụng bán hàng thì ứng dụng này phải đảm bảo yêu cầu như nhanh, chịu tải lớn, đáp ứng yêu cầu thử nghiệm nhanh nhất có thể. Vậy mình cần phải trang bị cho nó khả năng thay đổi thật nhanh về mặt logic. Vậy DDD với Domain Model là hướng đi hợp lý. Ngoài ra, ở đây phải tập hợp những con người giỏi nhất của tổ chức.
Bạn không thể cạnh tranh nếu như bạn triển khai ứng dụng trong vùng này bằng các giải pháp như Open source, vì đối thủ chẳng mấy chốc cũng bắt kịp bạn bằng chính giải pháp đó.
b. Supporting subdomain: là nơi có những ứng dụng mang tính hỗ trợ cho các ứng dụng core subdomain. Đây là nơi có thể áp dụng các cách lập trình đơn giản CRUD, không cần tối ưu nhiều. Nguồn lực con người cũng đặt vừa phải. Có thể là những người trẻ, cần trải nghiệm thêm.
c. Generic subdomain: là nơi mà mình không chú trọng, có thể mang tính công nghệ cao nhưng không thuộc chiến lược phát triển của công ty. Ví dụ như Map, ERP,... Những ứng dụng này mình có thể triển khai với open source hoặc mua trên thị trường.

5. Có một điều nữa là khi phát triển ứng dụng trong một domain mà chưa rõ nhiều về domain đó, theo kiểu trong giai đoạn startup cần thử nghiệm nhiều chẳng hạn, thì nên phát triển ứng dụng không phân chia ranh giới vật lý như Microservices, lúc đó nên sử dụng các nguyên lý CA để phân chia module rồi có thể triển khai trên một vài Monolith cũng được. Modular Monolith là bước chuẩn bị tốt để nếu sau này business tăng trưởng thì chuyển sang Microservices.

Tóm lại, mình thấy là các nguyên lý CA vẫn đúng, chỉ là khi nào cần áp dụng, ở phạm vi nào, nơi nào thôi. CA giúp code dễ bảo trì hơn nên mình nghĩ nếu bạn thấy boilerplate code nhiều thì có thể cách đóng gói component hiện tại đang có vấn đề. Và CA cũng nhấn mạnh rằng kiến trúc luôn thay đổi chứ không phải làm ra ban đầu là áp dụng mãi cho ứng dụng.
 
mình đang thấy tư tưởng của DDD và clean architecture không khác nhau nhiều lắm. Mình không phủ nhận những điểm mạnh của DDD hay clean architecture như khi triển khai thì rất tốn thời gian và không phù hợp với những project dạng startup
Theo mình thì Clean Architecture hướng theo kỹ thuật nhiều hơn, nó giúp mình dễ maintain code, đảm bảo chất lượng.
Còn DDD thì nó khá rộng, mình thấy nó là "phương pháp luận" phát triển phần mềm thì đúng hơn. Trong DDD có những yếu tố cover quá trình phân tích thiết kế như strategic design, tactical design, ubiquitous language, hay các buổi Event Storming. Có một điều mọi người hay nhầm rằng DDD là phải có Aggregates, Entities, Domain Services,... Thực ra không hẳn. DDD là Domain-Driven Design là "Thiết kế hướng miền", tập trung vào vùng Domain logic. Nếu miền của mình đơn giản thì mình code CRUD vẫn OK, nếu miền của mình ở mức trung gian thì có thể sử dụng Active Record, nếu phức tạp nữa và biến động nhiều thì sử dụng Domain Model,...
 
Theo mình thì Clean Architecture hướng theo kỹ thuật nhiều hơn, nó giúp mình dễ maintain code, đảm bảo chất lượng.
Còn DDD thì nó khá rộng, mình thấy nó là "phương pháp luận" phát triển phần mềm thì đúng hơn. Trong DDD có những yếu tố cover quá trình phân tích thiết kế như strategic design, tactical design, ubiquitous language, hay các buổi Event Storming. Có một điều mọi người hay nhầm rằng DDD là phải có Aggregates, Entities, Domain Services,... Thực ra không hẳn. DDD là Domain-Driven Design là "Thiết kế hướng miền", tập trung vào vùng Domain logic. Nếu miền của mình đơn giản thì mình code CRUD vẫn OK, nếu miền của mình ở mức trung gian thì có thể sử dụng Active Record, nếu phức tạp nữa và biến động nhiều thì sử dụng Domain Model,...

Entity & AggregateRoot là core concepts khi làm việc với Domain layer rồi
Entities are one of the core concepts of DDD (Domain Driven Design). Eric Evans describes it as "An object that is not fundamentally defined by its attributes, but rather by a thread of continuity and identity".
Domain logic của bạn đang hiểu nó thể hiện ở Domain Service. Còn term "Thiết kế hướng miền" này tôi đang hiểu là bạn việt hóa từ "Domain Driven Design". Thì bạn có thể xem lại định nghĩa DDD dưới đây
DDD mostly interest in the Domain and the Application layers, rather than the Infrastructure and the Presentation layers.
 
architecture quan trọng nhé, nhất là Ai hiện tại, architecture tào lao là bể ngay, architecture nên build tập trung vào giải quyết câu hỏi với nhu cầu hiện tại vì sao có và cần cái này? ko phải cái gì cũng áp vô
 
có bác nào tiên phong áp dụng mấy architecture này vào project cty chưa
Dự án nào cũng áp dụng cả mà bác.
Quan trọng là áp dụng được tới mức nào và duy trì được tới mức độ nào.
Mấy nguyên tắc trong cuốn này thực ra đôi khi chính bản thân dự án hoặc chúng ta đã áp dụng nhưng lại không biết cho đến khi đọc lý thuyết của cuốn này.
 
nguyên lý xuyên suốt chắc vẫn là low coupling + high cohesion

không muốn phụ thuộc vào những thằng dễ thay đổi => tách lớp,cung cấp interface (ý tưởng cho repository + infra khác)

gom code thay đổi cùng nhau vào 1 module ( ddd )

dùng ddd hay không phụ thuộc vào xác định domain: mỗi domain có đủ rõ ràng ( vd thuộc về team khác nhau, phòng khác nhau) hay chỉ là các module nhỏ user, product, ...

dùng clean thì phải xem công nghệ sử dụng có thay đổi nhiều, codebase có đủ to hay chỉ lập trình hàm là đủ

tất nhiên còn nhiều nguyên lý khác
 
thêm convention là nó follow architecture này luôn à fen
hay mình config tay trc
Lúc đầu tôi cho nó convention nhưng nó vẫn tạo structure tào lao, nên tôi phải config bằng tay 1 example rồi bảo nó theo structure. Cứ thêm module gì thì nó follow theo structure hiện tại rồi thêm file thêm code tương ứng.
 
Hồi tôi mới đi làm cũng được tham gia dự án Clean Architecture. Dự án chắc build được tầm 6 tháng thì cho toàn junior vào code. Mở source ra toàn god service ngàn dòng, domain entity chỉ là cái data object, business logic thì quăng xuống infra cho cùng chỗ với 3rd lib 😂
 

Thống kê chủ đề

Ngày tạo
soibac123bk,
Người trả lời cuối
CSharpCorner,
Trả lời
253
Lượt xem
50.347
Quay lại
Lên đầu trang