メインコンテンツまでスキップ

Design by Contract(DbC)入門(C# / Windows)25章アウトライン📘✨🪟

対象:C#初級〜中級/DbCは初めて/設計は超入門者🐣🌸 開発環境:Visual Studio(メイン)+必要なら Visual Studio Code も併用OK💻🛠️ AI支援:GitHub Copilot / OpenAI Codex 等は導入済み前提🤖✨


第1部:DbCの“考え方”をつかむ(迷子防止の地図)🗺️💡

第1章 DbCってなに?「約束」で守る設計🤝📌

  • DbCのイメージ:メソッドとクラスの“契約書”📝
  • 何が嬉しい?:バグの混入点が早く見つかる🔍✨
  • よくある誤解:「堅苦しい」ではなく「親切」😊💗
  • ミニ演習:身近な例(コンビニのルール)で契約を言語化🏪📜

第2章 契約の三点セット:Pre / Post / Inv🧩✅

  • 事前条件(Pre):呼ぶ側が守ること☎️
  • 事後条件(Post):呼ばれた側が保証すること🎁
  • 不変条件(Inv):いつも成立するべきこと🧱
  • ミニ演習:既存メソッドに「Pre/Post/Inv」を書き起こし📝✨

第3章 契約を書く場所:いちばん大事なのは“public境界”🚪🌟

  • public API / publicメソッドが最重要ポイント🔑
  • 入口でチェック、内部は信頼(内部をシンプルに)🧘‍♀️✨
  • ミニ演習:入口の1箇所に検証を集める🧹✅

第4章 仕様エラー vs 契約違反:混ぜないのが超大事🧨🧠

  • 契約違反:開発者のミス(直すべき)🧑‍💻💥
  • 仕様エラー:入力ミス・業務上あり得る(丁寧に返す)🙂📩
  • ミニ演習:例を分類(どっち?)して表にする📋✨

第5章 DbCの導入スタイル3つ(軽く→強く)🪜🌱

  • ①コメントで明文化(最軽量)📝
  • ②ガード節+例外/Resultで強制(実行時)🛡️
  • ③型(値オブジェクト等)でそもそも作れなくする(最強)💎🔒
  • ミニ演習:同じルールを3方式で表現してみる🎨✅

第2部:事前条件(Preconditions)をうまく書く🛡️✨

第6章 Preの基本:null・空・未指定を守る🚫🕳️

  • null/空文字/空配列の違いを整理🧺
  • 「受け取らない」なら入口で弾く🚪✅
  • ミニ演習:引数チェックをガード節で統一🏃‍♀️🛡️

第7章 Nullable参照型で“契約”を型に埋め込む🧷📌

  • stringstring? の意味(約束の表現)🧠
  • “null許容”の設計判断(安易に?を付けない)⚖️
  • ミニ演習:nullable警告をヒントにAPIを改善🔧✨

第8章 範囲チェック:境界値(0、最大、最小)が主役📏🚧

  • 数値の範囲(>=0、<=max)🔢
  • 文字列長、リスト件数の上限📚
  • ミニ演習:境界値テストの候補を列挙🧪📝

第9章 形式チェック:メール/日付/IDの“形”を守る📧🗓️

  • 形式の責任:どこでやる?(入口でやるのが基本)🚪
  • 正規表現を使いすぎない方針(読みやすさ優先)😊
  • ミニ演習:形式チェックを「わかる実装」にする🧁✅

第10章 引数同士の関係:開始<=終了、合計<=上限など🔗✅

  • 単体チェックと関係チェックは別物🧠
  • 関係が複雑なら“専用型”やメソッド分割のサイン✂️
  • ミニ演習:期間(開始/終了)を安全に扱う設計を考える⏳💡

第11章 ガード節の書き方:読みやすさの型を作る🛡️📐

  • “上で弾いて下をスッキリ”の基本✨
  • 例外メッセージの書き方(未来の自分に優しく)💌
  • ミニ演習:ガード節をテンプレ化して統一感UP🎀✅

第3部:事後条件(Postconditions)で“保証”を設計する🎁✨

第12章 Postの基本:戻り値の保証を言語化する📦✅

  • 「nullを返さない」「範囲に入る」などの保証🎯
  • 保証が書けない=設計が曖昧のサインかも👀
  • ミニ演習:メソッドの“保証文”を自然言語で書く📝🌸

第13章 副作用の保証:状態がどう変わるかを明確に🔄🧾

  • 更新系メソッドの“結果の姿”を決める✨
  • 「変更されるもの/されないもの」をはっきり📌
  • ミニ演習:更新後に満たす条件をチェック項目化✅📋

第14章 例外かResultか:Postとセットで考える🎭⚖️

  • 例外:契約違反・回復不能向き🧯
  • Result:仕様エラー・回復可能向き📩
  • ミニ演習:同じ処理を2方式(例外/Result)で設計比較🔁✨

第15章 コレクションのPost:重複なし・ソート済み・フィルタ済み📚✨

  • 「必ず重複しない」「必ず昇順」などの保証🌈
  • 表示用(読み取り)と更新用(書き込み)で分ける発想🧠
  • ミニ演習:検索メソッドの保証を3つ作る🔍✅

第4部:不変条件(Invariants)と“壊れないモデル”🧱💎

第16章 不変条件とは?クラスの健康診断ルール🏥🧱

  • “いつ見ても守られてるべきこと”を定義✨
  • 不変条件が弱いと起きる事故(途中で壊れる)😵‍💫
  • ミニ演習:例(残高>=0、明細合計一致)を作る💰📝

第17章 不変条件を守る場所:生成/更新の入口で守る🚪🔒

  • コンストラクタ/ファクトリで検証する理由🏗️
  • セッター公開は危険になりがち(守れなくなる)⚠️
  • ミニ演習:不変条件を壊す操作を“禁止”にする🚫✅

第18章 値オブジェクト入門:不正な状態を作れないが最強💎🔒

  • EntityとValueObjectの超ざっくり区別🧠
  • 住所・金額・期間を専用型にするメリット✨
  • ミニ演習:Money/Email/Periodの候補を決める🎯📦

第19章 C#で作る値オブジェクト:record / readonly / factory🛠️💠

  • record の使いどころ(等価性)🎀
  • 生成を必ず検証する(コンストラクタ隠す/工場メソッド)🏭✅
  • ミニ演習:TryCreateCreateOrThrow を作り分ける🔁✨

第20章 不変条件×コレクション:集約ルートでしか更新しない🏛️🧱

  • 「直接リストを触れない」設計で守りやすくする🧤
  • 追加/削除は専用メソッド経由にする📌
  • ミニ演習:注文(Order)+明細(Lines)の更新ルールを作る🛒✅

第5部:境界・エラー・ツール・AIで“実戦投入”🚀🤖

第21章 DTO→ドメイン:入口で汚れを落としてから渡す🧳➡️🏠

  • UI/API入力は“そのまま信じない”前提🧼⚠️
  • 入口で検証→変換→ドメインは綺麗な型だけ✨
  • ミニ演習:DTOから値オブジェクトに変換する流れを書く🗺️✅

第22章 エラーモデリング超入門:分類して境界で変換する🧩🧠

  • 契約違反(バグ)と業務エラー(仕様)を分離🧯📩
  • 境界で例外→Result、またはResult→HTTP等へ変換🔁
  • ミニ演習:エラー種類(再試行可/不可など)をラベル付け🏷️✨

第23章 開発時の検知:Assert/Debugチェックの使いどころ🐞🔔

  • 「内部前提が壊れた」時にすぐ気づく仕掛け🔍
  • どこまでをAssertにするか(public境界では基本やらない)🚪
  • ミニ演習:内部不変条件のチェックポイントを決める✅🧠

第24章 AI活用:契約・ガード節・テストを速く作る🤖⚡️

  • AIで作る:ガード節テンプレ、例外メッセージ案🛡️📝
  • AIで作る:境界値・異常系テストの候補出し🧪🎯
  • レビュー観点:AIの“やりすぎ抽象化”を止める🧯👀
  • ミニ演習:AIに「契約文→チェックコード」を提案させて人が整える✍️✨

第25章 段階導入の実戦手順:既存コードにDbCを入れる🪜🏁

  • ①重要なpublicメソッドから入口チェック🚪🌟

  • ②保証(Post)を言語化してテスト追加🧪🎁

  • ③壊れやすいルールを値オブジェクトへ💎🔒

  • ④ルールが増えたら“責務分割”でスリム化✂️✨

  • 仕上げチェックリスト✅

    • 入口の検証が散ってない?🚪🧹
    • 契約違反と業務エラーが混ざってない?🧩🚫
    • 不変条件が更新経路で守られてる?🧱✅
    • テストが契約をカバーしてる?🧪🌈

章立ての学びやすさポイント🌸📌

  • 1章あたり“1テーマ”に寄せて、疲れにくい構成😌☕️
  • 「Pre→Post→Inv→境界→運用」の順で自然に積み上がる🧱➡️🚀
  • AIは“加速装置”、最終判断は人が握る🤖🤝✨