第1章:CQSってなに?まずは超ざっくり掴もう🧠🌱
この章のゴール🎯✨
- CQSの合言葉を1行で言えるようになる📌
- ざっくり Command / Query の区別ができるようになる👀
- 「混ぜない」意識を今日から持てるようになる😊
CQSの一言📌

「変更するなら返さない/返すなら変更しない」✨
もっと言うと…
- Command(コマンド):状態を変える(書き込み)🔧
- Query(クエリ):情報を返す(読み取り)🔍
- **同じメソッドで両方やらない!**🙅♀️
これは、Bertrand Meyer が提唱した “Command–Query Separation” の考え方として広く知られてるよ〜📚✨ (martinfowler.com)
まずは感覚でOK!CommandとQueryの違い🧩
Command(状態を変える)🔧
例:
- TODOを追加する✅
- パスワードを変更する🔐
- 注文を確定する📦
- メール送信する📧
👉 世界がちょっとでも変わったら Command だと思ってOK😊
Query(状態を変えない)🔍
例:
- TODO一覧を取得する📄
- 注文の合計金額を見る💰
- ユーザー情報を表示する👤
👉 見に行くだけなら Query だよ〜😊
“混ぜる”と何がイヤなの?😇💥(超わかる例)

たとえばこんなの👇
public int GetTodoCountAndCleanup()
{
// ついでに古いTODOを消しちゃお♪ ← これが地雷💣
CleanupOldTodos();
return _repo.GetTodos().Count;
}
これ、呼び出し側は「件数を知りたいだけ」なのに、 知らないところで削除が走ってるのが怖いの😱💦
- デバッグで「え、なんで消えたの?」ってなる🪦
- テストが「順番」で壊れやすい🧪💥
- 呼ぶだけで副作用が出ると、使うのが怖くなる👻
CQSはこういう “隠れ副作用” を減らすための超基本ルールなんだ✨ (martinfowler.com)
何が嬉しい?CQSのごほうび🍰✨
CQSを意識すると…
- バグが減る(変化ポイントが見えやすい)🐛⬇️
- 読みやすい(「これ、読むだけ?」が分かる)📖✨
- テストしやすい(Queryは特にラク勝ち)🧪🏆
- 使い回ししやすい(安心して呼べる)🔁😊
このメリット感は、Martin Fowler も分かりやすく語ってるよ〜📚✨ (martinfowler.com)
今日からの超ミニ習慣:「混ぜない」だけ意識しよ😊🌱
✅ ルール(今日覚えるのはこれだけ!)
- Queryは“見るだけ”にする🔍
- Commandは“変えるだけ”にする🔧
- もし「両方やりたい」気持ちが出たら → 2つに分ける✂️✨
ありがちな “迷いポイント” も先に触れとくね🌀
Q. 「ログ書くのって副作用じゃない?」🤔
うん、ログは副作用!📌 でも現実では「観測のためのログ」はほぼ必須だから、入門ではこう考えるのが楽だよ😊
- Queryは“ビジネス的な状態”を変えない(DB更新とか)
- ログ/メトリクスみたいな“観測”は許容しがち(ただしやりすぎ注意)📝
※この辺の落とし所は後の章で、もっと丁寧にやるよ〜✨
ミニ演習🧩(3分でOK)
次のメソッド名、Command / Query どっち? 直感で分けてみて😊
AddTodo(title)GetTodos()MarkAsDone(id)FindTodos(keyword)GetAndUpdateLastAccessTime(userId)← これヤバそう?👻
答え:
- 1 Command🔧 / 2 Query🔍 / 3 Command🔧 / 4 Query🔍 / 5 混ぜてる疑い濃厚💣
AI活用コーナー🤖✨(Copilot/Codex向けの“安全な頼み方”)
「混ぜてる関数」を見つけたら、AIにこう頼むと強いよ😊
プロンプト例①:分離してほしい
- 「このメソッドをCQSに従って、CommandとQueryに分割して。副作用のある処理はCommand側に寄せて。命名も提案して。」
プロンプト例②:危険ポイントを洗い出したい
- 「このメソッドの副作用になりうる点を列挙して。呼び出し側が誤解しやすい理由も説明して。」
プロンプト例③:テスト観点がほしい
- 「Queryとして切り出した後、入力→出力のテストケース案を境界値込みで出して。」
👉 コツは「分けた後にレビュー質問をする」こと!AIの案は便利だけど、最後の判断は人間がやるのが安全だよ🧷😊
ちょい補足:CQSとCQRSって同じ?🧠
名前が似てて混乱しがちだけど…
- CQS:まずは「メソッドを混ぜない」っていう 設計の基本ルール📌 (martinfowler.com)
- CQRS:それをもっと大きくして、読み取り系と書き込み系を分ける アーキテクチャ寄りの考え方🏗️ (Kurrent - event-native data platform)
この教材はまず CQSで足腰を作る感じだよ〜😊✨
まとめ🎀✨(今日の持ち帰り)
- CQSは **「変更するなら返さない/返すなら変更しない」**📌
- “混ぜる”と、副作用が隠れてバグりやすい👻💥
- 今日からは 「混ぜない」だけ意識でOK😊🌱
次の第2章では、ミニプロジェクトを作って 「CQSを手で分ける体験」 に入るよ〜🪄✨