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

SOLID原則 C#版 全28章アウトライン

以下は「SOLID原則」だけにフォーカスした、全28章アウトラインです😊✨ 前提は C#は初級〜中級/設計は超入門/Windows+Visual Studio中心/AI(GitHub CopilotやCodex系)導入済み です🤖💕

※2026最新環境として、Visual Studio 2026+.NET 10+C# 14 前提で組みます👍(Microsoft Learn)


0. この教材で作る題材(ずっと使うサンプル)📦✨

  • 小さめの「ミニEC(注文→支払い→発送)」か「本の貸出管理」みたいな題材で進めます📚🛒
  • まず“ぐちゃぐちゃ版”を作ってから、章ごとにSOLIDで整えていきます🧹✨

1章:ようこそSOLID!なにが嬉しいの?🎀

  • SOLIDが必要になる“あるある”(修正が怖い・影響範囲が読めない)を体験😇
  • ゴール:変更が怖くないコードのイメージを持つ💪✨
  • 🤖AIメモ:いまのコードの「変更理由の候補」を箇条書きさせる

2章:2026最新版の開発環境セットアップ🧰🪟

  • Visual Studio 2026で .NET 10 / C# 14 を使う前提にするよ✅(Microsoft Learn)
  • GitHub Copilotも使える環境として進めるよ🤖✨(The GitHub Blog)
  • (任意)VS Code派は C# 拡張でもOK、でも主役はVisual Studioで👍

3章:まず“最悪のコード”をわざと作ろう😈🧱

  • God Class、if地獄、コピペ祭りをわざと作る😂
  • ゴール:なにが辛いのかを言葉にできるようにする🗣️✨
  • 🤖AIメモ:「このクラスの責務を思いつく限り列挙して」

4章:設計の超基本ことば(責務・依存・境界)🧠📌

  • 「責務=変更理由」「依存=影響の向き」「境界=混ぜない線」
  • ゴール:SOLIDを読むための日本語を揃える📚✨
  • 🤖AIメモ:「変更理由が違うものをグループ分けして」

5章:リファクタリング最初の武器セット🪄🧹

  • 名前を直す、メソッド抽出、クラス分割、移動…まずこれだけでOK!
  • Visual Studioのリファクタ支援をフル活用するよ💡
  • 🤖AIメモ:「安全に分割する手順をステップで出して」

6章:テストは“設計の味方”だよ🧪✨

  • 超入門:AAA(Arrange/Act/Assert)だけ押さえる😊
  • ゴール:SOLIDの改善を“壊してない”って確認できる状態にする✅
  • 🤖AIメモ:「このメソッドのテスト観点を5つ出して」

7章:SOLID全体マップ🗺️🌈

  • S/O/L/I/D を“別々”じゃなく“チーム”として見る👯‍♀️
  • ゴール:各原則が何を守るのか、ざっくり対応関係を理解する
  • 🤖AIメモ:「このコードの問題点をS/O/L/I/D別に分類して」

ここからS:SRP(単一責務)📌

8章:SRPの感覚「変更理由は1つ」ってどういうこと?🎯

  • “メソッドが1つ”じゃないよ!“理由が1つ”だよ!😌
  • ゴール:責務=変更理由で説明できるようにする
  • 🤖AIメモ:「変更理由を3〜5個に言語化して」

9章:SRPの分割パターン①:入力・判断・出力を分ける📥🧠📤

  • まずは鉄板の分け方(I/Oとロジックの分離)
  • ゴール:ロジックが単体で読める&テストしやすい形へ
  • 🤖AIメモ:「I/O部分と純粋ロジック部分を分けた案を出して」

10章:SRPの分割パターン②:検証(バリデーション)を整理する✅🧾

  • 何でもかんでもサービスに書くと地獄😇
  • ゴール:検証の置き場所(入口/ドメイン/境界)を決める
  • 🤖AIメモ:「この検証はどこに置くべき?理由も」

11章:SRP実戦:サービス肥大化をスッキリさせる🧼✨

  • 例:OrderServiceが巨大→小さな役割に分ける
  • ゴール:“読める塊”にして変更点を局所化
  • 🤖AIメモ:「分割後のクラス候補名を10個提案して」

次はO:OCP(拡張に開く/変更に閉じる)🚪✨

12章:OCPの目的「追加で直す場所を減らす」🧩

  • 条件分岐が増えるたびに既存コードを壊しがち問題💥
  • ゴール:追加が来ても既存の修正を最小化する
  • 🤖AIメモ:「増えそうな分岐ポイントを予測して」

13章:OCPの王道:Strategyで差し替え🎭🔁

  • “場合分け”を「差し替え可能な部品」にする
  • ゴール:if/switchを減らして増やしやすくする
  • 🤖AIメモ:「Strategyに分けるなら種類は何がある?」

14章:OCPの現実:どこまで抽象化する?(やりすぎ注意)⚖️😅

  • 未来のために作りすぎると逆に辛い(YAGNI寄りの話も少し)
  • ゴール:拡張点を作る判断基準を持つ
  • 🤖AIメモ:「今抽象化すべき?しないべき?根拠つきで」

15章:OCP実戦:料金計算・割引・ポイントを“追加に強く”する💰🎫

  • 追加ルールが来る分野でOCPを体に入れる
  • ゴール:仕様追加が“新クラス追加”で済む設計へ
  • 🤖AIメモ:「新しい割引ルールを追加する手順を説明して」

次はL:LSP(リスコフ置換)🧱➡️🧱

16章:LSPの入口「継承するときの約束」📜

  • “親の代わりに子を入れても壊れない”ってやつ😌
  • ゴール:継承の怖さを知って安全に使えるようにする
  • 🤖AIメモ:「この継承、破綻ポイントはどこ?」

17章:LSPが壊れる典型:例外投げちゃう・条件が変わる🙅‍♀️💥

  • 子が勝手にルールを変えると、呼ぶ側が破綻する
  • ゴール:事前条件/事後条件の感覚を持つ
  • 🤖AIメモ:「置換できない理由を“呼び出し側の視点”で説明して」

18章:LSPの解決:継承より合成へ🧩✨

  • 無理な継承をやめて、部品の組み合わせにする
  • ゴール:継承地獄を避ける“逃げ道”を持つ
  • 🤖AIメモ:「合成で作るなら部品は何が必要?」

次はI:ISP(インターフェース分離)✂️📄

19章:ISPの入口「太いインターフェースは使う人を苦しめる」😵‍💫

  • 使わないメソッドまで実装させられる問題
  • ゴール:役割ごとに細くする感覚を持つ
  • 🤖AIメモ:「このインターフェースを役割別に分割して」

20章:ISP実戦:読み取り用・更新用を分ける📖✍️

  • 例:参照だけしたいのに更新系まで見えてしまう
  • ゴール:利用者の視点で“必要な約束だけ”にする
  • 🤖AIメモ:「利用者タイプ(画面/バッチ/テスト)別に必要APIを整理して」

21章:ISP+外部連携:Adapterで変換して守る🔌🛡️

  • 外部APIが微妙でも、内側の設計を汚さない
  • ゴール:外部都合を境界で止める
  • 🤖AIメモ:「外部DTOと内部モデルの変換案を出して」

最後D:DIP(依存性逆転)+DI(注入)🧲🔄

22章:DIPの入口「上位(業務)を下位(DB/HTTP)の都合にしない」🏰

  • 抽象に依存して、実装はあとで差す
  • ゴール:依存の向きを説明できるようにする
  • 🤖AIメモ:「この依存関係の矢印、どっち向きが理想?」

23章:DIの基本:newしないで外から渡す🎁

  • コンストラクタ注入を基本として体に入れる
  • ゴール:差し替え可能な構造を作れるようにする
  • 🤖AIメモ:「注入すべき依存と、そうでないものを分類して」

24章:.NETのDIで“組み立て場所”を作る🧱🧩

  • 組み立て(Composition Root)を1か所に寄せる
  • ゴール:依存の管理が散らからない設計へ
  • 🤖AIメモ:「登録の粒度(Singleton/Scopedなど)をどう選ぶ?」

25章:DIPが効く瞬間:テストで差し替える🧪🔁

  • Fake/Mockで外部I/Oを差し替えて高速テスト
  • ゴール:変更・追加のたびに安心して回せる状態へ
  • 🤖AIメモ:「この外部依存のFake実装案を作って」

26章:総合演習1:まずは「作戦」を立てよう📝🔍

  • いきなりコードを触ると壊すので、まずは「どこが違反か」を見つける
  • ゴール:AIと一緒に「リファクタリング計画書(ここをこう直すリスト)」を作る
  • 🤖AIメモ:「このコードのSOLID違反箇所をリストアップして、直す順番を提案して」

27章:総合演習2:クラス構造を「綺麗」にする(SRP/OCP/LSP/ISP)🧱✨

  • まだDI(依存性の注入)は考えず、クラス分けやインターフェース抽出に集中する
  • ゴール:ロジック部分のクラス図が美しく整理された状態にする
  • 🤖AIメモ:「計画に基づいて、このクラスをSRPで分割して」

28章:総合演習[3]:疎結合にして「完成」させる(DIP/DI/Test)🔌🧪🚀

  • 最後にDIPを適用してDIコンテナに登録し、テストで動作確認する
  • ゴール:完全にSOLIDなアプリとして動かし、Before/Afterを見比べる
  • 🤖AIメモ:「リファクタリング前後で挙動が変わっていないかテストして」