BẢN VẼ KIẾN TRÚC PHẦN MỀM · SỐ 001

DDD

Domain-Driven Design

Thiết kế phần mềm cũng như vẽ một căn nhà: chia phòng rõ ràng, đặt tên phòng đúng như người ở vẫn gọi, và mỗi phòng tự lo việc của mình.

không cần biết code vẫn hiểu được bản vẽ này ✎
FIG. 1 — TRƯỚC KHI CÓ DDD

Một cái kho, cái gì cũng chất chung

Không chia khu vực → ai cũng táy máy đồ của người khác. Sửa một chỗ, hỏng năm chỗ.

1 PHÒNG DUY NHẤT Đơn hàng Kho Thanh toán User Email Log Giảm giá rối tung! ✎
Mọi thứ chất trong 1 phòng, ai cũng nối tắt vào đồ của người khác — không ai còn nhớ nổi cái gì phụ thuộc cái gì.
FIG. 2 — Ý TƯỞNG CỦA DDD

Vẽ lại thành từng phòng riêng

Đơn Hàng, Kho, Thanh Toán — mỗi phòng một việc, chỉ nối với phòng bên cạnh qua đúng một cái cửa.

ĐƠN HÀNG KHO THANH TOÁN cửa cửa chỉ giao tiếp qua đúng cửa — không thò tay qua tường
Mỗi phòng (bounded context) tự quản đồ đạc của mình, chỉ nối với phòng khác qua một cửa duy nhất.
FIG. 3 — LUẬT SỐ 1: NGÔN NGỮ CHUNG

Sales gọi sao, code viết vậy

Người kinh doanh nói "đơn hàng" — trong code cũng phải là "đơn hàng", không phải Object2 hay data_x.

"đơn hàng" </> "đơn hàng" ĐƠN HÀNG cùng 1 từ · cùng 1 nghĩa · cùng 1 khái niệm trong code
Ubiquitous Language: từ business dùng ngoài đời phải xuất hiện y hệt trong tên class, tên hàm.
FIG. 4 — LUẬT SỐ 2: GÕ CỬA, ĐỪNG CHUI TƯỜNG

Muốn đổi gì trong phòng? Phải qua đúng cửa

Không ai được thò tay sửa trực tiếp đồ đạc của phòng khác — phải gọi đúng qua cửa để phòng đó tự kiểm tra trước khi đổi.

ĐƠN HÀNG (phòng) Ship() đi qua cửa → tự kiểm tra hợp lệ status = "shipped" vào đúng cửa → được · chọc thẳng qua tường → bị chặn
Rich domain model: thay đổi trạng thái luôn đi qua một "cửa" (method) tự kiểm tra, không cho gán field trực tiếp từ bên ngoài.
FIG. 5 — LUẬT SỐ 3: BÁO TIN, ĐỪNG ÔM VIỆC

Xong việc thì gửi tin, không tự chạy sang phòng khác làm hộ

Phòng Kho đóng gói xong → gửi một tờ tin "đã đóng gói" → phòng Vận Chuyển tự nghe và tự làm phần của mình.

KHO VẬN CHUYỂN không gọi thẳng vào nhau ✕ Sự kiện: "đã đóng gói" 2 phòng độc lập, chỉ đồng bộ qua tin nhắn (domain event)
Domain Event: phòng phát tin xong là xong việc — phòng nghe tin tự quyết định làm gì tiếp, không ai gọi thẳng vào nội bộ ai.
CHÚ GIẢI BẢN VẼ
Domain là trung tâm
Nghiệp vụ quyết định thiết kế, không phải database hay framework.
Ngôn ngữ chung
Code và người kinh doanh gọi cùng một khái niệm bằng cùng một từ.
Ranh giới rõ ràng
Mỗi phòng (bounded context) tự quản việc của mình, không đọc/ghi lẫn nhau.
Tự bảo vệ chính mình
Mọi thay đổi trạng thái phải đi qua đúng cửa (method) hợp lệ.