「學習物件導向設計的最佳方式不是記憶模式——而是扮演角色。」
在本文中,我們將逐步介紹逐步介紹 CRC 卡(類別-責任-合作夥伴)使用一個現實世界、初學者友善的範例:一個圖書館借書系統無論你是剛開始踏入軟體設計之旅,還是帶領團隊工作坊,CRC 卡都提供了一種簡單、強大且具合作性的方法來建模物件導向系統。
🎯 什麼是 CRC 卡?
CRC 卡是一種輕量級的實體(或數位)建模技術,用於物件導向設計。每張卡片代表一個類別,並包含三個關鍵元素:
| 欄位 | 描述 |
|---|---|
| 類別 | 類別的名稱(例如書籍) |
| 責任 | 該類別所知道或所做的事 |
| 合作夥伴 | 此類別需要與其他類別合作 |
它們特別適用於腦力激盪, 設計,以及驗證在開發初期就驗證類結構——在撰寫任何程式碼之前。
📚 實例研究:圖書館借書系統
讓我們想像一個小型公共圖書館,會員可以:
-
根據書名搜尋書籍
-
借閱可借的書籍(最多至限制數量)
-
使用完畢後歸還書籍
系統必須追蹤:
-
哪些書被借出
-
由誰借出
-
何時到期
我們將使用CRC卡方法來逐步發現並優化此系統中的類別。
✅ 步驟 1:尋找候選類別(腦力激盪名詞)
首先閱讀情境描述,並找出名詞——這些都是潛在的類別。
根據描述,我們識別出:
-
圖書館
-
會員(或讀者)
-
書籍
-
借閱(或借用)
-
到期日(可能過於細小)
-
圖書證(可能是會員的一部分)
我們進行篩選,僅保留最具意義的幾個:
✅ 會員, 書籍, 借出
⚠️ 注意:一開始不必擔心所有類別都完全正確——這正是CRC卡片的妙處。你會透過角色扮演發現遺漏的類別!
✏️ 步驟 2:建立初始的 CRC 卡片
現在,我們指派責任和合作夥伴給每個類別。
📘 類別:書籍
| 責任 | 合作夥伴 |
|---|---|
| 知道其書名 | — |
| 知道其作者 | — |
| 知道其 ISBN | — |
| 知道它目前是否可借 | 借出 |
| 被借出 | 借出 |
| 被歸還 | 借出 |
💬 書籍並不會「知道」是誰借了它——它只知道是否有有效的借出記錄。
👤 類別:會員
| 職責 | 合作夥伴 |
|---|---|
| 知道姓名 | — |
| 知道會員編號 | — |
| 知道目前借出的書本數量 | 借閱 |
| 借書(若允許) | 書籍,借閱 |
| 還書 | 書籍,借閱 |
| 檢查是否達到借閱上限 | 借閱 |
💬 會員自行管理其借閱行為,並透過借閱類別檢查限制。
📅 類別:借閱
| 職責 | 合作夥伴 |
|---|---|
| 記錄哪本書被借出 | 書籍 |
| 記錄是哪位會員借出 | 會員 |
| 記錄借閱日期 | — |
| 計算到期日 | — |
| 知道是否逾期 | — |
| 標記為已歸還 | 書籍 |
💬 Loan 類別儲存成員與書籍之間的關係,包含時間細節。
🎭 步驟 3:角色扮演情境 — 「借書」
現在進入有趣的部分:角色扮演將情境視為卡片是真實物件一般。
📖 情境:柯蒂斯想借閱「Clean Code」,目前可借。
我們一步步來走一遍:
-
成員(柯蒂斯)說:「我想借閱《Clean Code》。」
→ 首先檢查:「我目前借的書少於 3 本嗎?」
→ 問借閱: 「我目前有多少筆有效借閱?」 -
借閱回應:「你目前有 1 筆有效借閱 → 可以借閱。」
-
成員尋找書籍:「《Clean Code》在哪裡?」
→ 問書籍: 「你有空嗎?」 -
書籍 檢查: 「我有未歸還的借閱嗎?」
→ 問詢 借閱: 「我有借閱嗎?」 -
借閱 回覆: 「沒有——你現在有空!」
-
會員 建立新的 借閱 物件:
-
連結至這個 書籍 和 會員
-
設定借閱日期 = 今天
-
計算到期日期 = 今天 + 14 天
-
-
書籍 已更新: 「現在我有一筆未歸還的借閱 → 我不再有空了。」
✅ 結果:借閱流程感覺自然、分散且邏輯清晰。
🔄 步驟 4:另一個情境 — 「歸還書籍」
📖 情境:柯蒂斯歸還 「整潔程式碼」
-
成員(柯蒂斯)說:「我想歸還《整潔程式碼》。」
-
成員找到相符的借閱(可能是透過查詢借閱與書籍和成員)。
-
借閱標記自己為已歸還.
-
借閱告訴書籍: 「你現在又可以被借閱了。」
✅ 整潔、清晰且一致—— 沒有任何類別在執行其職責範圍外的工作。
🔍 步驟 5:精煉並新增遺漏的類別
角色扮演後,我們注意到一個缺口:
❓ 誰會根據書名找到書籍?
目前,成員正在詢問書直接——但書不知道如何搜尋!
我們需要一個中央協調者.
➕ 新類別:圖書館
| 職責 | 合作夥伴 |
|---|---|
| 將新書加入收藏 | 書 |
| 按書名查找書籍 | 書 |
| 註冊新會員 | 會員 |
| 處理借書請求 | 會員、書籍、借閱 |
| 處理還書 | 會員、書籍、借閱 |
| 了解所有目前的借閱 | 借閱 |
💬 圖書館扮演中央樞紐的角色——它知道所有的書、所有的會員以及所有的借閱。
✨ 更新流程:「向圖書館借書」
-
會員 → 圖書館: 「尋找書名為『乾淨程式碼』的書。」
-
圖書館 搜尋其館藏並返回 書 (或
空值若找不到)。 -
會員 現在知道這本書存在 → 詢問 圖書館: 「我可以借這本書嗎?」
-
圖書館 檢查:
-
這本書有庫存嗎?(透過
書.is可用()) -
該會員是否未超過借閱上限?(透過
借閱.count活躍借閱(會員))
-
-
如果可以 → 圖書館 建立新的 借閱 並更新兩者 書 和 借閱.
-
書 變得不可用; 借閱 追蹤關係。
✅ 現在流程就通了 — 這 圖書館 處理發現與協調。
🧩 最終CRC卡片總結(初學者簡化版)
| 類別 | 主要職責 | 主要合作對象 |
|---|---|---|
| 圖書館 | 管理書籍、會員與借閱;處理借閱/歸還 | 書籍、會員、借閱 |
| 會員 | 了解個人資訊;啟動借閱/歸還 | 圖書館、借閱 |
| 書籍 | 儲存元資料;追蹤可用性 | 圖書館、借閱 |
| 借閱 | 追蹤借閱紀錄;計算到期日;管理歸還狀態 | 會員、書籍、圖書館 |
✅ 設計原則:每個類別都有 一個明確的目的,且職責是 緊密整合且分配得宜.
🌟 為什麼CRC卡片如此有效(初學者要點)
| 好處 | 說明 |
|---|---|
| 以責任為導向的設計 | 迫使你思考:「這個類別知道或做什麼?」而不是僅僅儲存資料。 |
| 自然發現遺漏的類別 | 角色扮演能揭示缺口(例如遺漏的圖書館)——無需猜測。 |
| 透過角色扮演立即獲得反饋 | 如果流程感覺不順,你就知道責任所在的位置不對。 |
| 低儀式性且具合作性 | 無需複雜工具——只需索引卡、便利貼或白板。非常適合團隊使用。 |
| 連結需求與程式碼 | 將使用者故事轉化為實際的類別互動。 |
🛠️ 第一次CRC會議的快速提示
-
使用實體卡片(3×5索引卡或便利貼)——更具參與感。
-
每張卡片一個類別——保持簡單。
-
字體要大且清晰——其他人應能輕鬆閱讀。
-
大聲進行角色扮演——像真實物件一樣傳遞卡片。
-
從3到6個核心情境開始(例如:借閱、歸還、搜尋)。
-
不要追求完美 — 目標是 迭代,而非最終設計。在過程中持續優化。
-
使用簡單且與領域相關的名稱 — 避免使用技術術語。若團隊同意,可用「成員」取代「顧客」。
-
邀請所有人參與 — 即使非程式設計人員也能協助發現遺漏的責任。
-
之後繪製一個簡單的類別圖 — 以視覺化關係並確認一致性。
-
保持趣味性 — 將其視為遊戲。團隊參與度越高,成果越好。
🔄 試著自己操作:下一步可探索的領域
當你熟練掌握圖書館系統後,試著將 CRC 卡應用於其他適合初學者的領域:
☕ 咖啡廳訂單系統
-
類別:
顧客,訂單,菜單項目,咖啡師,收銀機 -
情境:下訂單 → 加入飲料 → 套用折扣 → 支付 → 列印收據
🪙 自動販賣機
-
類別:
自動販賣機,商品,硬幣,出貨機,找零計算器 -
情境:投入硬幣 → 選擇商品 → 出貨商品 → 回饋找零
🎮 抽答遊戲
-
類別:
抽答,問題,玩家,分數追蹤器,遊戲會話 -
情境:開始抽答 → 回答問題 → 檢查正確性 → 顯示最終分數
🚗 停車場
-
類別:
停車場,汽車,停車位,票券,閘門 -
情境:進入車庫 → 停車 → 離開 → 支付費用 → 取票
這些系統都建立在相同的原則之上:
-
辨識名詞 → 分配責任 → 角色扮演 → 精煉 → 重複。
📌 最後想法:CRC卡不僅是一種技巧——它是一種思維模式
CRC卡真正的力量不在卡片本身——而在於它們所引發的 對話 它們所激發的對話。
當你寫下一張卡片並說: 「誰負責這個?」 或 「它需要跟誰溝通?」,你已經在以物件導向設計師的方式思考了。
🔥 專業提示:在衝刺規劃、技術探查,甚至面試中使用CRC卡,以展現你的設計思維。
它們不僅適用於開發人員——也適用於 任何人 參與軟體開發的人:產品經理、設計師、測試人員和學生。
📎 想了解更多?
👉 下載可列印的CRC卡範本 (PDF或數位版),用於你下一次的工作坊。
👉 嘗試一次實時的CRC會議 與同事一起進行——分配角色:「你是會員」、「你是書籍」等等。
👉 分享你的成果 ——將你的卡片張貼在社交媒體上,標註 #CRC卡 或 #物件導向設計之旅。
🏁 結論
這 圖書館借書系統是CRC卡片最經典且有效的範例之一——並非因為它複雜,而是因為它簡單、容易理解且具有啟發性.
只要遵循五個步驟——腦力激盪、卡片建立、角色扮演、精煉與迭代——你就能:
-
自然地發現類別
-
明確分配責任
-
及早發現設計缺陷
-
團隊共同建立心智模型
最重要的是?你不需要是資深開發人員也能做到。
你只需要好奇心、幾張卡片,以及樂於嘗試的態度。
✅ 現在輪到你了:拿幾張貼紙,選擇一個簡單的系統(例如咖啡廳或自動販賣機),試試CRC方法。
📌 記住:優秀的設計不在於寫出完美的程式碼——而在於提出正確的問題。
而使用CRC卡片,你已經在提出這些問題了。
📌 附贈:可列印的CRC卡片範本(文字版)
┌────────────────────┐
│ [類別名稱] │
├────────────────────┤
│ 職責: │
│ - │
│ - │
│ - │
├────────────────────┤
│ 合作夥伴: │
│ - │
│ - │
└────────────────────┘
將此列印在3×5的卡片上,或在Miro、Figma、Google投影片等數位工具中使用。
📚 下一步?
想要完整走一遍咖啡廳訂單系統使用相同CRC風格嗎?
👉 只要說一聲——我會一步步寄給你下一個案例研究,包含卡片、情境與角色扮演!
祝你設計愉快! 🎮🧩💻
- 如何在 Visual Paradigm 中繪製 CRC 卡片: 本逐步指南提供使用軟體專用圖示工具建立 CRC 卡片的說明。
- 理解 Visual Paradigm 中的 CRC 卡片圖: 一份概述,說明這些圖如何用於模擬物件導向系統及其互動。
- 如何在 Visual Paradigm 中建立 CRC 卡片圖: 一份在社群圈找到的詳細教程,涵蓋 CRC 圖的建立與自訂。
- Visual Paradigm 中 CRC 圖的入門: 一份全面指南,專注於利用 CRC 圖進行物件導向設計與更廣泛的系統建模。
- 從類別圖產生 CRC 卡片: 本社群討論探討如何利用現有的類別圖,透過逆向工程自動產生卡片的方法。
- 將 CRC 卡片與類別圖同步: 一份技術資源,討論雙向建模,以確保卡片與類別模型之間的設計一致性。
- CRC 卡片圖入門(PDF 指南): 一份可下載的技術資源,說明 CRC 卡片在系統分析中的核心概念與應用。
- 建立 CRC 卡片與類別圖之間的連結: 本文強調維持不同建模層級之間可追蹤性與連結性的技術。
- Visual Paradigm 資源庫中的 CRC 卡片範本: 一份提供可下載範本的資源,專為支援初期物件導向設計而設計。
- 在圖之間移動 CRC 卡片: 一份指南,詳細說明如何在不同圖之間轉移卡片,同時維持資料一致性。













