第2章 “依存”ってなに?まず言葉を怖くなくする🧩
この章のゴール🎯✨
読み終わったら、こんなふうに言えるようになります👇
- 「依存って、それがないと困る相手のことだよね」
- コードの中から「依存っぽいもの」を見つけて列挙できる🔎
- 依存には「テストを難しくするやつ」がいる、って気づける🧪💦
1) まず結論:依存=「そのクラスが頼ってる相手」🤝💡
“依存”ってむずかしそうだけど、超ざっくり言うとこれだけ👇
依存 = その子(クラス)が、自力だけではできなくて、誰かの力を借りてる相手✨
Microsoftの公式ドキュメントでも「依存=あるオブジェクトが別のオブジェクトに依存していること」って説明されています。(Microsoft Learn)
たとえばこんな感じ👇
- 時刻が欲しい → 時計(今の時間)に依存⏰
- ログを出したい → ログ出力に依存🧾
- DBに保存したい → DBに依存🗄️
- APIにアクセスしたい → HTTP通信に依存🌐
2) “依存”って2種類あると思うとラク🍰✨
初心者さんがつまずきやすいので、ここは分けちゃおう😊
A. 設計の話の「依存」🧩(今回の主役)
「このクラス、何がないと仕事できない?」っていう話。
B. ツールの話の「依存」📦(NuGetとか)
「このプロジェクト、どのライブラリ入れてる?」っていう話。
どっちも“依存”だけど、この教材(DI/Ioc)で中心になるのは Aのほう(設計の依存) だよ〜😊🌸
3) 依存があると何が困るの?(まだDIの解決策は出さないよ😌)

依存が悪いわけじゃないです🙆♀️ ただ、依存の置き方でつらくなる…って感じ💦
よくある「つらさ」トップ3👇
- 差し替えできない(本番DBに繋がっちゃう😱)
- テストしにくい(時間・乱数・通信が混ざると不安定🧪)
- 変更が連鎖する(AいじったらBもCも…🌀)
DIはこの「つらさ」を減らすテクニックで、.NETでも“DIはIoCを実現するための手法”として整理されています。(Microsoft Learn)
4) “依存っぽい匂い”を嗅ぎ分けるチェックリスト🐶🔍
コードから依存を見つけるとき、まずここを見ると早いよ✨
よく出る依存マーカー(見つけやすいやつ)✅
newしてる(その場で作ってる)🧱DateTime.Now/DateTime.UtcNow(今の時刻)⏰Guid.NewGuid()/Random(毎回変わる)🎲HttpClient/ API呼び出し(外部通信)🌐File.*(ファイルI/O)📁Console.*(入出力)⌨️Environment.*(マシン環境)🖥️Thread.Sleep/Task.Delay(時間待ち)😴- DBアクセス(
DbContextとか)🗄️
このへんは、DIと相性がめっちゃ良い「外の世界」たちです🌍✨ (次章で「newだらけコードのつらさ」を体験するから、今は“嗅ぎ分け”だけでOK😊)
5) ミニ例でやってみよ〜✍️😊「依存を列挙する」練習
下のコード、依存を探すだけやってみよう(まだ直さない!)
using System;
using System.IO;
using System.Net.Http;
public class ReportService
{
public void Run()
{
var now = DateTime.Now;
using var client = new HttpClient();
var json = client.GetStringAsync("https://example.com/api/report").Result;
File.WriteAllText("report.txt", $"[{now}] {json}");
Console.WriteLine("done!");
}
}
依存はどれ?🔎✨
DateTime.Now→ 時刻に依存⏰HttpClient→ 外部通信に依存🌐File.WriteAllText→ ファイルI/Oに依存📁Console.WriteLine→ 画面出力に依存⌨️
ここで超大事な感覚👇
依存は「クラスの外の事情」ほど、テストや変更を難しくしがち🧪💦
6) 今日のメイン課題🎒✨「あなたの過去コードから依存3つ探す」
やることはシンプルだよ😊🌸
手順(Visual Studioで)🪟🔎
-
自分の過去プロジェクトを開く
-
ざっくり次を検索(プロジェクト全体検索)
new(末尾スペースがポイント)DateTime.HttpClientFile.Console.
-
「依存っぽいの」を3つ見つけたら、メモする✍️
メモの書き方はこれでOK👇
- 依存①:〇〇(例:DateTime.Now)… 何のため?(例:タイムスタンプ)
- 依存②:〇〇
- 依存③:〇〇
7) AI活用🤖✨(コピペで使えるプロンプト)
ここ、AIめっちゃ強いところ!💪😆 コードを貼って、こう聞くと一瞬で整理してくれます👇
依存を列挙してもらう🧩
- 「このコードの**依存(外部に頼ってるもの)**を箇条書きで列挙して。
DateTime.Nowみたいな“変わるもの”も含めてね」
依存を “I/O系” と “純粋ロジック” に分けてもらう🍱
- 「このコードを I/O(外部) と 純粋ロジック(内部) に分類して。境界になってる行も教えて」
“テストを難しくする依存” を指摘してもらう🧪
- 「このコードで、テストを不安定にする依存はどれ?理由も添えて」
8) 章末チェック✅(5問クイズ🎯)
- 依存って一言で言うと?
DateTime.Nowは依存?(YES/NO)new HttpClient()は何に依存してる?(ざっくりでOK)- 依存が“見えにくい”と何が起きがち?(テスト/変更の観点で)
- 「設計の依存」と「NuGetの依存」、今回の主役はどっち?
まとめ🌷✨
- 依存=「そのクラスが頼ってる相手」🤝
- とくに 外の世界(時刻・通信・ファイル・DB・環境) は依存になりやすい🌍
- まずは直さなくてOK!この章は 見つけて言語化できれば勝ち🏆😊
次章予告👀💥
次は 「newだらけコードの“つらさ”」をわざと体験します😵✨ 「え、これテスト無理じゃん…」ってなったら大成功だよ〜🧪😂
(この章の課題で見つけた「依存3つ」、次章でめっちゃ使うよ!)