Bài 6 · Vận dụng · 20 phút
Level 4 & sơ đồ bổ trợ
Biên soạn bởi Nguyễn Anh Tuấn
Level 4 (Code) bằng sơ đồ lớp UML - thường tự sinh hoặc bỏ qua; và ba sơ đồ bổ trợ: System Landscape, Dynamic (luồng chạy), Deployment (ánh xạ hạ tầng).
Sau Component, mức zoom cuối là Code: zoom vào MỘT component để thấy nó được hiện thực bằng những lớp (class), interface, hàm nào - thường vẽ bằng sơ đồ lớp UML.
Nhớ lại sơ đồ Component (mức 3) - API của Ngân Hàng Số gồm các component như Transfer Service. Mức Code zoom vào MỘT component đó để thấy nó là vài class (như Transfer Service dưới đây):
[Component: Spring MVC]
Sign-in Controller
Xử lý đăng nhập, cấp token.
[Component: Spring MVC]
Accounts Controller
Trả về số dư & lịch sử.
[Component: Lớp nghiệp vụ]
Transfer Service
Thực hiện chuyển khoản.
[Component: Lớp tích hợp]
Core Banking Facade
Bọc giao tiếp với hệ thống lõi.
[Component: Lớp truy cập]
Database Gateway
Đọc/ghi cơ sở dữ liệu.
[Hệ thống ngoài]
Hệ thống lõi (Core Banking)
Tài khoản & giao dịch.
Một component 'Transfer Service' gồm vài class (minh hoạ mức Code)
// Component "Transfer Service" - ben trong, no la vai class:
interface TransferPolicy {
check(amount: number, balance: number): boolean;
}
class DailyLimitPolicy implements TransferPolicy { /* ... */ }
class TransferService {
constructor(private policy: TransferPolicy) {}
transfer(from: string, to: string, amount: number) { /* ... */ }
} - ▸Mức Code = các phần tử trong mã nguồn: class, interface, hàm.
- ▸Một component (mức 3) thường gồm vài class ở mức Code (mức 4).
- ▸Đây là mức chi tiết nhất - và cũng đổi nhanh nhất.
- ▸Quá chi tiết: vẽ ra cũng ít người đọc, mà tốn công.
- ▸Lạc hậu tức thì: đổi một class là sơ đồ đã sai.
- ▸Đã có công cụ: IDE/plugin tự sinh sơ đồ UML từ code khi bạn THẬT SỰ cần.
Trung thực
Bốn mức Context/Container/Component/Code trả lời câu "hệ thống này GỒM gì". Nhưng có những câu hỏi khác cần loại sơ đồ khác. C4 gợi ý ba sơ đồ bổ trợ:
| System Landscape | Nhiều hệ thống của cả tổ chức cùng một bức - toàn cảnh ai nối ai. |
| Dynamic | Một kịch bản chạy theo thứ tự, các bước được đánh số. |
| Deployment | Ánh xạ container xuống hạ tầng: máy chủ, cloud, thiết bị. |
System Landscape zoom ra XA hơn cả Context: thay vì một hệ thống ở giữa, nó cho thấy nhiều hệ thống của tổ chức và quan hệ giữa chúng. Hữu ích cho kiến trúc sư doanh nghiệp muốn thấy bức tranh tổng.
Dynamic không nói "gồm gì" mà nói "chạy ra sao": chọn một kịch bản (vd đăng nhập, chuyển khoản) rồi đánh số các bước theo thứ tự dữ liệu chảy qua các phần tử.
- ▸Landscape: nhiều hệ thống, mức cao hơn Context - bản đồ cả vùng thay vì một thành phố.
- ▸Dynamic: dùng chính phần tử của mô hình, thêm số thứ tự bước - kể một câu chuyện.
- ▸Cả hai đều TÙY CHỌN: chỉ vẽ khi có câu hỏi cụ thể cần tới.
Các mức Context/Container/Component cố tình không nói "cái gì chạy ở đâu". Deployment lấp chỗ đó: nó ánh xạ mỗi container tới một node hạ tầng - máy chủ vật lý, máy ảo, container hạ tầng, vùng cloud, hay thiết bị của người dùng.
- ▸Node = nơi chạy: máy chủ, máy ảo, cluster, vùng cloud, điện thoại người dùng.
- ▸Một container có thể chạy trên nhiều node (vd API nhân bản trên 3 máy chủ để chịu tải).
- ▸Đây là sơ đồ ops chờ đợi - và là chỗ Docker/Kubernetes thực sự xuất hiện đúng nghĩa.
Mẹo
| "Hệ thống làm gì, ai dùng?" | Context |
| "Hệ thống gồm khối chạy nào?" | Container |
| "Bên trong một container có gì?" | Component |
| "Toàn cảnh tổ chức ra sao?" | System Landscape |
| "Luồng X chạy theo thứ tự nào?" | Dynamic |
| "Cái gì chạy ở đâu?" | Deployment |
Bước tiếp theo
Câu hỏi thường gặp
Không. Trong thực tế gần như luôn bỏ qua. Nó quá chi tiết và đổi liên tục theo code, nên vẽ tay là phí công. Khi thật sự cần xem quan hệ lớp, hãy để IDE tự sinh sơ đồ UML từ code.
Context có ĐÚNG MỘT hệ thống làm tâm điểm. System Landscape zoom ra xa hơn nữa: nhiều hệ thống của cả tổ chức cùng xuất hiện, để thấy bức tranh toàn cảnh ai nối với ai. Landscape giống "tấm bản đồ cả vùng", còn Context là "một thành phố".
Gần giống về mục đích (kể một luồng theo thứ tự), nhưng Dynamic trong C4 dùng chính các phần tử của mô hình (person, container, component) và đánh số các bước. Nó trả lời "khi X xảy ra, dữ liệu chạy qua đâu theo thứ tự nào".
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Vì sao mức Code (mức 4) gần như luôn được bỏ qua trong thực tế?
- 1
Vẽ hay bỏ mức Code?
Cho một component "Transfer Service" gồm 5 class. Quyết định có nên vẽ sơ đồ Code cho nó không, và nếu cần xem quan hệ lớp thì mèo con làm cách nào.
Hoàn thành khi: Quyết định rõ (thường là bỏ qua); nêu được cách thay thế (IDE tự sinh khi cần).
- 2
Landscape hay Context?
Cho hai câu hỏi: (a) "Công ty mình có những hệ thống nào, nối với nhau ra sao?", (b) "Hệ thống đặt hàng phục vụ ai?". Mỗi câu hợp với sơ đồ nào?
Hoàn thành khi: Gán đúng: (a) System Landscape, (b) System Context; giải thích ngắn.
- 3
Kể một luồng bằng Dynamic
Chọn một kịch bản (vd "khách hàng chuyển khoản"). Viết các bước theo thứ tự, đánh số, nêu mỗi bước phần tử nào gọi phần tử nào.
Hoàn thành khi: Có ≥4 bước đánh số; mỗi bước rõ "ai → ai: làm gì".
- 4
Phác một Deployment
Với một hệ thống tự chọn, kể mỗi container chạy ở đâu: máy chủ/cloud/thiết bị nào.
Hoàn thành khi: Mỗi container được ánh xạ tới một node hạ tầng; có ít nhất 3 ánh xạ.
- 5
Chọn sơ đồ cho câu hỏi
Cho 4 câu hỏi về một hệ thống, gán mỗi câu với một trong: Context, Container, Component, Dynamic, Deployment, Landscape.
Hoàn thành khi: Gán đủ 4 câu; mỗi gán có lý do một dòng.
- 6
Bộ sơ đồ tối thiểu
Cho một dự án nhỏ của mèo con, đề xuất bộ sơ đồ TỐI THIỂU nên có và giải thích vì sao không cần các loại còn lại.
Hoàn thành khi: Đề xuất 1-2 sơ đồ; lập luận vì sao đủ và vì sao bỏ phần còn lại.