<?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>UI on 設計で、迷わなくなるために | 奥田智紘</title><link>https://design.okuda-studio.com/tags/ui/</link><description>Recent content in UI on 設計で、迷わなくなるために | 奥田智紘</description><generator>Hugo -- 0.159.2</generator><language>ja</language><lastBuildDate>Sun, 22 Mar 2026 18:00:00 +0900</lastBuildDate><atom:link href="https://design.okuda-studio.com/tags/ui/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>