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

第1章:CQSってなに?まずは超ざっくり掴もう🧠🌱

この章のゴール🎯✨

  • CQSの合言葉を1行で言えるようになる📌
  • ざっくり Command / Query の区別ができるようになる👀
  • 「混ぜない」意識を今日から持てるようになる😊

CQSの一言📌

CQS Separation Concept

「変更するなら返さない/返すなら変更しない」

もっと言うと…

  • Command(コマンド):状態を変える(書き込み)🔧
  • Query(クエリ):情報を返す(読み取り)🔍
  • **同じメソッドで両方やらない!**🙅‍♀️

これは、Bertrand Meyer が提唱した “Command–Query Separation” の考え方として広く知られてるよ〜📚✨ (martinfowler.com)


まずは感覚でOK!CommandとQueryの違い🧩

Command(状態を変える)🔧

例:

  • TODOを追加する✅
  • パスワードを変更する🔐
  • 注文を確定する📦
  • メール送信する📧

👉 世界がちょっとでも変わったら Command だと思ってOK😊

Query(状態を変えない)🔍

例:

  • TODO一覧を取得する📄
  • 注文の合計金額を見る💰
  • ユーザー情報を表示する👤

👉 見に行くだけなら Query だよ〜😊


“混ぜる”と何がイヤなの?😇💥(超わかる例)

Hidden Side Effects

たとえばこんなの👇

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 どっち? 直感で分けてみて😊

  1. AddTodo(title)
  2. GetTodos()
  3. MarkAsDone(id)
  4. FindTodos(keyword)
  5. 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を手で分ける体験」 に入るよ〜🪄✨