第5章 中心(Core)が主役な理由🏠❤️
この章は「ヘキサゴナルって結局、何を守りたい設計なの?」をハッキリさせる回だよ〜😊✨ 結論から言うと、**守りたいのは“変わりにくい業務ルール(Core)”**です🛡️
0) 今日のゴール🎯✨
読み終わったら、これが言えるようになります👇
- 「UIやDBは変わる。だから真ん中に置かない」って説明できる😊
- Coreに入れていいもの/ダメなものが分かる🚦
- 「Coreを守るためのPort」って発想がスッと入る🔌💡
1) まず“変わるもの”を正直に見よう👀🔁
アプリ開発って、だいたいこうです👇
- 画面:デザイン変更・UX改善・スマホ対応・管理画面追加…📱🎨
- DB:SQLite→PostgreSQL→クラウドDB、ORM変更…🗄️🔁
- 外部:決済APIの仕様変更・レート制限・認証方式変更…💳📡
- 運用:ログ方針・監視・リトライ・タイムアウト…🧯📝
つまり 外側は“いつでも変わる前提” なんだよね😵💫
一方で 変わりにくいもの もあります👇
- 「注文は在庫があるときだけ確定できる」📦✅
- 「金額はマイナス禁止」💰🚫
- 「会員ランクで割引率が変わる」🏷️✨
こういうのが 業務ルール(=Coreの宝物) だよ💎❤️
2) 2026年の現実:外側の進化が速い🏎️💨
いまの最新系だと、.NETは .NET 10 がLTS(長期サポート)で、2026年1月時点の最新パッチは 10.0.2 だよ📌 (Microsoft) そしてC#も C# 14 を .NET 10 / Visual Studio 2026 で試せるって公式に書いてあるよ✨ (Microsoft Learn) さらに Visual Studio 2026 も 2026年1月に更新が出てる(例:18.2.0が2026/1/13)📅 (Microsoft Learn)
つまり何が言いたいかというと…
道具(UI/DB/フレームワーク)は今後も普通に変わる だからこそ 変わりにくいCoreを主役にする のが超大事!😊🛡️
3) Coreが主役って、どういう形?🔷🏠

イメージはこう👇(ざっくりでOK!)
ポイントは超シンプル👇
- Coreは「何をしたいか」だけ知ってる(例:保存したい、時刻がほしい)🧠
- どうやってやるか(DBで保存、APIで取得)は知らない 🙅♀️
- “どうやるか”は 外側(Adapter)が担当 🔧✨
4) Coreに入れていいもの/ダメなもの🚦🙂
✅ Coreに入れていい(入れてほしい)もの
- ドメインのルール(制約・計算・判断)📏🧮
- ユースケースの手順(注文作る、一覧出す、など)🧭
- Port(interface:保存、取得、現在時刻など)🔌
❌ Coreに入れない(入れちゃダメ)もの
- ASP.NETのControllerやHttpContext 🌐🚫
- DBのORMの属性やDBモデル(例:EFの
[Key]とか)🗄️🚫 - 外部APIの都合(HTTPレスポンス構造そのまま等)📡🚫
5) ミニ例:割引ルールはCoreに置く☕💰✨
「カフェ注文」で、会員ランクによって割引するルールがあるとするね☺️
✅ Core側:ルールは“純粋な計算”にする(外を知らない)
public enum MemberRank { Normal, Silver, Gold }
public static class PricingRule
{
public static decimal ApplyDiscount(decimal total, MemberRank rank)
{
var rate = rank switch
{
MemberRank.Gold => 0.90m, // 10%オフ✨
MemberRank.Silver => 0.95m, // 5%オフ✨
_ => 1.00m
};
return decimal.Round(total * rate, 0); // 円なので丸め🙂
}
}
これ、Coreとして最高の形🎉 なぜなら…
- DBがSQLiteでもPostgreSQLでも関係ない🗄️➡️🙂
- 画面がWebでもスマホでも関係ない📱➡️🙂
- テストが超ラク(関数に数字入れるだけ)🧪✨
6) “悪い混ぜ方”を見てピンと来よう🍝😭
たとえば、CoreのEntityにDB都合を混ぜると…
// 😭 例:CoreにDBの都合が入り込む
using System.ComponentModel.DataAnnotations;
public class Order
{
[Key] // ← DB都合が侵入🗄️💥
public int Id { get; set; }
public decimal Total { get; set; }
}
これをやると、将来こうなる確率が上がります👇😵💫
- ORM変えたいのに、Coreが巻き込まれて大改造💥
- Coreが「DBの型」「DBの制約」に引っぱられる🧲
- テストが重くなる(DB準備が必要になりがち)🧪💦
だから Coreは“外の都合”から隔離 するのが勝ちです🛡️✨
7) 今日のミニ演習(15〜25分)✍️😊
演習A:あなたのアプリの「変わるもの」リスト作ってみよ📋🔁
- 画面は何が変わりそう?
- DBは将来どうなりそう?
- 外部サービスは増えそう?
👉 これを出すだけで「外側」候補が見えてくるよ✨
演習B:業務ルールを“純粋関数”にしてみよ🧠🧮
- 例:割引、制限、丸め、判定(OK/NG)
👉 「引数→戻り値」だけで完結させるのがコツ😊
演習C:外が必要なものをPortにしてみよ🔌
- 例:「現在時刻が欲しい」なら
IClock - 例:「保存したい」なら
IOrderRepository
(中身は次章以降でガッツリやるよ〜💪✨)
8) AI活用のコツ(この章向け)🤖💡
AIにはこう頼むと強いよ👇
- 「割引ルールを副作用なしで実装して」
- 「このルールの境界ケース(0円、超大きい値、端数)を洗い出して」
- 「xUnitでこの関数のテストを書いて(パラメータ化も)」🧪✨
でも最後に人間が見るポイントはこれ👇🚦
- Coreに外の都合が混ざってない?(DB属性・HTTP型など)
- ルールが説明できる言葉になってる?(命名が大事!)😊
9) まとめ🎁❤️
- 外側(UI/DB/外部API)は変わる。だから 真ん中に置かない 🔁🚫
- 守りたいのは 業務ルール(Core) 🛡️
- Coreは外を知らない。外と話すときは Port(約束) 🔌✨
Core主役チェック✅
- Coreプロジェクトだけで「ルールと手順」が読める?📖
- CoreがASP.NET/ORM/外部SDKに依存してない?🚫
- ルールはテストがサクッと書けそう?🧪✨
次の章(第6章)で、いよいよ Inbound(外→中) の「入口を薄くする」感覚を掴みにいくよ〜🚪😊✨