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