de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

掌握以 CRC 卡進行物件導向設計:一個初學者友善的案例研究

「學習物件導向設計的最佳方式不是記憶模式——而是扮演角色。」

在本文中,我們將逐步介紹逐步介紹 CRC 卡(類別-責任-合作夥伴)使用一個現實世界、初學者友善的範例:一個圖書館借書系統無論你是剛開始踏入軟體設計之旅,還是帶領團隊工作坊,CRC 卡都提供了一種簡單、強大且具合作性的方法來建模物件導向系統。


🎯 什麼是 CRC 卡?

CRC 卡是一種輕量級的實體(或數位)建模技術,用於物件導向設計。每張卡片代表一個類別,並包含三個關鍵元素:

欄位 描述
類別 類別的名稱(例如書籍)
責任 該類別所知道所做的事
合作夥伴 此類別需要與其他類別合作

它們特別適用於腦力激盪設計,以及驗證在開發初期就驗證類結構——在撰寫任何程式碼之前。


📚 實例研究:圖書館借書系統

讓我們想像一個小型公共圖書館,會員可以:

  • 根據書名搜尋書籍

  • 借閱可借的書籍(最多至限制數量)

  • 使用完畢後歸還書籍

系統必須追蹤:

  • 哪些書被借出

  • 由誰借出

  • 何時到期

我們將使用CRC卡方法來逐步發現並優化此系統中的類別。


✅ 步驟 1:尋找候選類別(腦力激盪名詞)

首先閱讀情境描述,並找出名詞——這些都是潛在的類別。

根據描述,我們識別出:

  • 圖書館

  • 會員(或讀者)

  • 書籍

  • 借閱(或借用)

  • 到期日(可能過於細小)

  • 圖書證(可能是會員的一部分)

我們進行篩選,僅保留最具意義的幾個:

✅ 會員書籍借出

⚠️ 注意:一開始不必擔心所有類別都完全正確——這正是CRC卡片的妙處。你會透過角色扮演發現遺漏的類別!


✏️ 步驟 2:建立初始的 CRC 卡片

現在,我們指派責任合作夥伴給每個類別。

📘 類別:書籍

責任 合作夥伴
知道其書名
知道其作者
知道其 ISBN
知道它目前是否可借 借出
被借出 借出
被歸還 借出

💬 書籍並不會「知道」是誰借了它——它只知道是否有有效的借出記錄。


👤 類別:會員

職責 合作夥伴
知道姓名
知道會員編號
知道目前借出的書本數量 借閱
借書(若允許) 書籍,借閱
還書 書籍,借閱
檢查是否達到借閱上限 借閱

💬 會員自行管理其借閱行為,並透過借閱類別檢查限制。


📅 類別:借閱

職責 合作夥伴
記錄哪本書被借出 書籍
記錄是哪位會員借出 會員
記錄借閱日期
計算到期日
知道是否逾期
標記為已歸還 書籍

💬 Loan 類別儲存成員與書籍之間的關係,包含時間細節。


🎭 步驟 3:角色扮演情境 — 「借書」

現在進入有趣的部分:角色扮演將情境視為卡片是真實物件一般。

📖 情境:柯蒂斯想借閱「Clean Code」,目前可借。

我們一步步來走一遍:

  1. 成員(柯蒂斯)說:「我想借閱《Clean Code》。」
    → 首先檢查:「我目前借的書少於 3 本嗎?」
    → 問借閱「我目前有多少筆有效借閱?」

  2. 借閱回應:「你目前有 1 筆有效借閱 → 可以借閱。」

  3. 成員尋找書籍:「《Clean Code》在哪裡?」
    → 問書籍「你有空嗎?」

  4. 書籍 檢查: 「我有未歸還的借閱嗎?」
    → 問詢 借閱「我有借閱嗎?」

  5. 借閱 回覆: 「沒有——你現在有空!」

  6. 會員 建立新的 借閱 物件:

    • 連結至這個 書籍 和 會員

    • 設定借閱日期 = 今天

    • 計算到期日期 = 今天 + 14 天

  7. 書籍 已更新: 「現在我有一筆未歸還的借閱 → 我不再有空了。」

✅ 結果:借閱流程感覺自然、分散且邏輯清晰。


🔄 步驟 4:另一個情境 — 「歸還書籍」

📖 情境:柯蒂斯歸還 「整潔程式碼」

  1. 成員(柯蒂斯)說:「我想歸還《整潔程式碼》。」

  2. 成員找到相符的借閱(可能是透過查詢借閱與書籍和成員)。

  3. 借閱標記自己為已歸還.

  4. 借閱告訴書籍「你現在又可以被借閱了。」

✅ 整潔、清晰且一致—— 沒有任何類別在執行其職責範圍外的工作。


🔍 步驟 5:精煉並新增遺漏的類別

角色扮演後,我們注意到一個缺口:

❓ 誰會根據書名找到書籍?

目前,成員正在詢問直接——但不知道如何搜尋!
我們需要一個中央協調者.

➕ 新類別:圖書館

職責 合作夥伴
將新書加入收藏
按書名查找書籍
註冊新會員 會員
處理借書請求 會員、書籍、借閱
處理還書 會員、書籍、借閱
了解所有目前的借閱 借閱

💬 圖書館扮演中央樞紐的角色——它知道所有的書、所有的會員以及所有的借閱。


✨ 更新流程:「向圖書館借書」

  1. 會員 → 圖書館「尋找書名為『乾淨程式碼』的書。」

  2. 圖書館 搜尋其館藏並返回  (或 空值 若找不到)。

  3. 會員 現在知道這本書存在 → 詢問 圖書館「我可以借這本書嗎?」

  4. 圖書館 檢查:

    • 這本書有庫存嗎?(透過 書.is可用())

    • 該會員是否未超過借閱上限?(透過 借閱.count活躍借閱(會員))

  5. 如果可以 → 圖書館 建立新的 借閱 並更新兩者  和 借閱.

  6.  變得不可用; 借閱 追蹤關係。

✅ 現在流程就通了 — 這 圖書館 處理發現與協調。


🧩 最終CRC卡片總結(初學者簡化版)

類別 主要職責 主要合作對象
圖書館 管理書籍、會員與借閱;處理借閱/歸還 書籍、會員、借閱
會員 了解個人資訊;啟動借閱/歸還 圖書館、借閱
書籍 儲存元資料;追蹤可用性 圖書館、借閱
借閱 追蹤借閱紀錄;計算到期日;管理歸還狀態 會員、書籍、圖書館

✅ 設計原則:每個類別都有 一個明確的目的,且職責是 緊密整合且分配得宜.


🌟 為什麼CRC卡片如此有效(初學者要點)

好處 說明
以責任為導向的設計 迫使你思考:「這個類別知道或做什麼?」而不是僅僅儲存資料。
自然發現遺漏的類別 角色扮演能揭示缺口(例如遺漏的圖書館)——無需猜測。
透過角色扮演立即獲得反饋 如果流程感覺不順,你就知道責任所在的位置不對。
低儀式性且具合作性 無需複雜工具——只需索引卡、便利貼或白板。非常適合團隊使用。
連結需求與程式碼 將使用者故事轉化為實際的類別互動。

🛠️ 第一次CRC會議的快速提示

  1. 使用實體卡片(3×5索引卡或便利貼)——更具參與感。

  2. 每張卡片一個類別——保持簡單。

  3. 字體要大且清晰——其他人應能輕鬆閱讀。

  4. 大聲進行角色扮演——像真實物件一樣傳遞卡片。

  5. 從3到6個核心情境開始(例如:借閱、歸還、搜尋)。

  6. 不要追求完美 — 目標是 迭代,而非最終設計。在過程中持續優化。

  7. 使用簡單且與領域相關的名稱 — 避免使用技術術語。若團隊同意,可用「成員」取代「顧客」。

  8. 邀請所有人參與 — 即使非程式設計人員也能協助發現遺漏的責任。

  9. 之後繪製一個簡單的類別圖 — 以視覺化關係並確認一致性。

  10. 保持趣味性 — 將其視為遊戲。團隊參與度越高,成果越好。


🔄 試著自己操作:下一步可探索的領域

當你熟練掌握圖書館系統後,試著將 CRC 卡應用於其他適合初學者的領域:

☕ 咖啡廳訂單系統

  • 類別: 顧客訂單菜單項目咖啡師收銀機

  • 情境:下訂單 → 加入飲料 → 套用折扣 → 支付 → 列印收據

🪙 自動販賣機

  • 類別: 自動販賣機商品硬幣出貨機找零計算器

  • 情境:投入硬幣 → 選擇商品 → 出貨商品 → 回饋找零

🎮 抽答遊戲

  • 類別:抽答問題玩家分數追蹤器遊戲會話

  • 情境:開始抽答 → 回答問題 → 檢查正確性 → 顯示最終分數

🚗 停車場

  • 類別:停車場汽車停車位票券閘門

  • 情境:進入車庫 → 停車 → 離開 → 支付費用 → 取票

這些系統都建立在相同的原則之上:

  • 辨識名詞 → 分配責任 → 角色扮演 → 精煉 → 重複。


📌 最後想法:CRC卡不僅是一種技巧——它是一種思維模式

CRC卡真正的力量不在卡片本身——而在於它們所引發的 對話 它們所激發的對話。

當你寫下一張卡片並說: 「誰負責這個?」 或 「它需要跟誰溝通?」,你已經在以物件導向設計師的方式思考了。

🔥 專業提示:在衝刺規劃、技術探查,甚至面試中使用CRC卡,以展現你的設計思維。

它們不僅適用於開發人員——也適用於 任何人 參與軟體開發的人:產品經理、設計師、測試人員和學生。


📎 想了解更多?

👉 下載可列印的CRC卡範本 (PDF或數位版),用於你下一次的工作坊。
👉 嘗試一次實時的CRC會議 與同事一起進行——分配角色:「你是會員」、「你是書籍」等等。
👉 分享你的成果 ——將你的卡片張貼在社交媒體上,標註 #CRC卡 或 #物件導向設計之旅。


🏁 結論

這 圖書館借書系統是CRC卡片最經典且有效的範例之一——並非因為它複雜,而是因為它簡單、容易理解且具有啟發性.

只要遵循五個步驟——腦力激盪、卡片建立、角色扮演、精煉與迭代——你就能:

  • 自然地發現類別

  • 明確分配責任

  • 及早發現設計缺陷

  • 團隊共同建立心智模型

最重要的是?你不需要是資深開發人員也能做到。
你只需要好奇心、幾張卡片,以及樂於嘗試的態度。


✅ 現在輪到你了:拿幾張貼紙,選擇一個簡單的系統(例如咖啡廳或自動販賣機),試試CRC方法。

📌 記住:優秀的設計不在於寫出完美的程式碼——而在於提出正確的問題。

而使用CRC卡片,你已經在提出這些問題了。


📌 附贈:可列印的CRC卡片範本(文字版)

┌────────────────────┐
│    [類別名稱]    │
├────────────────────┤
│ 職責:             │
│ -                  │
│ -                  │
│ -                  │
├────────────────────┤
│ 合作夥伴:         │
│ -                  │
│ -                  │
└────────────────────┘

將此列印在3×5的卡片上,或在Miro、Figma、Google投影片等數位工具中使用。


📚 下一步?
想要完整走一遍咖啡廳訂單系統使用相同CRC風格嗎?
👉 只要說一聲——我會一步步寄給你下一個案例研究,包含卡片、情境與角色扮演!

祝你設計愉快! 🎮🧩💻