<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Architecture on 設計で、迷わなくなるために | 奥田智紘</title><link>https://design.okuda-studio.com/categories/architecture/</link><description>Recent content in Architecture on 設計で、迷わなくなるために | 奥田智紘</description><generator>Hugo -- 0.159.2</generator><language>ja</language><lastBuildDate>Thu, 02 Apr 2026 13:00:00 +0900</lastBuildDate><atom:link href="https://design.okuda-studio.com/categories/architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>リポジトリがドメインに依存しすぎた話</title><link>https://design.okuda-studio.com/posts/0022-repository-depends-on-domain/</link><pubDate>Thu, 02 Apr 2026 13:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0022-repository-depends-on-domain/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%A1%8C%E6%9D%90"&gt;題材&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%8C%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AB%E4%BE%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%82%E3%82%8A%E3%81%8B"&gt;リポジトリがドメインに依存するのはありか？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E7%9F%A5%E3%82%8A%E3%81%99%E3%81%8E%E3%81%9F%E5%AE%9F%E8%A3%85"&gt;ドメインを知りすぎた実装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E7%9F%A5%E3%82%8A%E3%81%99%E3%81%8E%E3%81%AA%E3%81%84%E5%AE%9F%E8%A3%85"&gt;ドメインを知りすぎない実装&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;今回は、リポジトリがドメインに依存しすぎた話を書きたいと思います。&lt;/p&gt;
&lt;h2 id="題材"&gt;題材&lt;/h2&gt;
&lt;p&gt;題材は、口座振替管理アプリで、ローカルの DB にデータを保存する場合の話です。&lt;/p&gt;
&lt;p&gt;支払情報編集画面という画面があり、この画面では、データの新規登録と既存データの更新が可能になっています。&lt;/p&gt;
&lt;p&gt;この「新規登録」処理と「更新」処理を行う際に、リポジトリはどこまでドメインを知っていていいのか？という話になります。&lt;/p&gt;
&lt;h2 id="リポジトリがドメインに依存するのはありか"&gt;リポジトリがドメインに依存するのはありか？&lt;/h2&gt;
&lt;p&gt;まず、クリーンアーキテクチャ的には、リポジトリがドメインに依存することは間違ってはいません。&lt;/p&gt;
&lt;p&gt;ただし、どこまで知っていてよいのかは検討の余地があるというのが今回の学びです。&lt;/p&gt;
&lt;h2 id="ドメインを知りすぎた実装"&gt;ドメインを知りすぎた実装&lt;/h2&gt;
&lt;p&gt;まずは、ドメインを知りすぎた良くない実装を紹介します。&lt;/p&gt;
&lt;p&gt;以下は、支払情報を表す &lt;code&gt;Payment&lt;/code&gt; オブジェクトです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;sealed&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Payment&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; name: PaymentName
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; payerId: PayerId
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;data&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Persisted&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; id: PaymentId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; name: PaymentName,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; payerId: PayerId = &lt;span style="color:#a6e22e"&gt;PayerId&lt;/span&gt;.NONE,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) : Payment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;data&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;InMemory&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; name: PaymentName,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;override&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; payerId: PayerId = &lt;span style="color:#a6e22e"&gt;PayerId&lt;/span&gt;.NONE,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) : Payment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;編集の場合は、すでにデータが永続化されているため、 &lt;code&gt;Persisted&lt;/code&gt; オブジェクトで表現します。永続化済みのデータは ID を持っています。&lt;/p&gt;
&lt;p&gt;新規登録の場合は、 ID を持っていないため &lt;code&gt;InMemory&lt;/code&gt; オブジェクトで表現します。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;リポジトリ側には、この &lt;code&gt;Payment&lt;/code&gt; オブジェクトが渡され、このオブジェクトの実態が &lt;code&gt;Persisted&lt;/code&gt; なのか、 &lt;code&gt;InMemory&lt;/code&gt; なのかによって、新規作成か、更新かを分けています。&lt;/p&gt;</description></item><item><title>Jetpack Compose Navigation のパラメータ指定の罠</title><link>https://design.okuda-studio.com/posts/0021-navigation-should-have-primitive/</link><pubDate>Sun, 22 Mar 2026 18:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0021-navigation-should-have-primitive/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%99%E3%81%90%E3%81%AB%E6%80%9D%E3%81%84%E3%81%A4%E3%81%8F%E5%AE%9F%E8%A3%85"&gt;すぐに思いつく実装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90-or-%E7%B7%A8%E9%9B%86%E3%82%92%E5%9E%8B%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B"&gt;「新規作成 or 編集」を型で表現する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AE%E3%81%8B"&gt;なぜエラーになるのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%AD%A3%E3%81%97%E3%81%84%E8%A8%AD%E8%A8%88navigation-%E3%81%AF%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3%82%A3%E3%83%96%E5%9E%8B%E3%82%92%E6%B8%A1%E3%81%99"&gt;正しい設計：Navigation はプリミティブ型を渡す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%87%8D%E8%A6%81%E3%81%AA%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88"&gt;重要なポイント&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#navigation%E3%81%AE%E8%B2%AC%E5%8B%99"&gt;Navigationの責務&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ui-%E3%81%AE%E8%B2%AC%E5%8B%99"&gt;UI の責務&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;一覧画面から「新規作成」と「編集」の両方に遷移するケースは、アプリ開発でよくあります。&lt;/p&gt;
&lt;p&gt;例えば以下のような仕様です：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;リストのアイテムをタップ → 編集画面へ&lt;/li&gt;
&lt;li&gt;「追加」ボタンをタップ → 新規作成画面へ&lt;/li&gt;
&lt;li&gt;画面UIは同じ（内部の動作だけ異なる）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="すぐに思いつく実装"&gt;すぐに思いつく実装&lt;/h2&gt;
&lt;p&gt;すぐに思いつく実装方法は以下ではないでしょうか？&lt;/p&gt;
&lt;p&gt;Navigation の定義は以下の通り&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; NavHost(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navController = navController,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; startDestination = startDestination,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modifier = modifier,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// リスト画面
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; composable&amp;lt;ItemList&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PayeeListScreen(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; onClickAdd = {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navController.navigate(RegisterItem(&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; onClickItem = { itemId &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navController.navigate(RegisterItem(itemId))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 登録・編集画面
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; composable&amp;lt;RegisterItem&amp;gt; { backStackEntry &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; registerItem: RegisterItem = backStackEntry.toRoute()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RegisterItemScreen(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; onClickNavigateUp = { navController.navigateUp() },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; itemId = registerItem.id
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Destination の定義は以下の通り&lt;/p&gt;</description></item><item><title>ワイヤーフレームからドメイン設計が進んだ話</title><link>https://design.okuda-studio.com/posts/0020-wireframe-with-ddd/</link><pubDate>Wed, 18 Mar 2026 11:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0020-wireframe-with-ddd/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%A8%AD%E8%A8%88%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AF%E5%9F%8B%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E9%81%95%E5%92%8C%E6%84%9F"&gt;ドメイン設計だけでは埋まらない違和感&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E8%B5%B7%E3%81%8D%E3%81%9F%E5%A4%89%E5%8C%96"&gt;ワイヤーフレームを作って起きた変化&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E8%A1%8C%E5%8B%95%E3%81%8C%E5%85%B7%E4%BD%93%E5%8C%96%E3%81%95%E3%82%8C%E3%82%8B"&gt;1. ユーザーの行動が具体化される&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E5%88%B6%E7%B4%84%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%A6%E3%81%8F%E3%82%8B"&gt;2. 必要なデータと制約が見えてくる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%A8%AD%E8%A8%88%E3%81%AE%E6%8A%9C%E3%81%91%E3%81%8C%E9%9C%B2%E5%87%BA%E3%81%99%E3%82%8B"&gt;3. ドメイン設計の「抜け」が露出する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%AF%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%AE%E3%81%9F%E3%82%81%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84"&gt;ワイヤーフレームは見た目のためではない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB"&gt;おわりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;最近、アプリ開発の中で「ワイヤーフレーム」を使い始めたところ、思いがけずドメイン設計が大きく前進しました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ワイヤーフレームとは、 Figma などを使って作る UI デザインの一種です。&lt;br&gt;
ただし、色やフォントサイズなどの細かい UI にはこだわりません。&lt;br&gt;
ボタンや入力欄であることがわかれば良いという程度のラフな UI デザインのことを言います。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;もともとドメイン駆動で設計を進めていたのですが、どうしても「抜け」や「曖昧さ」が残る感覚があり、手応えが弱い状態が続いていました。&lt;/p&gt;
&lt;p&gt;しかし、ワイヤーフレームを作り始めたことで、その状況が一変しました。&lt;/p&gt;
&lt;p&gt;この記事では、
&lt;strong&gt;ワイヤーフレームがどのようにドメイン設計を補完し、加速させたのか&lt;/strong&gt;を整理してみます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ドメイン設計だけでは埋まらない違和感"&gt;ドメイン設計だけでは埋まらない違和感&lt;/h2&gt;
&lt;p&gt;ドメイン設計を進めていると、以下のような状態に陥ることがありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユースケースはある程度整理されている&lt;/li&gt;
&lt;li&gt;エンティティや値オブジェクトも定義できている&lt;/li&gt;
&lt;li&gt;しかし「本当にこれで使えるのか？」という違和感がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、&lt;strong&gt;構造はあるが、実感がない状態&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;このとき不足していたのは、「ユーザーがどう操作するか」という視点でした。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ワイヤーフレームを作って起きた変化"&gt;ワイヤーフレームを作って起きた変化&lt;/h2&gt;
&lt;p&gt;試しにワイヤーフレームを作り始めたところ、明確な変化がありました。&lt;/p&gt;
&lt;h3 id="1-ユーザーの行動が具体化される"&gt;1. ユーザーの行動が具体化される&lt;/h3&gt;
&lt;p&gt;ワイヤーフレームでは「画面上で何をするか」を考える必要があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;どこで入力するのか&lt;/li&gt;
&lt;li&gt;どの順番で操作するのか&lt;/li&gt;
&lt;li&gt;何を確定とみなすのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これにより、ユースケースが単なる文章ではなく、&lt;strong&gt;操作として具体化&lt;/strong&gt;されました。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="2-必要なデータと制約が見えてくる"&gt;2. 必要なデータと制約が見えてくる&lt;/h3&gt;
&lt;p&gt;操作を具体的にすると、自然と以下が見えてきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この画面では何のデータが必要か&lt;/li&gt;
&lt;li&gt;この操作はどんな条件で許されるのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここで重要なのが、 &lt;strong&gt;不変条件（インバリアント）&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;例えば、口座振替管理アプリなら、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支払い元は必ず 1 つである&lt;/li&gt;
&lt;li&gt;振替は「元 → 先」の関係を持つ&lt;/li&gt;
&lt;li&gt;不正な組み合わせは作れない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;など、これらはドメイン設計だけでも定義できますが、
ワイヤーフレーム上で「操作」として考えることで、一気に現実味を帯びます。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="3-ドメイン設計の抜けが露出する"&gt;3. ドメイン設計の「抜け」が露出する&lt;/h3&gt;
&lt;p&gt;ワイヤーフレームを作る中で、次のような気づきが頻発しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この状態、どうやって作る？&lt;/li&gt;
&lt;li&gt;この操作、どのユースケースに対応する？&lt;/li&gt;
&lt;li&gt;このデータ、どこに属する？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、&lt;strong&gt;ドメイン設計で曖昧だった部分が強制的に表に出てくる&lt;/strong&gt;のです。&lt;/p&gt;</description></item><item><title>DDDで「集約はIDで参照する」とはどういう意味か</title><link>https://design.okuda-studio.com/posts/0019-reference-by-id/</link><pubDate>Thu, 12 Mar 2026 19:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0019-reference-by-id/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8F%82%E7%85%A7%E3%81%AE%E5%A0%B4%E5%90%88"&gt;オブジェクト参照の場合&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#order"&gt;Order&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#user"&gt;User&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;アプリケーションサービス&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#id%E5%8F%82%E7%85%A7%E3%81%AE%E5%A0%B4%E5%90%88"&gt;ID参照の場合&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#order-1"&gt;Order&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#user-1"&gt;User&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-1"&gt;アプリケーションサービス&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%81%95%E3%81%84%E3%82%92%E6%95%B4%E7%90%86"&gt;違いを整理&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8F%82%E7%85%A7"&gt;オブジェクト参照&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#id%E5%8F%82%E7%85%A7"&gt;ID参照&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%82%E3%81%86%E4%B8%80%E3%81%A4%E9%87%8D%E8%A6%81%E3%81%AA%E9%81%95%E3%81%84%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E3%81%AB%E6%8B%A1%E5%BC%B5%E3%81%A7%E3%81%8D%E3%82%8B"&gt;もう一つ重要な違い：イベント駆動に拡張できる&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#application-service"&gt;Application Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%9A%E7%BE%A9"&gt;イベントの定義&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#eventbus%E3%81%AE%E7%B0%A1%E6%98%93%E5%AE%9F%E8%A3%85"&gt;EventBusの簡易実装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9"&gt;イベントハンドラ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E7%99%BB%E9%8C%B2"&gt;ハンドラ登録&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E6%B5%81%E3%82%8C"&gt;イベントの流れ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;ドメイン駆動設計（DDD）では、次のようなルールをよく目にします。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;集約は他の集約を &lt;strong&gt;IDで参照する&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しかし、初めてこのルールを見たときに疑問が浮かびます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ID参照にしても結局 &lt;code&gt;Repository.find(id)&lt;/code&gt; で取得できるのでは？&lt;/li&gt;
&lt;li&gt;それなら普通のオブジェクト参照とあまり変わらないのでは？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この記事では、このルールの意味を &lt;strong&gt;実際のコードで比較しながら&lt;/strong&gt;説明します。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="オブジェクト参照の場合"&gt;オブジェクト参照の場合&lt;/h1&gt;
&lt;p&gt;まず、他の集約を &lt;strong&gt;オブジェクトとして直接持つ設計&lt;/strong&gt;を見てみます。&lt;/p&gt;
&lt;h2 id="order"&gt;Order&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Order&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; id: OrderId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; user: User
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;place&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 注文処理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user.upgradeToPremium()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tips : place という単語には、 注文を出す / 発注する という意味があります。&lt;/p&gt;
&lt;h2 id="user"&gt;User&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;User&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; id: UserId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; plan: Plan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;upgradeToPremium&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plan = &lt;span style="color:#a6e22e"&gt;Plan&lt;/span&gt;.PREMIUM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アプリケーションサービス"&gt;アプリケーションサービス&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;placeOrder&lt;/span&gt;(orderId: OrderId) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; order = orderRepository.find(orderId)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; order.place()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orderRepository.save(order)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで起きていることを図にすると次のようになります。&lt;/p&gt;</description></item><item><title>一つの集約にまとめるべきか、別の集約に分けるべきかの判断基準（DDD）</title><link>https://design.okuda-studio.com/posts/0018-aggregation-separation/</link><pubDate>Thu, 12 Mar 2026 18:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0018-aggregation-separation/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E5%AE%88%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%81%8B%E6%9C%80%E9%87%8D%E8%A6%81"&gt;1. 不変条件を同時に守る必要があるか（最重要）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A5%E9%9B%86%E7%B4%84%E3%81%AB%E3%81%AA%E3%82%8B%E4%BE%8B"&gt;別集約になる例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%81%8C%E4%B8%80%E7%B7%92%E3%81%8B"&gt;2. ライフサイクルが一緒か&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B-1"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A5%E9%9B%86%E7%B4%84%E3%81%AE%E4%BE%8B"&gt;別集約の例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E9%9B%86%E7%B4%84%E3%81%AF%E4%BB%96%E3%81%AE%E9%9B%86%E7%B4%84%E3%82%92id%E3%81%A7%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B"&gt;3. 集約は他の集約をIDで参照する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E5%90%8C%E6%99%82%E3%81%AB%E6%9B%B4%E6%96%B0%E3%81%95%E3%82%8C%E3%82%8B%E3%81%8B"&gt;4. 同時に更新されるか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B-2"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E9%9B%86%E7%B4%84%E3%81%AF%E5%B0%8F%E3%81%95%E3%81%8F%E4%BF%9D%E3%81%A4"&gt;5. 集約は小さく保つ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;ドメイン駆動設計（DDD）で設計をしていると、次のような疑問に必ずぶつかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;このエンティティは同じ集約に入れるべきか？&lt;/li&gt;
&lt;li&gt;それとも別の集約として切り離すべきか？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;集約の境界は、DDDにおいて非常に重要な設計判断です。
この記事では、実務でよく使われる判断基準を整理します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-不変条件を同時に守る必要があるか最重要"&gt;1. 不変条件を同時に守る必要があるか（最重要）&lt;/h2&gt;
&lt;p&gt;最も重要な基準は &lt;strong&gt;不変条件（Invariant）&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「このルールは常に同時に成立している必要があるか？」&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YESなら &lt;strong&gt;同じ集約&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;NOなら &lt;strong&gt;別集約&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="例"&gt;例&lt;/h3&gt;
&lt;p&gt;注文と注文明細&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order
└ OrderItem
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;不変条件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注文の合計金額 = 各注文金額の合計&lt;/li&gt;
&lt;li&gt;注文明細の数量 ≥ 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数量が変われば、注文全体の合計金額は変わります。
つまり、これらは &lt;strong&gt;常に同時に成立している必要&lt;/strong&gt;があります。
そのため &lt;code&gt;Order&lt;/code&gt; と &lt;code&gt;OrderItem&lt;/code&gt; は &lt;strong&gt;同じ集約&lt;/strong&gt;になります。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="別集約になる例"&gt;別集約になる例&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order
Inventory (在庫)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ルール&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;注文が確定したら在庫を減らす
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この処理は&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;注文確定&lt;/li&gt;
&lt;li&gt;在庫更新&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;の2つの処理に分かれます。&lt;/p&gt;
&lt;p&gt;これらは &lt;strong&gt;同時トランザクションでなくても問題ない&lt;/strong&gt;ため&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order集約
Inventory集約
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;と分けます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-ライフサイクルが一緒か"&gt;2. ライフサイクルが一緒か&lt;/h2&gt;
&lt;p&gt;次に考えるのは &lt;strong&gt;ライフサイクル&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「一緒に生まれて一緒に消えるか？」&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YES → 同じ集約&lt;/li&gt;
&lt;li&gt;NO → 別集約&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="例-1"&gt;例&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Order
└ OrderItem
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;OrderItem&lt;/code&gt; は&lt;/p&gt;</description></item><item><title>ドメイン設計テンプレート</title><link>https://design.okuda-studio.com/posts/0016-ddd-practice-template/</link><pubDate>Wed, 11 Mar 2026 10:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0016-ddd-practice-template/</guid><description>&lt;p&gt;このドキュメントは、DDD（ドメイン駆動設計）に基づいて、ソフトウェアを設計するためのテンプレートです。&lt;/p&gt;
&lt;p&gt;上から順番にテンプレートを埋めていくことで、 DDD に基づいたドメイン周りの設計がスムーズに行えるように作っています。&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A6%82%E8%A6%81"&gt;1. システム概要&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%9B%AE%E7%9A%84"&gt;システムの目的&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AF%BE%E8%B1%A1%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC"&gt;対象ユーザー&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%84%E8%AA%B2%E9%A1%8C"&gt;解決したい課題&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9"&gt;2. ユースケース&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;ユースケース一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;ユースケース詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B"&gt;【例】振替関係を作成する&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%85%A5%E5%8A%9B"&gt;入力&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86%E6%A6%82%E8%A6%81"&gt;処理概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%BA%E5%8A%9B"&gt;出力&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E"&gt;3. ユビキタス言語&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%A6%82%E5%BF%B5"&gt;概念&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%80%99%E8%A3%9C%E3%81%A8%E3%81%9D%E3%81%AE%E8%A8%80%E8%91%89%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8"&gt;候補とその言葉のイメージ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%B3%9B%E5%90%A6%E3%81%AE%E6%84%8F%E8%A6%8B"&gt;賛否の意見&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%80%E8%91%89%E3%81%AE%E6%B1%BA%E5%AE%9A%E3%81%A8%E3%81%9D%E3%81%AE%E6%8E%A1%E7%94%A8%E7%90%86%E7%94%B1"&gt;言葉の決定とその採用理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E%E8%BE%9E%E6%9B%B8"&gt;ユビキタス言語辞書&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E5%80%99%E8%A3%9C"&gt;4. エンティティ候補&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6invariant"&gt;5. 不変条件（Invariant）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;6. 状態遷移&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B"&gt;状態&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;状態遷移&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E9%9B%86%E7%B4%84%E8%A8%AD%E8%A8%88"&gt;7. 集約設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E4%B8%80%E8%A6%A7"&gt;集約一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E8%A9%B3%E7%B4%B0"&gt;集約詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation-1"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%B1%9E%E6%80%A7"&gt;属性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6"&gt;不変条件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89"&gt;ドメインメソッド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;8. ドメインサービス&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;サービス一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;サービス詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferservice"&gt;【例】TransferService&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA"&gt;9. リポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A8%AD%E8%A8%88"&gt;10. ユースケース設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#usecase%E4%B8%80%E8%A6%A7"&gt;UseCase一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase%E8%A9%B3%E7%B4%B0"&gt;UseCase詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Bcreatetransferrelationusecase"&gt;【例】CreateTransferRelationUseCase&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86"&gt;処理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="1-システム概要"&gt;1. システム概要&lt;/h1&gt;
&lt;h2 id="システムの目的"&gt;システムの目的&lt;/h2&gt;
&lt;p&gt;このシステムは何を解決するものか。&lt;/p&gt;
&lt;p&gt;【例】&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フリーランスの固定費を管理する&lt;/li&gt;
&lt;li&gt;口座振替の関係を可視化する&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="対象ユーザー"&gt;対象ユーザー&lt;/h2&gt;
&lt;p&gt;このシステムのユーザー。&lt;/p&gt;
&lt;p&gt;【例】&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;個人&lt;/li&gt;
&lt;li&gt;フリーランス&lt;/li&gt;
&lt;li&gt;企業&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="解決したい課題"&gt;解決したい課題&lt;/h2&gt;
&lt;p&gt;【例】&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;固定費の支払い関係が分かりにくい&lt;/li&gt;
&lt;li&gt;口座振替の全体構造を把握できない&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id="2-ユースケース"&gt;2. ユースケース&lt;/h1&gt;
&lt;p&gt;ユーザーがシステムで行う操作を列挙する。&lt;/p&gt;</description></item><item><title>ドメイン設計テンプレート（補強版）</title><link>https://design.okuda-studio.com/posts/0017-ddd-practice-template2/</link><pubDate>Wed, 11 Mar 2026 10:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0017-ddd-practice-template2/</guid><description>&lt;p&gt;このドキュメントは、 &lt;a href="https://design.okuda-studio.com/posts/0016-ddd-practice-template/"&gt;ドメイン設計テンプレート&lt;/a&gt; に以下の項目を加えた補強版となっています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4.境界コンテキスト&lt;/li&gt;
&lt;li&gt;5.コンテキストマップ&lt;/li&gt;
&lt;li&gt;7.値オブジェクト&lt;/li&gt;
&lt;li&gt;12.ドメインイベント&lt;/li&gt;
&lt;li&gt;15.集約境界図&lt;/li&gt;
&lt;li&gt;16.不変条件の責任&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A6%82%E8%A6%81"&gt;1. システム概要&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%9B%AE%E7%9A%84"&gt;システムの目的&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AF%BE%E8%B1%A1%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC"&gt;対象ユーザー&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%81%84%E8%AA%B2%E9%A1%8C"&gt;解決したい課題&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9"&gt;2. ユースケース&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;ユースケース一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;ユースケース詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B"&gt;【例】振替関係を作成する&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%85%A5%E5%8A%9B"&gt;入力&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86%E6%A6%82%E8%A6%81"&gt;処理概要&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%87%BA%E5%8A%9B"&gt;出力&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E"&gt;3. ユビキタス言語&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%A6%82%E5%BF%B5"&gt;概念&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%80%99%E8%A3%9C%E3%81%A8%E3%81%9D%E3%81%AE%E8%A8%80%E8%91%89%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8"&gt;候補とその言葉のイメージ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%B3%9B%E5%90%A6%E3%81%AE%E6%84%8F%E8%A6%8B"&gt;賛否の意見&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%80%E8%91%89%E3%81%AE%E6%B1%BA%E5%AE%9A%E3%81%A8%E3%81%9D%E3%81%AE%E6%8E%A1%E7%94%A8%E7%90%86%E7%94%B1"&gt;言葉の決定とその採用理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E%E8%BE%9E%E6%9B%B8"&gt;ユビキタス言語辞書&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E5%A2%83%E7%95%8C%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88"&gt;4. 境界コンテキスト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%83%83%E3%83%97"&gt;5. コンテキストマップ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E5%80%99%E8%A3%9C"&gt;6. エンティティ候補&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E5%80%A4%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88"&gt;7. 値オブジェクト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6invariant"&gt;8. 不変条件（Invariant）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;9. 状態遷移&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B"&gt;状態&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB"&gt;状態遷移&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E9%9B%86%E7%B4%84%E8%A8%AD%E8%A8%88"&gt;10. 集約設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E4%B8%80%E8%A6%A7"&gt;集約一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E8%A9%B3%E7%B4%B0"&gt;集約詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation-1"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%B1%9E%E6%80%A7"&gt;属性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6"&gt;不変条件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89"&gt;ドメインメソッド&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#11-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;11. ドメインサービス&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E4%B8%80%E8%A6%A7"&gt;サービス一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%A9%B3%E7%B4%B0"&gt;サービス詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferservice"&gt;【例】TransferService&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#12-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88"&gt;12. ドメインイベント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E8%A9%B3%E7%B4%B0"&gt;イベント詳細&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelationcreated"&gt;【例】TransferRelationCreated&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%99%BA%E7%94%9F%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0"&gt;発生タイミング&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%9A%E3%82%A4%E3%83%AD%E3%83%BC%E3%83%89"&gt;ペイロード&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#13-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA"&gt;13. リポジトリ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#14-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A8%AD%E8%A8%88"&gt;14. ユースケース設計&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#usecase%E4%B8%80%E8%A6%A7"&gt;UseCase一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase%E8%A9%B3%E7%B4%B0"&gt;UseCase詳細&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Bcreatetransferrelationusecase"&gt;【例】CreateTransferRelationUseCase&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E5%87%A6%E7%90%86"&gt;処理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#15-%E9%9B%86%E7%B4%84%E5%A2%83%E7%95%8C%E5%9B%B3aggregate-boundary"&gt;15. 集約境界図（Aggregate Boundary）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8Btransferrelation-2"&gt;【例】TransferRelation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E5%90%8D--aggregate-root"&gt;集約名 / Aggregate Root&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%86%85%E9%83%A8%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3"&gt;内部エンティティ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%80%A4%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88"&gt;値オブジェクト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E5%A2%83%E7%95%8C"&gt;集約境界&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%A4%96%E9%83%A8%E5%8F%82%E7%85%A7"&gt;外部参照&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84%E3%83%AB%E3%83%BC%E3%83%AB"&gt;集約ルール&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#16-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%AE%E8%B2%AC%E4%BB%BBinvariant-responsibility"&gt;16. 不変条件の責任（Invariant Responsibility）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E4%B8%80%E8%A6%A7"&gt;不変条件一覧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%AE%E8%B2%AC%E4%BB%BB"&gt;不変条件の責任&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E6%9B%BF%E6%97%A5%E3%81%AF131"&gt;振替日は1〜31&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%90%8C%E3%81%98%E5%8F%A3%E5%BA%A7--%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%81%AF1%E3%81%A4%E3%81%A0%E3%81%91"&gt;同じ口座 + サービスの振替関係は1つだけ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%81%AF%E5%BF%85%E3%81%9A%E5%8F%A3%E5%BA%A7%E3%82%92%E6%8C%81%E3%81%A4"&gt;振替関係は必ず口座を持つ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8C%AF%E6%9B%BF%E9%96%A2%E4%BF%82%E3%81%AF%E5%BF%85%E3%81%9A%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%8C%81%E3%81%A4"&gt;振替関係は必ずサービスを持つ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%AE%E9%85%8D%E7%BD%AE%E3%83%AB%E3%83%BC%E3%83%AB"&gt;不変条件の配置ルール&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="1-システム概要"&gt;1. システム概要&lt;/h1&gt;
&lt;h2 id="システムの目的"&gt;システムの目的&lt;/h2&gt;
&lt;p&gt;このシステムは何を解決するものか。&lt;/p&gt;</description></item><item><title>DDDにおける「集約」「ドメインサービス」「ユースケース」の違い</title><link>https://design.okuda-studio.com/posts/0015-aggregate-domain-service-usecase/</link><pubDate>Tue, 10 Mar 2026 16:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0015-aggregate-domain-service-usecase/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#ddd%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E9%9B%86%E7%B4%84%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%AE%E9%81%95%E3%81%84"&gt;DDDにおける「集約」「ドメインサービス」「ユースケース」の違い&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%9A%E7%B5%90%E8%AB%96"&gt;まず結論&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%9B%86%E7%B4%84aggregate"&gt;集約（Aggregate）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9"&gt;ドメインサービス&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9application-service"&gt;ユースケース（Application Service）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%82%92%E3%81%A9%E3%81%93%E3%81%AB%E7%BD%AE%E3%81%8F%E3%81%8B"&gt;ドメインロジックをどこに置くか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%8A%B6%E6%85%8B%E3%82%92%E6%8C%81%E3%81%A4%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B%E3%81%8B"&gt;状態を持つドメインサービスはどうなるか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B1%E3%83%BC%E3%82%B91%E6%96%B0%E3%81%97%E3%81%84%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E6%A6%82%E5%BF%B5%E3%81%8C%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%9F"&gt;ケース1：新しいドメイン概念が生まれた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%B1%E3%83%BC%E3%82%B92%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AA%E5%87%A6%E7%90%86%E7%8A%B6%E6%85%8B"&gt;ケース2：一時的な処理状態&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%B3%AA%E5%95%8F"&gt;判断のための質問&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E5%A4%B1%E6%95%97"&gt;よくある失敗&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dddにおける集約ドメインサービスユースケースの違い"&gt;DDDにおける「集約」「ドメインサービス」「ユースケース」の違い&lt;/h2&gt;
&lt;p&gt;DDD（ドメイン駆動設計）を学び始めると、多くの人が次の疑問にぶつかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;集約とドメインサービスは何が違うのか&lt;/li&gt;
&lt;li&gt;ユースケースはどこまで責任を持つのか&lt;/li&gt;
&lt;li&gt;ドメインロジックはどこに書くべきなのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この記事では、この3つの概念を整理しながら、&lt;strong&gt;ドメインロジックをどこに置くべきかの判断基準&lt;/strong&gt;を解説します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まず結論"&gt;まず結論&lt;/h2&gt;
&lt;p&gt;3つの役割は次のように整理できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;集約（Aggregate）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメインの状態を持つ&lt;/li&gt;
&lt;li&gt;不変条件を守る&lt;/li&gt;
&lt;li&gt;ドメインモデルの中心&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ドメインサービス（Domain Service）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンティティに属さないドメインロジック&lt;/li&gt;
&lt;li&gt;複数の集約にまたがる処理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;ユースケース（Use Case / Application Service）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザー操作を実現する手順&lt;/li&gt;
&lt;li&gt;ドメインモデルを組み合わせる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;依存関係は次のようになります。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;UI
↓
UseCase
↓
DomainService
↓
Aggregate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重要なルールは &lt;strong&gt;内側の層は外側を知らないこと&lt;/strong&gt; です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="集約aggregate"&gt;集約（Aggregate）&lt;/h2&gt;
&lt;p&gt;集約は &lt;strong&gt;状態と不変条件を守るドメインモデル&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;例として「口座振替」を考えます。&lt;/p&gt;
&lt;p&gt;振替関係には次のルールがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;振替日は 1〜31&lt;/li&gt;
&lt;li&gt;「振替元 + 振替先」が同じ振替関係は 1 つだけ (重複不可)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このルールを守る主体が &lt;code&gt;TransferRelation&lt;/code&gt; です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TransferRelation&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; accountId: AccountId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; serviceId: ServiceId,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; paymentDay: PaymentDay
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;changePaymentDay&lt;/span&gt;(newDay: PaymentDay) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; paymentDay = newDay
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stop&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 状態変更
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;【集約の特徴】&lt;/p&gt;</description></item><item><title>DDDでドメインを設計するときの流れ</title><link>https://design.okuda-studio.com/posts/0014-domain-design-flow/</link><pubDate>Tue, 10 Mar 2026 14:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0014-domain-design-flow/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#ddd%E3%81%A7%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B5%81%E3%82%8C"&gt;DDDでドメインを設計するときの流れ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%A8%AD%E8%A8%88%E3%81%AE%E5%85%A8%E4%BD%93%E3%81%AE%E6%B5%81%E3%82%8C"&gt;ドメイン設計の全体の流れ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E5%89%8D%E6%8F%90"&gt;この記事の前提&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#1-%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%99"&gt;1. ユースケースを書き出す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E7%94%A8%E8%AA%9E%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E3%83%A6%E3%83%93%E3%82%AD%E3%82%BF%E3%82%B9%E8%A8%80%E8%AA%9E"&gt;2. ドメイン用語を整理する（ユビキタス言語）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E5%80%99%E8%A3%9C%E3%82%92%E5%87%BA%E3%81%99"&gt;3. エンティティ候補を出す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%82%92%E6%9B%B8%E3%81%8F"&gt;4. 不変条件を書く&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-%E7%8A%B6%E6%85%8B%E9%81%B7%E7%A7%BB%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B"&gt;5. 状態遷移を整理する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-%E9%9B%86%E7%B4%84aggregate%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B"&gt;6. 集約（Aggregate）を決める&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#7-%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%81%AE%E8%B2%AC%E5%8B%99%E3%82%92%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B"&gt;7. エンティティの責務を設計する&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#setter%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%AA%E3%82%8B%E7%90%86%E7%94%B1"&gt;setterが問題になる理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%E6%93%8D%E4%BD%9C%E3%82%92%E8%A1%A8%E3%81%99"&gt;ドメインメソッドは「操作」を表す&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E9%87%8D%E8%A6%81%E3%81%AA%E8%80%83%E3%81%88%E6%96%B9"&gt;重要な考え方&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#8-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B"&gt;8. ドメインサービスを定義する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#9-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B"&gt;9. リポジトリを定義する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#10-%E6%9C%80%E5%BE%8C%E3%81%ABui%E3%82%92%E4%BD%9C%E3%82%8B"&gt;10. 最後にUIを作る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E6%B5%81%E3%82%8C%E3%81%A7%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88"&gt;この流れで設計する際のテンプレート&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dddでドメインを設計するときの流れ"&gt;DDDでドメインを設計するときの流れ&lt;/h2&gt;
&lt;p&gt;― 実践的な設計手順 ―&lt;/p&gt;
&lt;p&gt;ドメイン駆動設計（DDD）を学び始めると、多くの人が次の疑問を持ちます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ドメイン設計は何から始めればいいのか&lt;/li&gt;
&lt;li&gt;実際の開発ではどのような手順で設計するのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DDDの本では概念の説明が多く、「実際の設計手順」がはっきりしないことがあります。&lt;/p&gt;
&lt;p&gt;この記事では、実務で使える &lt;strong&gt;ドメイン設計の具体的な手順&lt;/strong&gt; を整理して紹介します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="ドメイン設計の全体の流れ"&gt;ドメイン設計の全体の流れ&lt;/h2&gt;
&lt;p&gt;DDDでドメインを設計する場合、次の順序で進めると整理しやすくなります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ユースケースを書き出す&lt;/li&gt;
&lt;li&gt;ドメイン用語を整理する（ユビキタス言語）&lt;/li&gt;
&lt;li&gt;エンティティ候補を出す&lt;/li&gt;
&lt;li&gt;不変条件を書く&lt;/li&gt;
&lt;li&gt;状態遷移を整理する&lt;/li&gt;
&lt;li&gt;集約（Aggregate）を決める&lt;/li&gt;
&lt;li&gt;エンティティの責務を設計する&lt;/li&gt;
&lt;li&gt;必要ならドメインサービスを作る&lt;/li&gt;
&lt;li&gt;リポジトリを定義する&lt;/li&gt;
&lt;li&gt;最後にUIを設計する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重要なのは &lt;strong&gt;UIから設計を始めないこと&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;DDDでは、基本的には、&lt;/p&gt;
&lt;p&gt;ユースケース → ドメイン → UI&lt;/p&gt;
&lt;p&gt;という順序で設計します。&lt;/p&gt;
&lt;p&gt;実際には、一度でバシッと決められるわけではないため、ドメインを設計しているときに、ユースケースに戻るなど、各プロセス間を何度も行ったり来たりします。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="この記事の前提"&gt;この記事の前提&lt;/h2&gt;
&lt;p&gt;この記事では、口座振替管理アプリの開発を想定して、設計の流れを説明してきます。&lt;/p&gt;
&lt;p&gt;振替元と振替先をユーザーが紐づけるメモアプリを想像してください。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-ユースケースを書き出す"&gt;1. ユースケースを書き出す&lt;/h2&gt;
&lt;p&gt;最初に、システムでユーザーが行う操作を書き出します。&lt;/p&gt;
&lt;p&gt;ポイントは &lt;strong&gt;UIではなく行動を書くこと&lt;/strong&gt; です。&lt;/p&gt;</description></item><item><title>リファクタリングには二種類ある</title><link>https://design.okuda-studio.com/posts/0013-refactoring-type/</link><pubDate>Wed, 04 Mar 2026 13:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0013-refactoring-type/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%AF%E4%BA%8C%E7%A8%AE%E9%A1%9E%E3%81%82%E3%82%8B--%E6%A7%8B%E9%80%A0%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A8%E6%A6%82%E5%BF%B5%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E3%82%82%E3%81%AE"&gt;リファクタリングには二種類ある ― 構造を変えるものと、概念を変えるもの&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%9A%E6%95%B4%E7%90%86%E6%A7%8B%E9%80%A0%E3%81%A8%E6%A6%82%E5%BF%B5%E3%81%AE%E9%81%95%E3%81%84"&gt;まず整理：構造と概念の違い&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%A7%8B%E9%80%A0%E3%81%AE%E5%A4%89%E6%9B%B4"&gt;構造の変更&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%A6%82%E5%BF%B5%E3%81%AE%E5%A4%89%E6%9B%B4"&gt;概念の変更&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E3%81%93%E3%81%AE%E5%8C%BA%E5%88%A5%E3%81%8C%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B"&gt;なぜこの区別が重要なのか？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E9%80%9A%E5%B8%B8%E3%81%AF%E6%A7%8B%E9%80%A0--%E6%A6%82%E5%BF%B5%E3%81%AA%E3%81%AE%E3%81%8B"&gt;なぜ通常は「構造 → 概念」なのか？&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#-%E5%A4%89%E6%9B%B4%E3%81%AE%E5%AE%89%E5%85%A8%E6%80%A7"&gt;① 変更の安全性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AE%E3%81%97%E3%82%84%E3%81%99%E3%81%95"&gt;② デバッグのしやすさ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E8%A4%87%E9%9B%91%E6%80%A7%E3%81%AE%E5%A2%97%E5%B9%85"&gt;③ 複雑性の増幅&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AE%9F%E5%8B%99%E3%81%A7%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E7%A7%81%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D"&gt;実務での使い分け（私の優先順位）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%AC%AC1%E6%AE%B5%E9%9A%8E%E5%8F%AF%E8%A6%96%E5%8C%96"&gt;第1段階：可視化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%AC%AC2%E6%AE%B5%E9%9A%8E%E6%A7%8B%E9%80%A0%E6%95%B4%E7%90%86"&gt;第2段階：構造整理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%AC%AC3%E6%AE%B5%E9%9A%8E%E8%B2%AC%E5%8B%99%E3%81%AE%E6%98%8E%E7%A2%BA%E5%8C%96"&gt;第3段階：責務の明確化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%AC%AC4%E6%AE%B5%E9%9A%8E%E6%A6%82%E5%BF%B5%E5%BC%B7%E5%8C%96"&gt;第4段階：概念強化&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="リファクタリングには二種類ある--構造を変えるものと概念を変えるもの"&gt;リファクタリングには二種類ある ― 構造を変えるものと、概念を変えるもの&lt;/h1&gt;
&lt;p&gt;私は最近の失敗から、大きな学びを得ました。&lt;/p&gt;
&lt;p&gt;それは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;リファクタリングには二種類ある&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ということです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;構造&lt;/strong&gt; を変えるリファクタリング&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概念&lt;/strong&gt; を変えるリファクタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この区別を意識していなかったことが、バグの原因でした。&lt;/p&gt;
&lt;p&gt;この記事では、自分なりに整理した実務的な優先順位と共にまとめます。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="まず整理構造と概念の違い"&gt;まず整理：構造と概念の違い&lt;/h1&gt;
&lt;h2 id="構造の変更"&gt;構造の変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;関数抽出&lt;/li&gt;
&lt;li&gt;共通化&lt;/li&gt;
&lt;li&gt;重複削除&lt;/li&gt;
&lt;li&gt;名前変更&lt;/li&gt;
&lt;li&gt;ネスト解消&lt;/li&gt;
&lt;li&gt;責務分離&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;振る舞いは変えない（意味は同じ）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これは「コードの形」を整える作業です。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="概念の変更"&gt;概念の変更&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Boolean → sealed class&lt;/li&gt;
&lt;li&gt;nullable → 非null設計&lt;/li&gt;
&lt;li&gt;エラー型明確化&lt;/li&gt;
&lt;li&gt;状態遷移の型化&lt;/li&gt;
&lt;li&gt;エンティティ再設計&lt;/li&gt;
&lt;li&gt;ドメインモデル再定義&lt;/li&gt;
&lt;li&gt;責務の再解釈&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;プログラムが表現する「意味」が変わる&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これは「コードが何を表現しているか」を変える作業です。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="なぜこの区別が重要なのか"&gt;なぜこの区別が重要なのか？&lt;/h1&gt;
&lt;p&gt;私は「成功」という概念を Boolean で扱っていました。&lt;/p&gt;
&lt;p&gt;しかし実際には：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作成成功&lt;/li&gt;
&lt;li&gt;更新成功&lt;/li&gt;
&lt;li&gt;失敗&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という複数の意味がありました。&lt;/p&gt;
&lt;p&gt;Boolean に押し込めたことで、
&lt;strong&gt;意味の差が見えなくなり、無意識に共通化してしまった&lt;/strong&gt; のです。&lt;/p&gt;</description></item><item><title>Boolean に潰された「状態」</title><link>https://design.okuda-studio.com/posts/0012-boolean-destroy-domain/</link><pubDate>Wed, 04 Mar 2026 12:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0012-boolean-destroy-domain/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#boolean-%E3%81%AB%E6%BD%B0%E3%81%95%E3%82%8C%E3%81%9F%E6%88%90%E5%8A%9F--%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E6%B0%97%E3%81%A5%E3%81%84%E3%81%9F%E6%8A%BD%E8%B1%A1%E5%8C%96%E3%81%AE%E7%BD%A0"&gt;Boolean に潰された「成功」 ― リファクタリングで気づいた抽象化の罠&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%85%83%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89"&gt;元のコード&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8"&gt;リファクタリングでやったこと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%9C%80%E5%88%9D%E3%81%AF%E3%81%86%E3%81%A3%E3%81%8B%E3%82%8A%E3%81%A0%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F"&gt;最初は「うっかり」だと思った&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%9C%AC%E5%BD%93%E3%81%AE%E5%8E%9F%E5%9B%A0"&gt;本当の原因&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%8A%BD%E8%B1%A1%E5%8C%96%E3%81%AE%E7%B2%92%E5%BA%A6%E3%81%8C%E7%B2%97%E3%81%99%E3%81%8E%E3%81%9F"&gt;抽象化の粒度が粗すぎた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%9E%8B%E3%81%A7%E5%AE%88%E3%82%8B%E8%A8%AD%E8%A8%88"&gt;型で守る設計&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%AD%A6%E3%81%B3"&gt;学び&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB"&gt;終わりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="boolean-に潰された成功--リファクタリングで気づいた抽象化の罠"&gt;Boolean に潰された「成功」 ― リファクタリングで気づいた抽象化の罠&lt;/h1&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;ViewModel の保存処理をリファクタリングしていたとき、
私は一度コードを壊しました。&lt;/p&gt;
&lt;p&gt;原因は単純な「うっかりミス」に見えました。&lt;/p&gt;
&lt;p&gt;しかし振り返ってみると、問題はもっと深いところにありました。&lt;/p&gt;
&lt;p&gt;それは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「成功」という概念を Boolean に潰してしまったこと&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;でした。&lt;/p&gt;
&lt;p&gt;この記事では、その過程と学びを書きます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="元のコード"&gt;元のコード&lt;/h2&gt;
&lt;p&gt;保存処理は、新規作成と更新で分岐していました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;saveData&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; viewModelScope.launch {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; isExistingItem: Boolean = (取得)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (destId &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 新規作成
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; resultSuccess = directDebitDefRepo.createDestination(&lt;span style="color:#f92672"&gt;..&lt;/span&gt;.)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (resultSuccess) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// フォームの初期化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _formInputState.update { FormInputState() }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; showSuccess()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; showFailure()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 更新
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; resultSuccess = directDebitDefRepo.updateDestination(&lt;span style="color:#f92672"&gt;..&lt;/span&gt;.)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (resultSuccess) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; showSuccess()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; showFailure()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポイントはここです。&lt;/p&gt;</description></item><item><title>Aggregate Root とは</title><link>https://design.okuda-studio.com/posts/0011-what-is-aggregate-root/</link><pubDate>Thu, 12 Feb 2026 10:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0011-what-is-aggregate-root/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#aggregate-root-%E3%81%A8%E3%81%AF"&gt;Aggregate Root とは&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#aggregate%E9%9B%86%E7%B4%84%E3%81%A8%E3%81%AF"&gt;Aggregate（集約）とは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#aggregate-root%E9%9B%86%E7%B4%84%E3%83%AB%E3%83%BC%E3%83%88%E3%81%A8%E3%81%AF"&gt;Aggregate Root（集約ルート）とは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%85%B7%E4%BD%93%E4%BE%8B%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8"&gt;具体例（イメージ）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E6%B3%A8%E6%96%87%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E4%BE%8B"&gt;注文ドメインの例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C-aggregate-root-%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%8B"&gt;なぜ Aggregate Root が必要なのか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#-%E6%95%B4%E5%90%88%E6%80%A7%E3%82%92%E5%AE%88%E3%82%8B%E3%81%9F%E3%82%81"&gt;① 整合性を守るため&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%A2%83%E7%95%8C%E3%82%92%E6%98%8E%E7%A2%BA%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81"&gt;② トランザクション境界を明確にするため&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%82%92%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81"&gt;③ 依存関係をシンプルにするため&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%A8%AD%E8%A8%88%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9"&gt;設計時の注意点&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#-aggregate-%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%97%E3%81%99%E3%81%8E%E3%81%AA%E3%81%84"&gt;① Aggregate を大きくしすぎない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-%E4%BB%96-aggregate-%E3%82%92%E7%9B%B4%E6%8E%A5%E5%8F%82%E7%85%A7%E3%81%97%E3%81%AA%E3%81%84"&gt;② 他 Aggregate を直接参照しない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#-repository-%E3%81%AF-aggregate-root-%E5%8D%98%E4%BD%8D"&gt;③ Repository は Aggregate Root 単位&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%AA%A4%E8%A7%A3"&gt;よくある誤解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="aggregate-root-とは"&gt;Aggregate Root とは&lt;/h1&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;DDD（Domain-Driven Design）の文脈で頻繁に登場する &lt;strong&gt;Aggregate Root（集約ルート）&lt;/strong&gt; について解説していきます。&lt;/p&gt;
&lt;p&gt;本記事では、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Aggregate / Aggregate Root とは何か&lt;/li&gt;
&lt;li&gt;なぜこの概念が必要なのか&lt;/li&gt;
&lt;li&gt;設計時の注意点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を整理します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="aggregate集約とは"&gt;Aggregate（集約）とは&lt;/h2&gt;
&lt;p&gt;Aggregate とは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;関連する複数の Entity / Value Object を&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一つのまとまり（整合性の境界）&lt;/strong&gt; として扱う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DDD の設計単位です。&lt;/p&gt;
&lt;p&gt;重要なのは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aggregate は「常に一貫した状態を保つべき単位」&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という点です。&lt;/p&gt;</description></item><item><title>SQL の条件を固定しない</title><link>https://design.okuda-studio.com/posts/0010-do-not-fix-sql-conditions/</link><pubDate>Wed, 11 Feb 2026 17:30:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0010-do-not-fix-sql-conditions/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#sql-%E3%81%AE%E6%9D%A1%E4%BB%B6%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%AA%E3%81%84"&gt;SQL の条件を固定しない&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%94%B9%E5%96%84%E5%89%8D%E3%81%AE%E5%AE%9F%E8%A3%85"&gt;改善前の実装&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#dao-%E3%81%AB%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%8C%E5%85%A5%E3%82%8A%E8%BE%BC%E3%82%93%E3%81%A7%E3%81%84%E3%81%9F"&gt;DAO にドメインの意味が入り込んでいた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%95%8F%E9%A1%8C%E6%84%8F%E8%AD%98"&gt;問題意識&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%94%B9%E5%96%84%E6%96%B9%E9%87%9D"&gt;改善方針&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%94%B9%E5%96%84%E5%BE%8C%E3%81%AE%E5%AE%9F%E8%A3%85"&gt;改善後の実装&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#dao%E6%A4%9C%E7%B4%A2%E8%BB%B8%E3%81%A0%E3%81%91%E3%82%92%E7%9F%A5%E3%82%8B"&gt;DAO：検索軸だけを知る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#repository--usecase%E6%84%8F%E5%91%B3%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B"&gt;Repository / UseCase：意味を与える&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%93%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%A7%E5%BE%97%E3%82%89%E3%82%8C%E3%81%9F%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88"&gt;この設計で得られたメリット&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-sql--dao-%E3%81%AE%E6%95%B0%E3%81%8C%E5%A2%97%E3%81%88%E3%81%AB%E3%81%8F%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F"&gt;1. SQL / DAO の数が増えにくくなった&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-dao-%E3%81%AE%E8%B2%AC%E5%8B%99%E3%81%8C%E6%98%8E%E7%A2%BA%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F"&gt;2. DAO の責務が明確になった&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E5%A4%89%E6%9B%B4%E3%81%AB%E5%BC%B7%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F"&gt;3. ドメインの変更に強くなった&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB"&gt;おわりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="sql-の条件を固定しない"&gt;SQL の条件を固定しない&lt;/h1&gt;
&lt;p&gt;DAO の責務を整理して、ドメインに意味を寄せる設計改善&lt;/p&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;Android アプリ開発において、
「とりあえず動く」状態から一段上の設計に進もうとすると、
&lt;strong&gt;ViewModel・UseCase・Repository・DAO の責務の境界&lt;/strong&gt;で悩むことが多い。&lt;/p&gt;
&lt;p&gt;今回は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL で条件を固定していた実装を見直し&lt;/li&gt;
&lt;li&gt;条件をパラメータ化して SQL の数を減らし&lt;/li&gt;
&lt;li&gt;その「意味」を Domain / UseCase 側で与える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という設計改善を行ったので、その考え方をまとめる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="改善前の実装"&gt;改善前の実装&lt;/h2&gt;
&lt;h3 id="dao-にドメインの意味が入り込んでいた"&gt;DAO にドメインの意味が入り込んでいた&lt;/h3&gt;
&lt;p&gt;もともと DAO には、次のような Query が定義されていた。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Query&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;SELECT * FROM transfer_item WHERE isSourceItem = 1&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;observeSources&lt;/span&gt;(): Flow&amp;lt;List&amp;lt;TransferItemEntity&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この実装はシンプルで分かりやすいが、次の問題を抱えていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DAO が「Source（振替元）」という&lt;strong&gt;ドメインの意味&lt;/strong&gt;を知っている&lt;/li&gt;
&lt;li&gt;条件が増えるたびに SQL / DAO メソッドが増える&lt;/li&gt;
&lt;li&gt;将来的に Query が爆発する兆候がある&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="問題意識"&gt;問題意識&lt;/h2&gt;
&lt;p&gt;ここで違和感を覚えたのは、次の点だった。&lt;/p&gt;</description></item><item><title>「サービスクラス」とは何か？</title><link>https://design.okuda-studio.com/posts/0009-what-is-service-class/</link><pubDate>Wed, 11 Feb 2026 11:50:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0009-what-is-service-class/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;「サービスクラス」とは何か？&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A8%E3%81%84%E3%81%86%E8%A8%80%E8%91%89%E3%81%AE%E8%AA%9E%E6%BA%90%E3%81%A8%E5%9F%BA%E6%9C%AC%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%B3%E3%82%B9"&gt;「サービス」という言葉の語源と基本ニュアンス&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#web--%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%81%A7%E3%81%AE-service-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E8%B5%B7%E6%BA%90"&gt;Web / サーバーサイドでの Service クラスの起源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%8C%E5%95%8F%E9%A1%8C%E8%A6%96%E3%81%95%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B"&gt;なぜ「サービスクラス」が問題視されるようになったのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ddd-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bservice%E3%81%A8%E3%81%AE%E5%88%86%E5%B2%90"&gt;DDD における「Service」との分岐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase-%E3%81%AF%E4%BD%95%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%82%A2%E3%83%B3%E3%83%81%E3%83%86%E3%83%BC%E3%82%BC%E3%81%AA%E3%81%AE%E3%81%8B"&gt;UseCase は何に対するアンチテーゼなのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#web-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E8%A8%80%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E6%84%8F%E5%91%B3"&gt;Web エンジニアが「サービスクラス」と言うときの意味&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-%E4%B8%AD%E7%AB%8B%E7%9A%84%E3%81%AA%E6%84%8F%E5%91%B3"&gt;1. 中立的な意味&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-%E5%90%A6%E5%AE%9A%E7%9A%84%E3%81%AA%E6%84%8F%E5%91%B3%E8%A8%AD%E8%A8%88%E8%AD%B0%E8%AB%96"&gt;2. 否定的な意味（設計議論）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="サービスクラスとは何か"&gt;「サービスクラス」とは何か？&lt;/h1&gt;
&lt;p&gt;──語源・ニュアンス・UseCaseとの違いを整理する&lt;/p&gt;
&lt;p&gt;設計の議論をしていると、「それ、サービスクラスじゃない？」という言葉が出てくることがある。
一方で、Web エンジニアの中には「Service クラス」は普通に使う用語だ、という人も多い。&lt;/p&gt;
&lt;p&gt;この「サービスクラス」という言葉は、&lt;strong&gt;厳密な定義がなく、文脈によって意味が変わる&lt;/strong&gt;ため、混乱を生みやすい。
この記事では、語源と歴史をたどりながら、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;なぜ「サービス」と呼ばれるのか&lt;/li&gt;
&lt;li&gt;Web ではどのように使われてきたのか&lt;/li&gt;
&lt;li&gt;なぜ設計議論では否定的に使われることがあるのか&lt;/li&gt;
&lt;li&gt;UseCase と何が違うのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を整理する。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="サービスという言葉の語源と基本ニュアンス"&gt;「サービス」という言葉の語源と基本ニュアンス&lt;/h2&gt;
&lt;p&gt;英語の &lt;em&gt;service&lt;/em&gt; は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;奉仕&lt;/li&gt;
&lt;li&gt;提供&lt;/li&gt;
&lt;li&gt;役務&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった意味を持つ。&lt;/p&gt;
&lt;p&gt;ソフトウェア設計においては、そこから転じて、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;「他のオブジェクトのために処理を提供するもの」&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という、かなり広い意味で使われるようになった。&lt;/p&gt;
&lt;p&gt;この時点では、「サービス」はあくまで
&lt;strong&gt;役割を説明するための便利な言葉&lt;/strong&gt;であり、設計上の厳密な概念ではない。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="web--サーバーサイドでの-service-クラスの起源"&gt;Web / サーバーサイドでの Service クラスの起源&lt;/h2&gt;
&lt;p&gt;「サービスクラス」という言葉が広く使われるようになったのは、
Java EE や Spring に代表される &lt;strong&gt;レイヤードアーキテクチャ&lt;/strong&gt;の文脈である。&lt;/p&gt;
&lt;p&gt;典型的な構成は以下のようなものだ。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Controller
↓
Service
↓
Repository (DAO)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここでの Service クラスは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Controller から呼ばれる&lt;/li&gt;
&lt;li&gt;複数の Repository を組み合わせる&lt;/li&gt;
&lt;li&gt;トランザクション境界になる&lt;/li&gt;
&lt;li&gt;業務ロジックを書く場所&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という役割を担っていた。&lt;/p&gt;</description></item><item><title>ViewModel が肥大化する理由</title><link>https://design.okuda-studio.com/posts/0008-cause-of-fat-viewmodels/</link><pubDate>Mon, 09 Feb 2026 11:35:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0008-cause-of-fat-viewmodels/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#viewmodel-%E3%81%8C%E8%82%A5%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1"&gt;ViewModel が肥大化する理由&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%AA%A4%E8%A7%A3viewmodel-%E3%81%AF%E4%B8%AD%E7%B6%99%E5%BD%B9%E3%81%A0%E3%81%8B%E3%82%89%E9%87%8D%E3%81%8F%E3%81%AA%E3%82%8B"&gt;よくある誤解：ViewModel は「中継役」だから重くなる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#viewmodel-%E3%81%8C%E8%82%A5%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B%E6%9C%AC%E5%BD%93%E3%81%AE%E7%90%86%E7%94%B1"&gt;ViewModel が肥大化する本当の理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ui-%E3%81%AE%E5%88%A4%E6%96%AD%E3%81%A8%E6%A5%AD%E5%8B%99%E3%81%AE%E5%88%A4%E6%96%AD%E3%81%AF%E5%88%A5%E7%89%A9"&gt;「UI の判断」と「業務の判断」は別物&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase-%E3%81%8C%E7%99%BB%E5%A0%B4%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1"&gt;UseCase が登場する理由&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#viewmodel-%E3%81%A8-usecase-%E3%81%AE%E5%A2%83%E7%95%8C%E7%B7%9A"&gt;ViewModel と UseCase の境界線&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#viewmodel-%E3%81%8B%E3%82%89%E5%87%A6%E7%90%86%E3%81%8C%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E6%B6%88%E3%81%88%E3%81%9D%E3%81%86%E5%95%8F%E9%A1%8C"&gt;「ViewModel から処理がほとんど消えそう」問題&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="viewmodel-が肥大化する理由"&gt;ViewModel が肥大化する理由&lt;/h1&gt;
&lt;p&gt;Android アプリを作っていると、ある日ふと気づきます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ViewModel、でかくなりすぎじゃない？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;State の定義、Flow の合成、エラーハンドリング、変換ロジック、画面固有の分岐……。
気づけば 1 ファイルに数百行。しかも「どこを直すと何が壊れるのか分からない」状態。&lt;/p&gt;
&lt;p&gt;この記事では、&lt;strong&gt;なぜ ViewModel は肥大化しやすいのか&lt;/strong&gt;、そして &lt;strong&gt;それを防ぐための本質的な境界の引き方&lt;/strong&gt; について整理します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="よくある誤解viewmodel-は中継役だから重くなる"&gt;よくある誤解：ViewModel は「中継役」だから重くなる&lt;/h2&gt;
&lt;p&gt;よく言われる説明に、こんなものがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ViewModel は UI と Domain の橋渡しだから&lt;/li&gt;
&lt;li&gt;Flow や State を扱うから&lt;/li&gt;
&lt;li&gt;非同期処理が集まりやすいから&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どれも一理ありますが、&lt;strong&gt;本当の理由ではありません&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Flow があるから肥大化するのではなく、
ViewModel が &lt;em&gt;本来持つべきでない判断&lt;/em&gt; を持ち始めたときに肥大化します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="viewmodel-が肥大化する本当の理由"&gt;ViewModel が肥大化する本当の理由&lt;/h2&gt;
&lt;p&gt;結論から言うと理由はシンプルです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「何をするか」を ViewModel が決め始めるから&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本来の ViewModel の役割は、次の 2 つです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UI からのイベントを受け取る&lt;/li&gt;
&lt;li&gt;UI が描画しやすい State に変換して公開する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ところが実際には、次のような責務が入り込みがちです。&lt;/p&gt;</description></item><item><title>Domain と UseCase の違いを整理してみる</title><link>https://design.okuda-studio.com/posts/0007-domain-vs-usecase/</link><pubDate>Mon, 09 Feb 2026 11:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0007-domain-vs-usecase/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#domain-%E3%81%A8-usecase-%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B"&gt;Domain と UseCase の違いを整理してみる&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%B8%80%E8%A8%80%E3%81%A7%E8%A8%80%E3%81%86%E3%81%A8%E4%BD%95%E3%81%8C%E9%81%95%E3%81%86%E3%81%AE%E3%81%8B"&gt;一言で言うと何が違うのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#domain-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;Domain とは何か&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#domain-%E3%81%AF%E6%84%8F%E5%91%B3%E3%81%A8%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE%E9%9B%86%E5%90%88%E4%BD%93"&gt;Domain は「意味」と「ルール」の集合体&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#domain-%E3%81%AE%E4%BE%8B"&gt;Domain の例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#domain-%E3%81%8C%E3%82%84%E3%82%89%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8"&gt;Domain がやらないこと&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;UseCase とは何か&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#usecase-%E3%81%AF%E5%8B%95%E8%A9%9E%E3%81%AE%E5%B1%A4"&gt;UseCase は「動詞の層」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase-%E3%81%AE%E4%BE%8B"&gt;UseCase の例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#domain-%E3%81%A8-usecase-%E3%81%AE%E9%96%A2%E4%BF%82"&gt;Domain と UseCase の関係&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C-usecase-%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8A%E3%81%AB%E3%81%8F%E3%81%84%E3%81%AE%E3%81%8B"&gt;なぜ UseCase が分かりにくいのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase-%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%B9%E3%81%8D%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0"&gt;UseCase を作るべきタイミング&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#entity--domain-%E5%A4%89%E6%8F%9B%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E3%82%84%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%8B"&gt;Entity → Domain 変換はどこでやるべきか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#domain-%E3%81%A8-usecase-%E3%82%92%E5%88%86%E3%81%91%E3%82%8B%E6%9C%80%E5%A4%A7%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88"&gt;Domain と UseCase を分ける最大のポイント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3"&gt;よくあるアンチパターン&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB"&gt;おわりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="domain-と-usecase-の違いを整理してみる"&gt;Domain と UseCase の違いを整理してみる&lt;/h1&gt;
&lt;p&gt;Clean Architecture や DDD を学んでいると、ほぼ確実に次の疑問にぶつかります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Domain と UseCase の違いがよく分からない&lt;/li&gt;
&lt;li&gt;どこまでが Domain で、どこからが UseCase なのか曖昧&lt;/li&gt;
&lt;li&gt;UseCase を作ろうとすると、何を書けばいいのか分からない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私自身、このあたりで何度も立ち止まりました。
この記事では、実装経験を通して整理できた &lt;strong&gt;Domain と UseCase の違い&lt;/strong&gt; を、自分なりの言葉でまとめてみます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一言で言うと何が違うのか"&gt;一言で言うと何が違うのか&lt;/h2&gt;
&lt;p&gt;まず、かなり大胆に要約します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt;
→「この世界では、何が正しく、何が成り立つか」を表す&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UseCase&lt;/strong&gt;
→「その正しさを、どういう手順・文脈で使うか」を表す&lt;/p&gt;</description></item><item><title>Domain レイヤーかどうかを判断する基準</title><link>https://design.okuda-studio.com/posts/0006-domain-layer-or-not/</link><pubDate>Sun, 08 Feb 2026 17:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0006-domain-layer-or-not/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#domain-%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E5%88%A4%E6%96%AD%E3%81%99%E3%82%8B%E5%9F%BA%E6%BA%96"&gt;Domain レイヤーかどうかを判断する基準&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#domain-%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B%E7%B0%A1%E5%8D%98%E3%81%AB"&gt;Domain レイヤーとは何か（簡単に）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%88%A4%E6%96%AD%E5%9F%BA%E6%BA%96%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E3%81%9D%E3%82%8C%E3%82%92%E6%84%8F%E8%AD%98%E3%81%99%E3%82%8B%E3%81%8B"&gt;判断基準：ユーザーがそれを意識するか？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B1%E4%BF%9D%E5%AD%98%E5%87%A6%E7%90%86%E3%81%AF-domain-%E3%81%8B"&gt;例1：保存処理は Domain か？&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%B1%E3%83%BC%E3%82%B9a%E4%BF%9D%E5%AD%98%E5%85%88%E3%82%92%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E6%84%8F%E8%AD%98%E3%81%97%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88"&gt;ケースA：保存先をユーザーが意識しない場合&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%82%B1%E3%83%BC%E3%82%B9b%E4%BF%9D%E5%AD%98%E5%85%88%E3%82%92%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E6%84%8F%E8%AD%98%E7%9A%84%E3%81%AB%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88"&gt;ケースB：保存先をユーザーが意識的に選択する場合&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E6%84%8F%E8%AD%98%E3%81%99%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E5%9F%BA%E6%BA%96%E3%81%AE%E4%BD%BF%E3%81%84%E3%81%A9%E3%81%93%E3%82%8D"&gt;「ユーザーが意識する」という基準の使いどころ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecase-%E3%81%A8%E3%81%AE%E9%96%A2%E4%BF%82"&gt;UseCase との関係&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%B3%A8%E6%84%8F%E7%82%B9%E3%81%99%E3%81%B9%E3%81%A6%E3%82%92-domain-%E3%81%AB%E5%85%A5%E3%82%8C%E3%81%AA%E3%81%84"&gt;注意点：すべてを Domain に入れない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E8%BF%B7%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E6%9C%80%E7%B5%82%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF"&gt;迷ったときの最終チェック&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB"&gt;おわりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="domain-レイヤーかどうかを判断する基準"&gt;Domain レイヤーかどうかを判断する基準&lt;/h1&gt;
&lt;p&gt;―「ユーザーが意識するか？」という視点―&lt;/p&gt;
&lt;p&gt;設計をしていると、次のような悩みにぶつかることがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この処理は Domain レイヤーに置くべきか？&lt;/li&gt;
&lt;li&gt;UseCase なのか、それとも Data レイヤーの責務なのか？&lt;/li&gt;
&lt;li&gt;そもそも Domain って何を置く場所なのか？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;とくに Clean Architecture や DDD を学び始めた頃は、
「正解の置き場所」を探そうとして、かえって混乱しがちです。&lt;/p&gt;
&lt;p&gt;この記事では、私が設計を考える際に &lt;strong&gt;ひとつの判断基準&lt;/strong&gt; として使っている考え方を紹介します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="domain-レイヤーとは何か簡単に"&gt;Domain レイヤーとは何か（簡単に）&lt;/h2&gt;
&lt;p&gt;Domain レイヤーは、ざっくり言うと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アプリが扱う &lt;strong&gt;概念&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;その概念に関する &lt;strong&gt;ルール&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;「それは正しいかどうか」の判断&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を表す層です。&lt;/p&gt;
&lt;p&gt;技術的な詳細（DB、API、ライブラリなど）からは距離を置き、
&lt;strong&gt;アプリの意味そのもの&lt;/strong&gt; を表現する場所だと考えています。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="判断基準ユーザーがそれを意識するか"&gt;判断基準：ユーザーがそれを意識するか？&lt;/h2&gt;
&lt;p&gt;私が Domain レイヤーかどうかを判断する際に使っている基準は、次の問いです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;「ユーザーは、その機能や概念を意識してアプリを操作するか？」&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この問いに &lt;strong&gt;YES&lt;/strong&gt; なら、
その概念や処理は Domain レイヤー（または UseCase）に属する可能性が高いです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NO&lt;/strong&gt; なら、
それは Data レイヤーや Infrastructure に閉じ込めるべきものだと考えます。&lt;/p&gt;</description></item><item><title>なぜクリーンアーキテクチャはドメインを守るのか</title><link>https://design.okuda-studio.com/posts/0002-why-clean-architecture-guard-domain/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0002-why-clean-architecture-guard-domain/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AF%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E5%AE%88%E3%82%8B%E3%81%AE%E3%81%8B"&gt;なぜクリーンアーキテクチャはドメインを守るのか&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"&gt;はじめに&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B"&gt;不変条件とは何か&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%8B"&gt;例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A7%E3%81%82%E3%82%8B"&gt;不変条件は「判断」そのものである&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%81%8C%E6%9B%96%E6%98%A7%E3%81%A0%E3%81%A8%E8%A8%AD%E8%A8%88%E3%81%AF%E5%A3%8A%E3%82%8C%E3%82%8B"&gt;不変条件が曖昧だと、設計は壊れる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%82%92%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AB%E9%96%89%E3%81%98%E8%BE%BC%E3%82%81%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E5%88%A4%E6%96%AD"&gt;不変条件をドメインに閉じ込める、という判断&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%81%AA%E3%81%9C%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AA%E3%81%AE%E3%81%8B"&gt;なぜドメインなのか&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E5%AE%88%E3%82%8B%E3%81%A8%E3%81%AF%E4%BD%95%E3%82%92%E5%AE%88%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B"&gt;「ドメインを守る」とは、何を守っているのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ui-%E3%82%84%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AB%E4%B8%8D%E5%A4%89%E6%9D%A1%E4%BB%B6%E3%82%92%E7%BD%AE%E3%81%8F%E3%81%A8%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%8D%E3%82%8B%E3%81%8B"&gt;UI やインフラに不変条件を置くと何が起きるか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%BE%E3%81%A8%E3%82%81"&gt;まとめ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E9%96%A2%E9%80%A3%E6%9B%B8%E7%B1%8D%E7%84%A1%E6%96%99"&gt;おすすめの関連書籍（無料）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="なぜクリーンアーキテクチャはドメインを守るのか"&gt;なぜクリーンアーキテクチャはドメインを守るのか&lt;/h1&gt;
&lt;p&gt;クリーンアーキテクチャはドメインを守っているが、その本質は「判断」を守ることである&lt;/p&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;「クリーンアーキテクチャでは、ドメインを守ることが重要だ」&lt;/p&gt;
&lt;p&gt;この説明を、これまで何度も目にしてきましたし、自分でも何となく理解しているつもりでした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UI から独立させるため&lt;/li&gt;
&lt;li&gt;フレームワークに依存させないため&lt;/li&gt;
&lt;li&gt;テストしやすくするため&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どれも間違ってはいません。&lt;/p&gt;
&lt;p&gt;ただ、実務で設計に向き合えば向き合うほど、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;それで結局、何が一番大事なのか？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という疑問が残りました。&lt;/p&gt;
&lt;p&gt;最近、その答えが少しはっきりしてきました。&lt;/p&gt;
&lt;p&gt;クリーンアーキテクチャの本質は、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「判断をどこに閉じ込めるか？」を決める構造である&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;という考え方です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;どの判断は UI に任せてよいのか&lt;/li&gt;
&lt;li&gt;どの判断はユースケースで行うべきか&lt;/li&gt;
&lt;li&gt;どの判断は、絶対に外に漏らしてはいけないのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この「判断の置き場所」を曖昧にしたまま設計すると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;責務が混ざり&lt;/li&gt;
&lt;li&gt;修正のたびに迷いが生まれ&lt;/li&gt;
&lt;li&gt;変更に弱い構造&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;になっていきます。&lt;/p&gt;
&lt;p&gt;では、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;絶対に外に出してはいけない判断とは何なのか？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;その答えを整理するための言葉が、&lt;strong&gt;不変条件&lt;/strong&gt; でした。&lt;/p&gt;
&lt;p&gt;（不変条件という言葉は、英語では invariant という言葉でよく使用されます）&lt;/p&gt;
&lt;p&gt;この記事では、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クリーンアーキテクチャを「判断の置き場所」という視点で捉え直し&lt;/li&gt;
&lt;li&gt;その中で不変条件がどんな役割を持つのか&lt;/li&gt;
&lt;li&gt;なぜ不変条件をドメインに閉じ込めるのか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を、実務の感覚に近い形で説明します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="不変条件とは何か"&gt;不変条件とは何か&lt;/h2&gt;
&lt;p&gt;不変条件とは、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;どれだけ仕様や実装が変わっても、絶対に破ってはいけない前提&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;UI が変わっても
API が変わっても
DB が変わっても&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;これが壊れたら、そのシステムは成立しない&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;そういう条件を指します。&lt;/p&gt;
&lt;h3 id="例"&gt;例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ログインしていないユーザーは、保護された操作をできない&lt;/li&gt;
&lt;li&gt;残高は常に 0 以上である&lt;/li&gt;
&lt;li&gt;同じ支払いは二重に確定しない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらは&lt;/p&gt;</description></item><item><title>クリーンアーキテクチャの本質をわかりやすく解説</title><link>https://design.okuda-studio.com/posts/0001-clean-architecture-core/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0001-clean-architecture-core/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A8%E3%81%AF"&gt;アーキテクチャとは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%81%A8%E3%81%AF"&gt;依存関係とは&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E7%89%A9%E7%90%86%E7%9A%84%E3%81%AA%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82"&gt;物理的な依存関係&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%84%8F%E5%91%B3%E7%9A%84%E3%81%AA%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82"&gt;意味的な依存関係&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%AF"&gt;ドメインとは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E4%BB%A5%E5%A4%96"&gt;ドメイン以外&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%90%8C%E5%BF%83%E5%86%86%E7%8A%B6%E3%81%AE%E5%9B%B3%E3%81%AE%E6%84%8F%E5%91%B3"&gt;同心円状の図の意味&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E6%84%8F%E5%91%B3%E7%9A%84%E3%81%AA%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%81%A8%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3"&gt;意味的な依存関係とクリーンアーキテクチャ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E5%85%B7%E4%BD%93%E4%BE%8B"&gt;具体例&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%81%AE%E9%80%86%E8%BB%A2%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%B1%E3%83%BC%E3%82%B9"&gt;依存関係の逆転が必要なケース&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E4%BE%9D%E5%AD%98%E9%96%A2%E4%BF%82%E3%82%92%E9%80%86%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E6%96%B9%E6%B3%95"&gt;依存関係を逆転させる具体的な方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E8%A8%98%E4%BA%8B"&gt;おすすめの記事&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%9C%AC%E7%84%A1%E6%96%99"&gt;おすすめの本（無料）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;クリーンアーキテクチャという言葉はよく聞くけれど、「わかったようでわからない」という人が多いのではないでしょうか？&lt;/p&gt;
&lt;p&gt;クリーンアーキテクチャを解説した記事は、探せばすぐに出てきますが、あまり本質について語られている記事は少ないように感じます。&lt;/p&gt;
&lt;p&gt;そこで、この記事でそれを簡潔に語っていこうと思います。&lt;/p&gt;
&lt;h1 id="アーキテクチャとは"&gt;アーキテクチャとは&lt;/h1&gt;
&lt;p&gt;まず、そもそも「アーキテクチャ」とは何でしょうか？簡潔に説明したいので、どんどん答えを書いていきます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目的
&lt;ul&gt;
&lt;li&gt;壊れにくいソフトウェアを作る&lt;/li&gt;
&lt;li&gt;チーム内で統一した方針でソフトウェアを作る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;実現方法
&lt;ul&gt;
&lt;li&gt;部品 (※1) 同士の依存関係 (※2) を整える&lt;/li&gt;
&lt;li&gt;部品が果たす役割・責務を明確にする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(※1) 「部品って具体的に何？」と思われた方は、一旦、クラスだと思っていただければ大丈夫です。
(※2) 後述します。&lt;/p&gt;
&lt;p&gt;めちゃくちゃシンプルに書くとこうなると思います。&lt;/p&gt;
&lt;h1 id="依存関係とは"&gt;依存関係とは&lt;/h1&gt;
&lt;p&gt;クリーンアーキテクチャの本質を知るためには、このセクションがめちゃくちゃ大事です！！
「そんなの知ってるわ」という方も、クリーンアーキテクチャについての理解が「モヤッ」としている方は読んでください。&lt;/p&gt;
&lt;p&gt;依存関係には、二種類の依存関係があります。&lt;/p&gt;
&lt;h2 id="物理的な依存関係"&gt;物理的な依存関係&lt;/h2&gt;
&lt;p&gt;まずは、物理的な依存関係について説明します。これは、多くの人が最初に思い浮かぶ依存関係の方だと思われます。&lt;/p&gt;
&lt;p&gt;すなわち、「どの部品 (クラスなど) がどの部品のことを知っているか」という関係性のことです。&lt;/p&gt;
&lt;p&gt;(このドキュメントのサンプルコードは Kotlin で記述させていただきます。ご了承ください。)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; b: B
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;B&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のサンプルでは、クラス A がクラス B を知っているので、これを「 A が B に依存している」と言います。&lt;/p&gt;
&lt;p&gt;これが、物理的な依存関係です。 (超ざっくり)&lt;/p&gt;
&lt;h2 id="意味的な依存関係"&gt;意味的な依存関係&lt;/h2&gt;
&lt;p&gt;次に、意味的な依存関係について説明します。ここで、クリーンアーキテクチャの記事でよく出てくる同心円状の図を見て下さい。 (探せばすぐに出てくるのでここには載せません。笑)&lt;/p&gt;</description></item></channel></rss>