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

第06章:Bounded Contextを1行で言うと📝

1行でいうと✅

BCのバブル

Bounded Context(BC)=「この境界の中では、このモデルと言葉が“正しい意味”で通じる」範囲だよ😊🫶 公式っぽく言うなら、**「あるモデルが定義され、適用できる境界の説明」**って感じ📌 (Domain Language)


どうしてBCが必要なの?💥➡️🛟

BCが無い(または曖昧)だと、こうなるよ😵‍💫💦

  • 同じ単語なのに、部署や人で意味がズレる(例:「顧客」「注文」)🌀
  • みんなが「自分の意味のつもり」で話して、仕様がねじれる🧨
  • コードでは「1つのクラスに全部詰める」になって、if地獄変更が怖い😇🔥

BCはこの事故を、**“境界で止める”**ための考え方だよ🛡️✨ 「境界の内側は一貫、外側は別物でもOK🙆‍♀️」がポイント! (martinfowler.com)


BCの主役は「言葉」と「モデル」🗣️🧩

BCを構成する主役はこの2つだよ👇

  • 言葉(ユビキタス言語):チーム内で「その意味」で通じる単語セット📖
  • モデル:その言葉の意味を、ルール込みで表したもの(コード)🧠💻

そして、BCはこういう約束を作る👇

  • ✅ 境界の内側:言葉の意味がブレない
  • ✅ 境界の内側:ルール(制約)もブレない
  • ✅ 境界の外側:同じ単語でも別の意味でOK(混ぜない!)🙅‍♀️

この「境界の中だけ保証する」って発想がめちゃ大事だよ🥰 (martinfowler.com)


図でつかむBC(文章図)🫧🗺️

同じ「顧客」でも、BCが違うと意味が違ってOK!

🫧【請求BC】Billing Context
「顧客」=支払い責任者(請求先・税情報・請求ルール)

🫧【配送BC】Shipping Context
「顧客」=荷物の受取人(配送先住所・受取可否・置き配ルール)

同じ単語「顧客」でも、意味が違う。
→ だから、混ぜた瞬間に事故る💥

BCは「言葉の辞書が切り替わる境界」だと思うと分かりやすいよ📚✨ そして、境界をまたぐときは「翻訳」や「契約」が必要になる(これは後半でやるよ)📨🛡️ (martinfowler.com)


ミニEC題材で“衝突”を想像してみよ🛒📦💳🚚

この教材のミニECには、だいたいこの登場人物(領域)がいるよね😊

  • 受注(注文を受ける)📦
  • 在庫(数を確保する)📦📉
  • 配送(届ける)🚚
  • 請求(お金を請求する)💳

ここで「注文(Order)」が衝突しがち😇

  • 受注の「注文」=お客様との約束(何を買う?いくら?)
  • 配送の「注文」=出荷の指示(いつ出す?どこに?)
  • 請求の「注文」=請求の根拠(課税・締め・入金)

「注文って1つでしょ?」ってまとめると、意味が混ざって地獄🔥 BCで「この注文はどの世界の注文?」を固定するのが目的だよ✅ (Domain Language)


よくある誤解ベスト4😇⚠️

誤解1:BC=DB(テーブル)の境界?🧱

違うよ〜!BCの中心は言葉とモデル🗣️🧩 DBは結果として分かれることもあるけど、「まずDBで切る」は事故りやすい⚠️ (Domain Language)

誤解2:BC=必ずマイクロサービス?🧩➡️🧩🧩

「そうなることが多い」はあるけど、必ず1対1じゃないよ🙆‍♀️ 最初はモジュール分割(モジュラーモノリス)でも全然OK👌 (Microsoft Learn)

誤解3:BCは最初から完璧に決めるべき?💎

完璧主義は捨てよ〜😆🫶 BCは「学びながら育てる」もの。仮置きして改善でOK🌱 (Microsoft Learn)

誤解4:BCの境界は“フォルダ”だけで守れる?📁

フォルダは目印にはなるけど、守りは別途必要になりがち🙅‍♀️ (参照ルール、公開範囲、契約DTO…このへんは後半でガッツリ✨)


本章のミニ演習🎮✨(10〜15分)

演習A:1行定義を作る📝

次の単語を、それぞれのBCで1行定義してみてね😊✨

  • 「顧客」:請求BC / 配送BC
  • 「住所」:請求BC / 配送BC
  • 「金額」:受注BC / 請求BC

コツ:**“誰の目的?”**を先に書くとブレにくいよ👀🎯

演習B:混ざってるサインを探す🔍🚨

次のサインが出たら「BC曖昧かも?」って疑ってOK👇

  • クラス名が User / Customer / Order みたいに万能化してる💣
  • プロパティが増殖して「関係ない情報」まで同居してる📈
  • 状態(Status)が部署ごとの意味を全部背負ってる😇

C#で“境界を見える化”する超ミニ例💻✨

同じ単語でも、BCが違えば「別の型」でOK🙆‍♀️ まずは 名前空間で境界を見える化する例だよ👇

namespace MiniEc.Billing; // 🫧請求BC

public sealed class Customer
{
public required string BillingName { get; init; } // 請求名義
public required string TaxId { get; init; } // 税情報(例)
}

namespace MiniEc.Shipping; // 🫧配送BC

public sealed class Customer
{
public required string RecipientName { get; init; } // 受取人
public required string AddressLine { get; init; } // 配送先住所
}

ポイントはこれ👇🥰

  • 「Customer」という同じ単語が、BCごとに別物として存在してる✅
  • これだけで「混ぜると危ない」がコードで見える👀⚠️
  • もっと進むと「境界を越えるときはDTOで渡す」が基本になる📨✨

(ちなみに今のC#はC# 14/.NET 10が最新世代だよ📌) (Microsoft Learn)


つまずきポイント救急箱🧰💞

  • 「BCって結局“どこで切るの?”」→ まずは単語の意味がズレる場所からでOK🗣️🧨
  • 「同じ単語は統一しないとダメ?」→ 境界が違えば別物でOK🙆‍♀️(むしろ無理に統一すると事故)
  • 「切りすぎが怖い」→ 最初は3〜6個くらいの候補で仮置きが現実的👌 (Microsoft Learn)

本章まとめ🌸✅

  • BCは **「言葉とモデルの意味が一貫する範囲」**🫧
  • 同じ単語でも、境界が違えば別物でOK🙆‍♀️
  • 事故の原因は「混ざること」→ BCはそれを境界で止める🛡️✨ (Domain Language)

お助けAIプロンプト🤖✨(第6章)

  • 「この文章の“同じ単語で意味が変わっている”箇所を列挙して🔍」
  • 「“顧客”“注文”“住所”を、請求BCと配送BCでそれぞれ1行定義して📝」
  • 「ミニECの説明から、BC候補を3つ出して、各BCの目的を1行で付けて🏷️」
  • 「“混ざってるサイン”が出てるクラス名を挙げて、分離案も出して⚖️」

第07章:事故例①「顧客」が3人いる👤👤👤