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メモ:「リファクタリング前後で挙動が変わっていないかテストして」