de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PT

CRCカードを活用したオブジェクト指向設計の習得:初心者向けの事例研究

Table of Contents hide

「オブジェクト指向設計を学ぶ最良の方法は、パターンを暗記することではなく、役割を演じることである。」

本記事では、次のステップバイステップの紹介を行います。CRCカードのステップバイステップ紹介(クラス-責任-協働者)を、現実世界の初心者向けの例を用いて紹介します:図書館の書籍貸し出しシステムソフトウェア設計の道を歩み始めたばかりの方、あるいはチームワークのワークショップを主導している方にとっても、CRCカードはオブジェクト指向システムをモデル化するシンプルで強力かつ協働的な方法を提供します。


🎯 CRCカードとは何か?

CRCカードは、オブジェクト指向設計で使用される軽量で物理的(またはデジタル)なモデリング技法です。各カードは、クラスを表しており、3つの主要な要素を含んでいます:

フィールド 説明
クラス クラスの名前(例:)
責任 クラスが知っていることまたは行うこと
協働者 このクラスが連携して働く必要がある他のクラス

これらは特にブレインストーミング設計、および検証中開発の初期段階でクラス構造を検証する — コードを1行も書く前までに。


📚 ケーススタディ:図書館の書籍貸し出しシステム

小さな公共図書館を想定してみましょう。会員は以下の操作ができます:

  • タイトルで書籍を検索する

  • 利用可能な書籍を借りる(上限まで)

  • 利用が終わったら書籍を返却する

このシステムは以下の情報を追跡しなければなりません:

  • どの書籍が借りられているか

  • 誰が借りたか

  • いつ返却期限か

我々は以下の方法を使用します:CRCカード法このシステムのクラスを発見し、段階的に洗練するため — 1ステップずつ。


✅ ステップ1:候補クラスの発見(名詞のブレインストーミング)

まずはシナリオを読み、以下のものを抽出しましょう:名詞—— これらは潜在的なクラスです。

記述から以下のものを特定します:

  • 図書館

  • 会員(または利用者)

  • 書籍

  • 貸し出し(または借用)

  • 返却日(やや小さすぎる可能性あり)

  • 図書カード(会員の一部である可能性あり)

意味のあるもののみを絞り込みます:

✅ 会員書籍貸し出し

⚠️ 注意:最初からすべてのクラスを正確に把握することを心配する必要はありません。それがCRCカードの魅力です。ロールプレイを通じて、不足しているクラスに気づくでしょう!


✏️ ステップ2:初期のCRCカードを作成する

さて、私たちは責任協力者を各クラスに割り当てます。

📘 クラス:本

責任 協力者
タイトルを把握する
著者を把握する
ISBNを把握する
現在利用可能かどうかを把握する 貸し出し
借りられる 貸し出し
返却される 貸し出し

💬 本は誰が借りたか「知りません」——ただ、現在有効な貸し出しがあるかどうかだけを把握しています。


👤 クラス:会員

責任 協力者
名前を知る
会員IDを知る
現在借りられている本の数を知る 貸出
本を借りる(許可されている場合) 本、貸出
本を返却する 本、貸出
貸出制限に達しているか確認する 貸出

💬 会員は自身の貸出行動を管理し、貸出クラスを介して制限を確認する。


📅 クラス:貸出

責任 協力者
どの本が借りられたかを記録する
どの会員が借りたかを記録する 会員
貸出日を記録する
返却日を計算する
延滞しているかを知る
返却済みとしてマーク

💬 Loan クラスは、会員と本の間の関係を保持しており、タイミングの詳細を含む。


🎭 ステップ3:シナリオのロールプレイ — 「本を借りる」

ここからが楽しい部分です:ロールプレイカードが実際の物であるかのようにシナリオを演じる。

📖 シナリオ:カーティスは借りたいと考えている「クリーン・コード」、利用可能である。

順を追って確認していきましょう:

  1. 会員(カーティス)と発言する:「『クリーン・コード』を借りたいです。」
    → 最初の確認:「すでに3冊未満の本を持っているか?」
    → 聞く:貸し出し「現在、どのくらいの貸し出し中ですか?」

  2. 貸し出しと返答する:「あなたは1件の貸し出し中があります → 借りられます。」

  3. 会員と本を探る:「『クリーン・コード』はどこにありますか?」
    → 聞く:「利用可能ですか?」

  4. 書籍確認:「私が有効な(返却されていない)貸出があるか?」
    → 質問する貸出「私に有効な貸出はありますか?」

  5. 貸出返信:「いいえ――利用可能です!」

  6. 会員新しい貸出オブジェクト:

    • この書籍会員

    • 貸出日 = 今日に設定

    • 返却日 = 今日 + 14日後に計算

  7. 書籍は更新されます:「今、有効な貸出があります → 利用できなくなりました。」

✅ 結果:貸し借りのプロセスは自然で、分散的かつ論理的です。


🔄 ステップ4:別のシナリオ ― 「書籍を返却する」

📖 シナリオ:カーティスが返却する「クリーンコード」

  1. 会員(カーティス) と言う:「『クリーン・コード』を返却したいです。」

  2. 会員 一致するものを検索する 貸出 (おそらく、書籍と会員を照合して)貸出 書籍と会員で照合する。)

  3. 貸出 自身を としてマークする返却済み.

  4. 貸出 に伝える書籍「もう一度利用可能になりました。」

✅ クリーンで、明確で、一貫性がある — どのクラスも責任範囲外の作業を行わない。


🔍 ステップ5:精査し、欠落しているクラスを追加

ロールプレイの後、我々は を発見するギャップ:

❓ タイトルで書籍を検索するのは誰ですか?

現在、会員 が尋ねている直接に—しかし検索方法を知らない!
私たちは…が必要です中央の調整者.

➕ 新しいクラス:図書館

責任 協力者
コレクションに新しい本を追加する
タイトルで本を探す
新しい会員を登録する 会員
本の貸し出し依頼を処理する 会員、本、貸し出し
本の返却を処理する 会員、本、貸し出し
現在の貸し出しをすべて把握する 貸し出し

💬 図書館は中心となるハブとして機能します。すべての本、すべての会員、すべての貸し出しを把握しています。


✨ 更新されたフロー:「図書館を使って本を借りる」

  1. 会員 → 図書館「『クリーン・コード』というタイトルの本を探してください。」

  2. 図書館図書館はその所蔵品を検索し、次の結果を返す(またはnull見つからない場合はnull)。

  3. 会員会員はその本が存在することを確認し、次のように尋ねる図書館「この本を借りることはできますか?」

  4. 図書館確認する:

    • この本は利用可能ですか?(viaBook.isAvailable())

    • 会員は貸出制限内ですか?(viaLoan.countActiveLoans(member))

  5. もし可能であれば→図書館新しい貸出を作成し、両方の貸出.

  6. 利用できなくなる;貸出関係を追跡する。

✅ 今、流れが理解できる— その図書館発見と調整を担当する。


🧩 最終的なCRCカード要約(初心者向けに簡略化)

クラス 主な責任 主要な協力者
図書館 本、会員、貸出を管理;貸し借りの処理を行う 本、会員、貸出
会員 個人情報を利用;貸し借りの開始を担当 図書館、貸出
メタデータを保存;利用可能性を追跡 図書館、貸出
貸出 貸し出し履歴を追跡;返却日を計算;返却状態を管理 会員、本、図書館

✅ 設計原則:各クラスには明確な目的があり、責任は一貫性があり、適切に分散されている.


🌟 CRCカードがなぜとても効果的なのか(初心者向けの教訓)

利点 説明
責任主導設計 考えるよう強制する:「このクラスは何かを知っているか、何をしているのか?」単にデータを保存するだけではなく。
欠落しているクラスの自然な発見 ロールプレイによって隙間が明らかになる(欠落している図書館)——推測は不要。
ロールプレイによる即時フィードバック 流れが不自然に感じられたら、責任が適切な場所にないことがわかる。
低儀礼的かつ協働的 複雑なツールは不要——インデックスカード、ステickyノート、またはホワイトボードだけで十分。チームにとって最適。
要件とコードの橋渡し ユーザーのストーリーを実際のクラス間の相互作用に変換する。

🛠️ 初回CRCセッションのためのヒント

  1. 実物のカードを使う(3×5インデックスカードまたはステickyノート)——より参加感がある。

  2. 1枚のカードにつき1つのクラス——シンプルに保つ。

  3. 大きく、読みやすいように書く——他の人が簡単に読めるようにする。

  4. 声に出してロールプレイする——実物のようにカードを渡し合う。

  5. 3~6つのコアなシナリオから始める(例:貸し出し、返却、検索)。

  6. 完璧を目指さない — 目的は 反復、最終設計ではない。進めるうちに改善していくこと。

  7. シンプルでドメイン固有の名前を使用する — 技術用語を避ける。チームが合意すれば、「会員」を「利用者」の代わりに使う。

  8. 全員に参加を呼びかける — プログラマーでない人も、欠落している責任を見つける手助けになる。

  9. その後、簡単なクラス図を描く — 関係を可視化し、一貫性を確認するため。

  10. 楽しく保つ — ゲームのように扱う。チームの参加度が高ければ高いほど、結果は良くなる。


🔄 自分で試してみよう:次に探求する分野

図書館システムをマスターしたら、CRCカードを他の初心者向けの分野に適用してみよう:

☕ コーヒーショップ注文システム

  • クラス: 顧客注文メニュー項目バリスタレジ

  • シナリオ:注文を出す → 飲み物を追加 → 割引を適用 → 支払い → 明細を印刷

🪙 自動販売機

  • クラス: 自動販売機商品コイン販売機おつり計算機

  • シナリオ:コインを投入 → 商品を選択 → 商品を出力 → おつりを返却

🎮 クイズゲーム

  • クラス:クイズ質問プレイヤースコア追跡者ゲームセッション

  • シナリオ:クイズ開始 → 質問に回答 → 正誤を確認 → 最終スコアを表示

🚗 駐車場

  • クラス:駐車場駐車スペースチケットゲート

  • シナリオ:駐車場に入る → 車を駐車する → 出る → 料金を支払う → タイケットを取得

これらのシステムはすべて同じ原則に基づいている:

  • 名詞を特定する → 担当を割り当てる → ロールプレイする → 改善する → 繰り返す。


📌 最後の考え:CRCカードは技術以上のもの——それはマインドセットである

CRCカードの本当の力はカードそのものにではなく、その 会話を引き起こすことにある。

カードを書くとき、次のように言うと、「これは誰が行うの?」または「誰と話す必要があるの?」、あなたはすでにオブジェクト指向のデザイナーとして考えている。

🔥 プロのヒント:スプリント計画、テクニカルスパイク、あるいは面接の場でもCRCカードを使用して、あなたの設計思考を示す。

それらは開発者だけのものではない——それは 誰でもソフトウェア開発に関与するすべての人々:プロダクトマネージャー、デザイナー、テスト担当者、学生など。


📎 もっと知りたい?

👉 印刷可能なCRCカードテンプレートをダウンロード(PDFまたはデジタル版)を次のワークショップで使用する。
👉 ライブでのCRCセッションを試してみるチームメイトと — 役割を割り当てる:「あなたは会員です」、「あなたは本です」など。
👉 結果を共有する— ソーシャルメディアにカードを投稿して #CRCcards または #OODesignJourney をつけてください。


🏁 結論

そして図書館の書籍貸し出しシステムは、最も古典的で効果的なCRCカードの例の一つです — 複雑だからではなく、むしろシンプルで、共感しやすく、本質を明らかにする.

わずか5つのステップ—— ブレインストーミング、カード作成、ロールプレイ、精査、反復 —— これにより、あなたは:

  • クラスを自然に発見できる

  • 責任を明確に割り当てられる

  • 設計上の欠陥を早期に発見できる

  • チームとして共有されたメンタルモデルを構築できる

何より素晴らしいのは?上級開発者でなくてもできるということです。
ただ、好奇心、いくつかのカード、そして遊び心があれば十分です。


✅ では、今度はあなたの番です:ステッカーをいくつか用意し、簡単なシステム(コーヒーショップや自動販売機など)を選んで、CRC法を試してみてください。

📌 覚えておいてください:良い設計とは完璧なコードを書くことではなく、正しい質問をすることです。

そして、CRCカードを使えば、すでにその質問をしています。


📌 ボーナス:印刷可能なCRCカードテンプレート(テキスト版)

┌────────────────────┐
│    [クラス名]    │
├────────────────────┤
│ 機能:             │
│ -                  │
│ -                  │
│ -                  │
├────────────────────┤
│ 協力者:           │
│ -                  │
│ -                  │
└────────────────────┘

このテンプレートを3×5インチのカードに印刷するか、Miro、Figma、Googleスライドなどのデジタルツールで使用してください。


📚 次のステップは?
以下の完全なステップバイステップの解説を希望しますか?コーヒーショップ注文システム同じCRCスタイルで?
👉 ただ一言言ってください — 次のケーススタディを、カード、シナリオ、ロールプレイを含めて、ステップバイステップで送ります!

素敵な設計を! 🎮🧩💻