<?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>Naming on 設計で、迷わなくなるために | 奥田智紘</title><link>https://design.okuda-studio.com/tags/naming/</link><description>Recent content in Naming on 設計で、迷わなくなるために | 奥田智紘</description><generator>Hugo -- 0.162.1</generator><language>ja</language><lastBuildDate>Tue, 02 Jun 2026 19:00:00 +0900</lastBuildDate><atom:link href="https://design.okuda-studio.com/tags/naming/index.xml" rel="self" type="application/rss+xml"/><item><title>「起きたこと」で名前を付けるか、「意図」で名前を付けるか</title><link>https://design.okuda-studio.com/posts/0025-naming-idea/</link><pubDate>Tue, 02 Jun 2026 19:00:00 +0900</pubDate><guid>https://design.okuda-studio.com/posts/0025-naming-idea/</guid><description>&lt;h1 id="起きたことで名前を付けるか意図で名前を付けるか"&gt;「起きたこと」で名前を付けるか、「意図」で名前を付けるか&lt;/h1&gt;
&lt;p&gt;アプリ開発をしていると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OnClickPayment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OnClickDelete&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OpenPaymentEdit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ShowDeleteDialog&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のように、イベントや関数の名前をどう付けるべきか迷うことがあります。&lt;/p&gt;
&lt;p&gt;特に ViewModel を使った設計では、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「起きたこと」を名前にするべきか
「やりたいこと（意図）」を名前にするべきか&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;で悩むことがよくあります。&lt;/p&gt;
&lt;h2 id="結論"&gt;結論&lt;/h2&gt;
&lt;p&gt;私は次のように考えています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UI → ViewModel は「起きたこと」&lt;/li&gt;
&lt;li&gt;ViewModel → UI は「意図」&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;h2 id="ui--viewmodel-は起きたこと"&gt;UI → ViewModel は「起きたこと」&lt;/h2&gt;
&lt;p&gt;例えば Compose の画面から ViewModel にイベントを伝える場合です。&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;viewModel.onClickPayment()
&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;viewModel.onClickDelete()
&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;viewModel.onTextChanged(text)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで ViewModel に伝えたいのは、&lt;/p&gt;
&lt;p&gt;「ユーザーが何をしたか」&lt;/p&gt;
&lt;p&gt;です。&lt;/p&gt;
&lt;p&gt;まだ ViewModel は、その結果として何を行うかを決めていません。&lt;/p&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;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;onClickPayment&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;onClickDelete&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;onTextChanged&lt;/span&gt;(text: String)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のような名前が自然です。&lt;/p&gt;
&lt;h2 id="viewmodel--ui-は意図"&gt;ViewModel → UI は「意図」&lt;/h2&gt;
&lt;p&gt;一方で、ViewModel から UI に送るイベントは少し性質が異なります。&lt;/p&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;sealed&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UiEvent&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;OpenPaymentEdit&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; paymentId: Int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) : UiEvent()
&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;object&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ShowDeleteDialog&lt;/span&gt; : UiEvent()
&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;ShowSnackbar&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; messageRes: Int
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) : UiEvent()
&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;ここで ViewModel が伝えたいのは、&lt;/p&gt;</description></item></channel></rss>