Clean code 18 Jun, 2026 6 phút đọc

Clean Architecture – Tổng quan

buiducduy111
Founder · Fullstack Engineer

I. Bài toán

Framework, Libs … liên tục được cập nhật và ngày càng hiện đại và tối ưu. Nếu xác định làm một Software lớn và đi đường dài, làm sao để sẵn sàng trong việc đổi Framework, đổi Lib một cách tự tin nhất mà không cần code lại quá nhiều?

Clean Architecture chính là một trong những cách tổ chức kiến trúc hệ thống để giải quyết tối ưu vấn đề trên.

Một ví dụ đơn giản:

Hệ thống sử dụng WebForm viết năm 2010, sử dụng SQL Server với raw query. Tới nay là 2026, WebForm đã rất nỗi thời, cũng không còn ai dùng raw query nữa mà thay thế bằng EF Core.

Nếu dự án ban đầu đi theo kiến trúc Clean Architecture, việc update Framework lên ASP.NET Core & Lib EF Core sẽ vô cùng dễ dàng và “tự tin” do không hề động tới tầng nghiệp vụ, nó gần như chỉ thay thế tầng “giao diện”

II. Các tầng chính

Presentation
    ↓
Application
    ↓
Domain
    ↑
Infrastructure

Trên đây là các tầng chính của kiến trúc Clean Architecture. Bây giờ, để các phần lý thuyết ở dưới tường minh hơn, mình sẽ có một bài toán đơn giản và kinh điển mà sinh viên nào cũng học khi học lập trình như sau:

“Viết chương trình quản lý sinh viên, có thể thêm sửa xóa sinh viên. Yêu cầu: có thể tìm kiếm theo tên. Mỗi sinh viên có các thông tin : tên, năm sinh, quê quán”

1. Domain layer

Là trái tim của nghiệp vụ “giữ những quy tắc đúng về nghiệp vụ, đúng kể cả khi không có phần mềm này.”

Tầng này độc lập nhất, chỉ chứa nghiệp vụ, không quan tâm tới Database, Framework, Libs…

Ví dụ với bài toán trên, tầng này sẽ trả lời:

  • Thông tin sinh viên bao gồm gì và validate dữ liệu sinh viên (ví dụ tuổi >= 18)
  • Có thao tác nào đối với mỗi sinh viên (thêm, sửa, xóa)

Ngay cả khi không có phần mềm quản lý sinh viên này thì logic và thông tin của sinh viên vẫn luôn đúng.

2. Application Layer

Chưa toàn bộ User case hệ thống, mô tả các use case cụ thể bằng cách điều phối các đối tượng Domain.

Tầng này cũng là độc lập với Database, Framework, Libs …

Ví dụ với bài toán trên, tầng này sẽ trả lời:

Quy trình triển khai thêm sửa xóa, tìm kiếm sinh viên thế nào. Tầng này sẽ chỉ mô tả logic thực thi.

Ví dụ: để thêm 1 sinh viên ví dụ sẽ cần

  • Tìm lớp đang trống
  • Lấy toàn bộ sinh viên ở lớp
  • Kiểm tra xem sinh viên đã có chưa
  • Nếu chưa có thì thêm vào

Logic này ăn chặt chẽ theo nghiệp vụ của hệ thống.

Nếu dự án nhỏ, chúng ta hoàn toàn viết chung 2 tầng này vào “Core”.

3. Infrastructure Layer

Theo bài toán trên, tầng này chính là nơi có thể lựa chọn Lib kết nối tới Database và biết Database đang sử dụng là loại nào.

Ở đây, mình ví dụ hệ thống cũ của mình dùng SQL Server nhưng giờ chuyển sang MongoDB, chỉ cần thêm 1 dự án mới và tầng Presentation sẽ reference vào loại DB muốn dùng

4. Presentation Layer

Đây là tầng trên cùng, có thể là “Web”, “API”, “Desktop”, “Mobile” … nơi cho phép user thao tác với hệ thống, phụ thuộc chặt chẽ vào Framework.

Theo bài toán đặt ra, nếu tôi muốn triển khai dự án đa nền tảng, hoặc đơn giản nâng cấp Framework từ WebForm lên ASP.NET core thì chỉ cần thêm dự án mới, tầng này là tầng UI nên rất ít ảnh hưởng tới nghiệp vụ chính (chỉ bị nếu Dev code sai logic UI, ví dụ gọi hàm tính điểm trung bình lại gọi sang hàm tính tổng điểm…)

Bây giờ, chúng ta có bức tranh tổng quan cấu trúc dự án

Phần Core gần như sẽ ổn định theo nghiệp vụ của dự án, các phần Infrastructure, Presentation có thể thay đổi theo thời gian: ví dụ đổi loại DB, đổi ORM framework, đổi UI Framework …

III. Kết luận

Clean Architecture là một “tư tưởng”, bạn không nhất thiết phải tổ chức thư mục một cách quá máy móc, chỉ cần đáp ứng các yêu cầu như bài toán đặt ra thì dự án của bạn chính là một Clean Architecture.

Tác giả

buiducduy111

Founder trong lĩnh vực lập trình. Viết code từ 2009, khởi nghiệp từ 2018. Chia sẻ về kỹ năng lập trình, khởi nghiệp và tech updates — từ trải nghiệm thật.