“Cách tốt nhất để học thiết kế hướng đối tượng không phải là ghi nhớ các mẫu — đó là bằng cách đóng vai trò.”
Trong bài viết này, chúng tôi sẽ đi qua mộtgiới thiệu từng bước về thẻ CRC (Lớp–Trách nhiệm–Hợp tác) bằng một ví dụ thực tế, thân thiện với người mới: mộtHệ thống mượn sách thư viện. Dù bạn mới bắt đầu hành trình vào thiết kế phần mềm hay đang dẫn một buổi làm việc nhóm, thẻ CRC cung cấp một cách đơn giản, mạnh mẽ và hợp tác để mô hình hóa các hệ thống hướng đối tượng.
🎯 Thẻ CRC là gì?
Thẻ CRC là một kỹ thuật mô hình hóa nhẹ nhàng (vật lý hoặc số hóa) được sử dụng trong thiết kế hướng đối tượng. Mỗi thẻ đại diện cho mộtlớp và chứa ba yếu tố chính:
| Trường | Mô tả |
|---|---|
| Lớp | Tên của lớp (ví dụ nhưSách) |
| Trách nhiệm | Điều mà lớpbiếthoặclàm |
| Các đối tác hợp tác | Các lớp khác mà lớp này cần hợp tác với |
Chúng đặc biệt hiệu quả trong việcđặt ra ý tưởng, thiết kế, vàxác minhcấu trúc lớp ngay từ đầu quá trình phát triển — trước khi viết một dòng mã nào.
📚 Nghiên cứu trường hợp: Hệ thống mượn sách thư viện
Hãy tưởng tượng một thư viện công cộng nhỏ nơi các thành viên có thể:
-
Tìm kiếm sách theo tiêu đề
-
Mượn các cuốn sách có sẵn (tối đa một giới hạn)
-
Trả sách khi hoàn thành
Hệ thống phải theo dõi:
-
Sách nào đang được mượn
-
Do ai
-
Khi nào chúng phải trả
Chúng ta sẽ sử dụng phương phápthẻ CRCđể phát hiện và tinh chỉnh các lớp trong hệ thống này — từng bước một.
✅ Bước 1: Tìm các lớp tiềm năng (thảo luận các danh từ)
Bắt đầu bằng cách đọc tình huống và trích racác danh từ— đây là các lớp tiềm năng.
Từ mô tả, chúng ta xác định:
-
Thư viện
-
Thành viên (hoặc Người dùng)
-
Sách
-
Mượn (hoặc Việc mượn)
-
Ngày trả (có thể quá nhỏ)
-
Thẻ thư viện (có thể là một phần của Thành viên)
Chúng ta lọc và chỉ giữ lại những cái có ý nghĩa nhất:
✅ Thành viên, Sách, Mượn
⚠️ Ghi chú: Đừng lo lắng về việc phải đúng ngay từ đầu tất cả các lớp — đó chính là điểm thú vị của thẻ CRC. Bạn sẽ phát hiện ra những lớp còn thiếu thông qua việc đóng vai!
✏️ Bước 2: Tạo các thẻ CRC ban đầu
Bây giờ, chúng ta gántrách nhiệmvàđồng tác giảcho mỗi lớp.
📘 Lớp: Sách
| Trách nhiệm | Đồng tác giả |
|---|---|
| Biết tiêu đề của nó | — |
| Biết tác giả của nó | — |
| Biết mã ISBN của nó | — |
| Biết liệu nó có đang sẵn có hay không | Mượn |
| Bị mượn | Mượn |
| Được trả lại | Mượn |
💬 Sách không “biết” ai đã mượn nó — nó chỉ biết liệu nó có một khoản mượn đang hoạt động hay không.
👤 Lớp: Thành viên
| Trách nhiệm | Các cộng sự |
|---|---|
| Biết tên | — |
| Biết mã thành viên | — |
| Biết số lượng sách đang được mượn | Mượn |
| Mượn một cuốn sách (nếu được phép) | Sách, Mượn |
| Trả lại một cuốn sách | Sách, Mượn |
| Kiểm tra xem giới hạn mượn đã đạt đến chưa | Mượn |
💬 Thành viên quản lý hành vi mượn của chính mình và kiểm tra giới hạn thông qua lớp Mượn.
📅 Lớp: Mượn
| Trách nhiệm | Các cộng sự |
|---|---|
| Ghi lại cuốn sách nào đã được mượn | Sách |
| Ghi lại thành viên nào đã mượn nó | Thành viên |
| Ghi lại ngày mượn | — |
| Tính ngày trả | — |
| Biết liệu có quá hạn hay không | — |
| Ghi chú đã trả | Sách |
💬 Lớp Loan lưu trữ mối quan hệ giữa một Thành viên và một Sách, bao gồm các chi tiết về thời gian.
🎭 Bước 3: Diễn kịch tình huống — “Mượn một cuốn sách”
Bây giờ đến phần thú vị: diễn kịch tình huống như thể các thẻ là những vật thật.
📖 Tình huống: Curtis muốn mượn “Code sạch”, đang có sẵn.
Hãy cùng đi qua từng bước:
-
Thành viên (Curtis) nói: “Tôi muốn mượn ‘Code sạch’.”
→ Kiểm tra đầu tiên: “Tôi có ít hơn 3 cuốn sách rồi không?”
→ Hỏi Mượn: “Tôi có bao nhiêu khoản mượn đang hoạt động?” -
Mượn trả lời: “Bạn có 1 khoản mượn đang hoạt động → bạn có thể mượn.”
-
Thành viên tìm kiếm cuốn sách: “‘Code sạch’ ở đâu?”
→ Hỏi Sách: “Bạn có rảnh không?” -
Sách kiểm tra: “Tôi có một khoản vay đang hoạt động (chưa được trả lại) không?”
→ Hỏi Vay: “Có khoản vay đang hoạt động dành cho tôi không?” -
Vay trả lời: “Không — bạn đang rảnh!”
-
Thành viên tạo một mới Vay đối tượng:
-
Liên kết đến Sách và Thành viên
-
Đặt ngày mượn = hôm nay
-
Tính ngày trả = hôm nay + 14 ngày
-
-
Sách được cập nhật: “Bây giờ tôi đã có một khoản vay đang hoạt động → Tôi không còn rảnh nữa.”
✅ Kết quả: Quy trình mượn sách cảm giác tự nhiên, phân tán và hợp lý.
🔄 Bước 4: Một tình huống khác — “Trả sách”
📖 Tình huống: Curtis trả lại “Mã sạch”
-
Thành viên (Curtis) nói: “Tôi muốn trả lại cuốn ‘Clean Code’.”
-
Thành viên tìm thấy phù hợp Mượn (khả năng là bằng cách truy vấn Mượn với sách và thành viên).
-
Mượn đánh dấu bản thân là đã trả.
-
Mượn nói Sách: “Bạn đã có thể được mượn lại rồi.”
✅ Sạch sẽ, rõ ràng và mạch lạc — không lớp nào đang thực hiện công việc ngoài trách nhiệm của nó.
🔍 Bước 5: Tinh chỉnh và thêm các lớp còn thiếu
Sau khi đóng vai, chúng tôi nhận thấy một khoảng trống:
❓ Ai tìm được sách theo tiêu đề?
Hiện tại, Thành viên đang hỏi Sách trực tiếp — nhưng Sách không biết cách tìm kiếm!
Chúng tôi cần một người điều phối trung tâm.
➕ Lớp mới: Thư viện
| Trách nhiệm | Các cộng sự |
|---|---|
| Thêm một cuốn sách mới vào bộ sưu tập | Sách |
| Tìm sách theo tiêu đề | Sách |
| Đăng ký thành viên mới | Thành viên |
| Xử lý yêu cầu mượn sách | Thành viên, Sách, Mượn |
| Xử lý việc trả sách | Thành viên, Sách, Mượn |
| Biết tất cả các khoản mượn hiện tại | Mượn |
💬 Thư viện đóng vai trò là trung tâm — nó biết tất cả các sách, tất cả thành viên và tất cả các khoản mượn.
✨ Luồng cập nhật: “Mượn một cuốn sách” với Thư viện
-
Thành viên → Thư viện: “Tìm cuốn sách có tiêu đề ‘Clean Code’.”
-
Thư viện tìm kiếm trong bộ sưu tập của mình và trả về Cuốn sách (hoặc
nullnếu không tìm thấy). -
Thành viên bây giờ biết rằng cuốn sách tồn tại → hỏi Thư viện: “Tôi có thể mượn cuốn sách này được không?”
-
Thư viện kiểm tra:
-
Cuốn sách có sẵn không? (thông qua
Book.isAvailable()) -
Thành viên có đang trong giới hạn mượn không? (thông qua
Loan.countActiveLoans(thành viên))
-
-
Nếu có → Thư viện tạo một mới Giao dịch mượn và cập nhật cả Cuốn sách và Giao dịch mượn.
-
Cuốn sách trở nên không khả dụng; Mượn theo dõi mối quan hệ.
✅ Bây giờ luồng hoạt động trở nên hợp lý — cái Thư viện xử lý việc phát hiện và phối hợp.
🧩 Tổng kết thẻ CRC cuối cùng (Đơn giản hóa cho người mới bắt đầu)
| Lớp | Trách nhiệm chính | Các cộng sự chính |
|---|---|---|
| Thư viện | Quản lý sách, thành viên, mượn trả; xử lý việc mượn/trả | Sách, Thành viên, Mượn |
| Thành viên | Biết thông tin cá nhân; khởi tạo việc mượn/trả | Thư viện, Mượn |
| Sách | Lưu trữ dữ liệu mô tả; theo dõi tình trạng sẵn có | Thư viện, Mượn |
| Mượn | Theo dõi lịch sử mượn; tính ngày trả; quản lý trạng thái trả | Thành viên, Sách, Thư viện |
✅ Nguyên tắc thiết kế: Mỗi lớp có một mục đích rõ ràng, và trách nhiệm là thống nhất và phân bổ hợp lý.
🌟 Tại sao Thẻ CRC lại hoạt động rất tốt (Những bài học dành cho người mới)
| Lợi ích | Giải thích |
|---|---|
| Thiết kế dựa trên trách nhiệm | Buộc bạn phải suy nghĩ: “Lớp này biết hoặc làm gì?” thay vì chỉ lưu trữ dữ liệu. |
| Phát hiện tự nhiên các lớp bị thiếu | Diễn kịch tiết lộ khoảng trống (như lớp bị thiếu Thư viện) — không cần suy đoán gì thêm. |
| Phản hồi tức thì thông qua diễn kịch | Nếu một luồng cảm giác khó chịu, bạn sẽ biết trách nhiệm đang ở vị trí sai. |
| Thiếu hình thức & Hợp tác | Không cần công cụ phức tạp — chỉ cần thẻ ghi chú, giấy dán hoặc bảng trắng. Rất tốt cho nhóm. |
| Kết nối yêu cầu với mã nguồn | Biến các câu chuyện người dùng thành các tương tác lớp thực tế. |
🛠️ Mẹo nhanh cho buổi họp CRC đầu tiên
-
Sử dụng thẻ vật lý (thẻ ghi chú 3×5 hoặc giấy dán) — sẽ hấp dẫn hơn.
-
Một lớp mỗi thẻ — giữ đơn giản.
-
Viết lớn và dễ đọc — người khác phải đọc được dễ dàng.
-
Diễn kịch to thành tiếng — trao đổi thẻ như các vật thật.
-
Bắt đầu với 3–6 tình huống cốt lõi (ví dụ: mượn, trả, tìm kiếm).
-
Đừng hướng đến sự hoàn hảo — mục tiêu là lần lặp, không phải là thiết kế cuối cùng. Refined dần theo quá trình.
-
Sử dụng tên đơn giản, phù hợp với lĩnh vực — tránh dùng thuật ngữ kỹ thuật. Sử dụng “Thành viên” thay vì “Khách hàng” nếu cả đội đồng thuận.
-
Mời mọi người tham gia — ngay cả những người không lập trình cũng có thể giúp phát hiện các trách nhiệm bị thiếu.
-
Vẽ sơ đồ lớp đơn giản sau đó — để trực quan hóa các mối quan hệ và xác nhận tính nhất quán.
-
Giữ cho vui vẻ — coi đó như một trò chơi. Đội của bạn càng tham gia tích cực, kết quả càng tốt.
🔄 Thử tự làm: Các lĩnh vực tiếp theo để khám phá
Sau khi đã thành thạo hệ thống thư viện, hãy thử áp dụng thẻ CRC vào các lĩnh vực thân thiện với người mới bắt đầu khác:
☕ Hệ thống đặt hàng quán cà phê
-
Lớp:
Khách hàng,Đơn hàng,Món ăn,Barista,Máy tính tiền -
Các tình huống: Đặt đơn → Thêm đồ uống → Áp dụng giảm giá → Thanh toán → In hóa đơn
🪙 Máy bán hàng tự động
-
Lớp:
Máy bán hàng tự động,Sản phẩm,Đồng tiền,Máy phát,Bộ tính tiền thừa -
Các tình huống: Nhập tiền → Chọn sản phẩm → Phát sản phẩm → Trả lại tiền thừa
🎮 Trò chơi hỏi đáp
-
Lớp:
Bài kiểm tra,Câu hỏi,Người chơi,Bộ theo dõi điểm số,Phiên chơi -
Các tình huống: Bắt đầu bài kiểm tra → Trả lời câu hỏi → Kiểm tra tính chính xác → Hiển thị điểm cuối
🚗 Bãi đậu xe
-
Lớp:
Bãi đậu xe,Xe hơi,Vị trí đậu xe,Vé,Cổng -
Các tình huống: Vào garage → Đỗ xe → Ra ngoài → Thanh toán phí → Nhận vé
Mỗi hệ thống này đều dựa trên những nguyên tắc giống nhau:
-
Xác định danh từ → phân công trách nhiệm → đóng vai → hoàn thiện → lặp lại.
📌 Những suy nghĩ cuối cùng: Thẻ CRC hơn cả một kỹ thuật — đó là một tư duy
Sức mạnh thực sự của thẻ CRC không nằm ở chính những thẻ đó — mà nằm ở sự cuộc trò chuyệnmà chúng gợi lên.
Khi bạn viết một thẻ và nói, “Ai sẽ thực hiện điều này?” hay “Ai nó cần nói chuyện với?”, bạn đã đang suy nghĩ như một nhà thiết kế hướng đối tượng.
🔥 Mẹo hay: Sử dụng thẻ CRC trong quá trình lập kế hoạch sprint, nghiên cứu công nghệ hoặc thậm chí trong phỏng vấn để thể hiện tư duy thiết kế của bạn.
Chúng không chỉ dành cho nhà phát triển — mà dành cho bất kỳ ai tham gia vào việc xây dựng phần mềm: người quản lý sản phẩm, nhà thiết kế, người kiểm thử và sinh viên.
📎 Muốn biết thêm?
👉 Tải xuống mẫu thẻ CRC in được (PDF hoặc kỹ thuật số) để sử dụng trong buổi làm việc tiếp theo của bạn.
👉 Thử một buổi họp CRC trực tiếp với một đồng đội — phân công vai trò: “Bạn là Thành viên”, “Bạn là Sách”, v.v.
👉 Chia sẻ kết quả của bạn — đăng thẻ của bạn lên mạng xã hội với #CRCcards hoặc #OODesignJourney.
🏁 Kết luận
Sự Hệ thống mượn sách thư việnlà một trong những ví dụ kinh điển và hiệu quả nhất về thẻ CRC — không phải vì nó phức tạp, mà vì nóđơn giản, dễ liên hệ và làm rõ.
Bằng cách tuân theo chỉnăm bước— lập ý tưởng, tạo thẻ, đóng vai, tinh chỉnh và lặp lại — bạn có thể:
-
Phát hiện các lớp một cách tự nhiên
-
Phân công trách nhiệm rõ ràng
-
Phát hiện lỗi thiết kế sớm
-
Xây dựng mô hình tư duy chung như một đội nhóm
Và điều tuyệt vời nhất? Bạn không cần phải là nhà phát triển cấp cao để làm điều đó.
Bạn chỉ cần tò mò, vài thẻ và sẵn sàng chơi.
✅ Bây giờ đến lượt bạn: Lấy vài giấy ghi chú dán, chọn một hệ thống đơn giản (như một quán cà phê hoặc máy bán hàng tự động), và thử phương pháp CRC.
📌 Hãy nhớ: Thiết kế tốt không phải là viết mã hoàn hảo — mà là đặt ra những câu hỏi đúng.
Và với thẻ CRC, bạn đã đang đặt chúng.
📌 Thêm: Mẫu thẻ CRC in được (phiên bản văn bản)
┌────────────────────┐
│ [TÊN LỚP] │
├────────────────────┤
│ Trách nhiệm: │
│ - │
│ - │
│ - │
├────────────────────┤
│ Cộng tác viên: │
│ - │
│ - │
└────────────────────┘
In mẫu này lên thẻ 3×5 hoặc sử dụng trong công cụ số như Miro, Figma hoặc Google Slides.
📚 Bước tiếp theo?
Bạn có muốn một hướng dẫn chi tiết vềHệ thống đặt hàng quán cà phêdùng phong cách CRC tương tự?
👉 Chỉ cần nói một tiếng — tôi sẽ gửi cho bạn nghiên cứu trường hợp tiếp theo, từng bước, với thẻ, tình huống và đóng vai!
Thiết kế vui vẻ! 🎮🧩💻
- Làm thế nào để vẽ thẻ CRC trong Visual Paradigm: Hướng dẫn từng bước này cung cấp hướng dẫn về việc tạo thẻ CRC bằng các công cụ vẽ biểu đồ chuyên dụng của phần mềm.
- Hiểu về sơ đồ thẻ CRC trong Visual Paradigm: Một cái nhìn tổng quan giải thích cách các sơ đồ này được sử dụng để mô hình hóa các hệ thống hướng đối tượng và các tương tác của chúng.
- Làm thế nào để tạo sơ đồ thẻ CRC trong Visual Paradigm: Một hướng dẫn chi tiết được tìm thấy trên Cộng đồng Circle, bao gồm việc tạo và tùy chỉnh các sơ đồ thẻ CRC.
- Giới thiệu về sơ đồ CRC trong Visual Paradigm: Một hướng dẫn toàn diện tập trung vào việc sử dụng sơ đồ CRC cho thiết kế hướng đối tượng và mô hình hóa hệ thống rộng hơn.
- Tạo thẻ CRC từ sơ đồ lớp: Cuộc thảo luận cộng đồng này khám phá các phương pháp tận dụng các sơ đồ lớp hiện có để tự động tạo thẻ thông qua kỹ thuật đảo ngược.
- Đồng bộ hóa thẻ CRC với sơ đồ lớp: Một tài nguyên kỹ thuật thảo luận về mô hình hóa hai chiều để đảm bảo tính nhất quán thiết kế giữa thẻ và mô hình lớp.
- Giới thiệu về sơ đồ thẻ CRC (Hướng dẫn PDF): Một tài nguyên kỹ thuật có thể tải xuống giải thích các khái niệm cốt lõi và ứng dụng của thẻ CRC trong phân tích hệ thống.
- Thiết lập liên kết giữa thẻ CRC và sơ đồ lớp: Bài viết này nhấn mạnh các kỹ thuật để duy trì tính khả thi theo dõi và liên kết giữa các mức mô hình khác nhau.
- Mẫu thẻ CRC trong Thư viện Visual Paradigm: Một tài nguyên bao gồm mẫu có thể tải xuống được thiết kế để hỗ trợ thiết kế hướng đối tượng giai đoạn đầu.
- Di chuyển thẻ CRC giữa các sơ đồ: Một hướng dẫn chi tiết về cách chuyển thẻ giữa các sơ đồ khác nhau trong khi duy trì tính nhất quán dữ liệu.
This post is also available in Deutsch, English, Español, فارسی, Français, English, Bahasa Indonesia, 日本語, Polski, Portuguese, Ру́сский, 简体中文 and 繁體中文.













