「オブジェクト指向設計を学ぶ最良の方法は、パターンを暗記することではなく、役割を演じることである。」
本記事では、次のステップバイステップの紹介を行います。CRCカードのステップバイステップ紹介(クラス-責任-協働者)を、現実世界の初心者向けの例を用いて紹介します:図書館の書籍貸し出しシステムソフトウェア設計の道を歩み始めたばかりの方、あるいはチームワークのワークショップを主導している方にとっても、CRCカードはオブジェクト指向システムをモデル化するシンプルで強力かつ協働的な方法を提供します。
🎯 CRCカードとは何か?
CRCカードは、オブジェクト指向設計で使用される軽量で物理的(またはデジタル)なモデリング技法です。各カードは、クラスを表しており、3つの主要な要素を含んでいます:
| フィールド | 説明 |
|---|---|
| クラス | クラスの名前(例:本) |
| 責任 | クラスが知っていることまたは行うこと |
| 協働者 | このクラスが連携して働く必要がある他のクラス |
これらは特にブレインストーミング, 設計、および検証中開発の初期段階でクラス構造を検証する — コードを1行も書く前までに。
📚 ケーススタディ:図書館の書籍貸し出しシステム
小さな公共図書館を想定してみましょう。会員は以下の操作ができます:
-
タイトルで書籍を検索する
-
利用可能な書籍を借りる(上限まで)
-
利用が終わったら書籍を返却する
このシステムは以下の情報を追跡しなければなりません:
-
どの書籍が借りられているか
-
誰が借りたか
-
いつ返却期限か
我々は以下の方法を使用します:CRCカード法このシステムのクラスを発見し、段階的に洗練するため — 1ステップずつ。
✅ ステップ1:候補クラスの発見(名詞のブレインストーミング)
まずはシナリオを読み、以下のものを抽出しましょう:名詞—— これらは潜在的なクラスです。
記述から以下のものを特定します:
-
図書館
-
会員(または利用者)
-
書籍
-
貸し出し(または借用)
-
返却日(やや小さすぎる可能性あり)
-
図書カード(会員の一部である可能性あり)
意味のあるもののみを絞り込みます:
✅ 会員, 書籍, 貸し出し
⚠️ 注意:最初からすべてのクラスを正確に把握することを心配する必要はありません。それがCRCカードの魅力です。ロールプレイを通じて、不足しているクラスに気づくでしょう!
✏️ ステップ2:初期のCRCカードを作成する
さて、私たちは責任と協力者を各クラスに割り当てます。
📘 クラス:本
| 責任 | 協力者 |
|---|---|
| タイトルを把握する | — |
| 著者を把握する | — |
| ISBNを把握する | — |
| 現在利用可能かどうかを把握する | 貸し出し |
| 借りられる | 貸し出し |
| 返却される | 貸し出し |
💬 本は誰が借りたか「知りません」——ただ、現在有効な貸し出しがあるかどうかだけを把握しています。
👤 クラス:会員
| 責任 | 協力者 |
|---|---|
| 名前を知る | — |
| 会員IDを知る | — |
| 現在借りられている本の数を知る | 貸出 |
| 本を借りる(許可されている場合) | 本、貸出 |
| 本を返却する | 本、貸出 |
| 貸出制限に達しているか確認する | 貸出 |
💬 会員は自身の貸出行動を管理し、貸出クラスを介して制限を確認する。
📅 クラス:貸出
| 責任 | 協力者 |
|---|---|
| どの本が借りられたかを記録する | 本 |
| どの会員が借りたかを記録する | 会員 |
| 貸出日を記録する | — |
| 返却日を計算する | — |
| 延滞しているかを知る | — |
| 返却済みとしてマーク | 本 |
💬 Loan クラスは、会員と本の間の関係を保持しており、タイミングの詳細を含む。
🎭 ステップ3:シナリオのロールプレイ — 「本を借りる」
ここからが楽しい部分です:ロールプレイカードが実際の物であるかのようにシナリオを演じる。
📖 シナリオ:カーティスは借りたいと考えている「クリーン・コード」、利用可能である。
順を追って確認していきましょう:
-
会員(カーティス)と発言する:「『クリーン・コード』を借りたいです。」
→ 最初の確認:「すでに3冊未満の本を持っているか?」
→ 聞く:貸し出し: 「現在、どのくらいの貸し出し中ですか?」 -
貸し出しと返答する:「あなたは1件の貸し出し中があります → 借りられます。」
-
会員と本を探る:「『クリーン・コード』はどこにありますか?」
→ 聞く:本: 「利用可能ですか?」 -
書籍確認:「私が有効な(返却されていない)貸出があるか?」
→ 質問する貸出: 「私に有効な貸出はありますか?」 -
貸出返信:「いいえ――利用可能です!」
-
会員新しい貸出オブジェクト:
-
この書籍と会員
-
貸出日 = 今日に設定
-
返却日 = 今日 + 14日後に計算
-
-
書籍は更新されます:「今、有効な貸出があります → 利用できなくなりました。」
✅ 結果:貸し借りのプロセスは自然で、分散的かつ論理的です。
🔄 ステップ4:別のシナリオ ― 「書籍を返却する」
📖 シナリオ:カーティスが返却する「クリーンコード」
-
会員(カーティス) と言う:「『クリーン・コード』を返却したいです。」
-
会員 一致するものを検索する 貸出 (おそらく、書籍と会員を照合して)貸出 書籍と会員で照合する。)
-
貸出 自身を としてマークする返却済み.
-
貸出 に伝える書籍: 「もう一度利用可能になりました。」
✅ クリーンで、明確で、一貫性がある — どのクラスも責任範囲外の作業を行わない。
🔍 ステップ5:精査し、欠落しているクラスを追加
ロールプレイの後、我々は を発見するギャップ:
❓ タイトルで書籍を検索するのは誰ですか?
現在、会員 が尋ねている本直接に—しかし本検索方法を知らない!
私たちは…が必要です中央の調整者.
➕ 新しいクラス:図書館
| 責任 | 協力者 |
|---|---|
| コレクションに新しい本を追加する | 本 |
| タイトルで本を探す | 本 |
| 新しい会員を登録する | 会員 |
| 本の貸し出し依頼を処理する | 会員、本、貸し出し |
| 本の返却を処理する | 会員、本、貸し出し |
| 現在の貸し出しをすべて把握する | 貸し出し |
💬 図書館は中心となるハブとして機能します。すべての本、すべての会員、すべての貸し出しを把握しています。
✨ 更新されたフロー:「図書館を使って本を借りる」
-
会員 → 図書館: 「『クリーン・コード』というタイトルの本を探してください。」
-
図書館図書館はその所蔵品を検索し、次の結果を返す本(または
null見つからない場合はnull)。 -
会員会員はその本が存在することを確認し、次のように尋ねる図書館: 「この本を借りることはできますか?」
-
図書館確認する:
-
この本は利用可能ですか?(via
Book.isAvailable()) -
会員は貸出制限内ですか?(via
Loan.countActiveLoans(member))
-
-
もし可能であれば→図書館新しい貸出を作成し、両方の本と貸出.
-
本利用できなくなる;貸出関係を追跡する。
✅ 今、流れが理解できる— その図書館発見と調整を担当する。
🧩 最終的なCRCカード要約(初心者向けに簡略化)
| クラス | 主な責任 | 主要な協力者 |
|---|---|---|
| 図書館 | 本、会員、貸出を管理;貸し借りの処理を行う | 本、会員、貸出 |
| 会員 | 個人情報を利用;貸し借りの開始を担当 | 図書館、貸出 |
| 本 | メタデータを保存;利用可能性を追跡 | 図書館、貸出 |
| 貸出 | 貸し出し履歴を追跡;返却日を計算;返却状態を管理 | 会員、本、図書館 |
✅ 設計原則:各クラスには明確な目的があり、責任は一貫性があり、適切に分散されている.
🌟 CRCカードがなぜとても効果的なのか(初心者向けの教訓)
| 利点 | 説明 |
|---|---|
| 責任主導設計 | 考えるよう強制する:「このクラスは何かを知っているか、何をしているのか?」単にデータを保存するだけではなく。 |
| 欠落しているクラスの自然な発見 | ロールプレイによって隙間が明らかになる(欠落している図書館)——推測は不要。 |
| ロールプレイによる即時フィードバック | 流れが不自然に感じられたら、責任が適切な場所にないことがわかる。 |
| 低儀礼的かつ協働的 | 複雑なツールは不要——インデックスカード、ステickyノート、またはホワイトボードだけで十分。チームにとって最適。 |
| 要件とコードの橋渡し | ユーザーのストーリーを実際のクラス間の相互作用に変換する。 |
🛠️ 初回CRCセッションのためのヒント
-
実物のカードを使う(3×5インデックスカードまたはステickyノート)——より参加感がある。
-
1枚のカードにつき1つのクラス——シンプルに保つ。
-
大きく、読みやすいように書く——他の人が簡単に読めるようにする。
-
声に出してロールプレイする——実物のようにカードを渡し合う。
-
3~6つのコアなシナリオから始める(例:貸し出し、返却、検索)。
-
完璧を目指さない — 目的は 反復、最終設計ではない。進めるうちに改善していくこと。
-
シンプルでドメイン固有の名前を使用する — 技術用語を避ける。チームが合意すれば、「会員」を「利用者」の代わりに使う。
-
全員に参加を呼びかける — プログラマーでない人も、欠落している責任を見つける手助けになる。
-
その後、簡単なクラス図を描く — 関係を可視化し、一貫性を確認するため。
-
楽しく保つ — ゲームのように扱う。チームの参加度が高ければ高いほど、結果は良くなる。
🔄 自分で試してみよう:次に探求する分野
図書館システムをマスターしたら、CRCカードを他の初心者向けの分野に適用してみよう:
☕ コーヒーショップ注文システム
-
クラス:
顧客,注文,メニュー項目,バリスタ,レジ -
シナリオ:注文を出す → 飲み物を追加 → 割引を適用 → 支払い → 明細を印刷
🪙 自動販売機
-
クラス:
自動販売機,商品,コイン,販売機,おつり計算機 -
シナリオ:コインを投入 → 商品を選択 → 商品を出力 → おつりを返却
🎮 クイズゲーム
-
クラス:
クイズ,質問,プレイヤー,スコア追跡者,ゲームセッション -
シナリオ:クイズ開始 → 質問に回答 → 正誤を確認 → 最終スコアを表示
🚗 駐車場
-
クラス:
駐車場,車,駐車スペース,チケット,ゲート -
シナリオ:駐車場に入る → 車を駐車する → 出る → 料金を支払う → タイケットを取得
これらのシステムはすべて同じ原則に基づいている:
-
名詞を特定する → 担当を割り当てる → ロールプレイする → 改善する → 繰り返す。
📌 最後の考え:CRCカードは技術以上のもの——それはマインドセットである
CRCカードの本当の力はカードそのものにではなく、その 会話を引き起こすことにある。
カードを書くとき、次のように言うと、「これは誰が行うの?」または「誰と話す必要があるの?」、あなたはすでにオブジェクト指向のデザイナーとして考えている。
🔥 プロのヒント:スプリント計画、テクニカルスパイク、あるいは面接の場でもCRCカードを使用して、あなたの設計思考を示す。
それらは開発者だけのものではない——それは 誰でもソフトウェア開発に関与するすべての人々:プロダクトマネージャー、デザイナー、テスト担当者、学生など。
📎 もっと知りたい?
👉 印刷可能なCRCカードテンプレートをダウンロード(PDFまたはデジタル版)を次のワークショップで使用する。
👉 ライブでのCRCセッションを試してみるチームメイトと — 役割を割り当てる:「あなたは会員です」、「あなたは本です」など。
👉 結果を共有する— ソーシャルメディアにカードを投稿して #CRCcards または #OODesignJourney をつけてください。
🏁 結論
そして図書館の書籍貸し出しシステムは、最も古典的で効果的なCRCカードの例の一つです — 複雑だからではなく、むしろシンプルで、共感しやすく、本質を明らかにする.
わずか5つのステップ—— ブレインストーミング、カード作成、ロールプレイ、精査、反復 —— これにより、あなたは:
-
クラスを自然に発見できる
-
責任を明確に割り当てられる
-
設計上の欠陥を早期に発見できる
-
チームとして共有されたメンタルモデルを構築できる
何より素晴らしいのは?上級開発者でなくてもできるということです。
ただ、好奇心、いくつかのカード、そして遊び心があれば十分です。
✅ では、今度はあなたの番です:ステッカーをいくつか用意し、簡単なシステム(コーヒーショップや自動販売機など)を選んで、CRC法を試してみてください。
📌 覚えておいてください:良い設計とは完璧なコードを書くことではなく、正しい質問をすることです。
そして、CRCカードを使えば、すでにその質問をしています。
📌 ボーナス:印刷可能なCRCカードテンプレート(テキスト版)
┌────────────────────┐
│ [クラス名] │
├────────────────────┤
│ 機能: │
│ - │
│ - │
│ - │
├────────────────────┤
│ 協力者: │
│ - │
│ - │
└────────────────────┘
このテンプレートを3×5インチのカードに印刷するか、Miro、Figma、Googleスライドなどのデジタルツールで使用してください。
📚 次のステップは?
以下の完全なステップバイステップの解説を希望しますか?コーヒーショップ注文システム同じCRCスタイルで?
👉 ただ一言言ってください — 次のケーススタディを、カード、シナリオ、ロールプレイを含めて、ステップバイステップで送ります!
素敵な設計を! 🎮🧩💻
- Visual ParadigmでCRCカードを描く方法: このステップバイステップガイドでは、ソフトウェアの専用図作成ツールを使用してCRCカードを作成する手順を説明しています。
- Visual ParadigmにおけるCRCカード図の理解: これらの図がオブジェクト指向システムおよびその相互作用をモデル化する方法を説明する概要です。
- Visual ParadigmでCRCカード図を作成する方法: Community Circleで見つかる詳細なチュートリアルで、CRC図の作成とカスタマイズをカバーしています。
- Visual ParadigmにおけるCRC図の紹介: オブジェクト指向設計および広範なシステムモデリングにCRC図を活用するための包括的なガイドです。
- クラス図からCRCカードを生成する方法: このコミュニティディスカッションでは、既存のクラス図を活用してリバースエンジニアリングによりカードを自動生成する方法を検討しています。
- CRCカードとクラス図の同期: カードとクラスモデル間の設計の一貫性を確保するための双方向モデリングについて説明する技術的リソースです。
- CRCカード図の紹介(PDFガイド): システム分析におけるCRCカードのコアコンセプトと応用を説明するダウンロード可能な技術的リソースです。
- CRCカードとクラス図の間のリンクの確立: この記事では、異なるモデリングレベル間のトレーサビリティとリンクを維持するための技術を強調しています。
- Visual ParadigmギャラリーのCRCカードテンプレート: オブジェクト指向設計の初期段階を支援するように設計されたダウンロード可能なテンプレートを紹介するリソースです。
- CRCカードを図間で移動する方法: データの一貫性を保ちながら、図の間でカードを移動する方法を詳述するガイドです。









