0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kotlin から StateMachine を理解しよう ~ StateFlow を添えて ~

Last updated at Posted at 2025-12-03

アイキャッチ

まえがき

こんにちは。ko-tarou です。
この記事では StateMachine の意義について解説します。
しかし、具体的な実装方法は説明しません。

「StateMachine がどのような存在か」

ということに重点を置いています。

今日のゴール 「 StateMachine を一言で説明できる 」

Code から読み解く

View のみで管理される TextFeild

image.png

Android 開発者であれば、チュートリアルで誰もが通る道かと思います。
これが最もシンプルな形です。

しかし、実務コードになると、とても複雑になってしまい 責務の分離 が発生します。

View, ViewModel の TextFeild

image.png

これもかなりモダンな実装かと思います。
公式が推奨している MVVM に則るとこのようになります。

ここで意識してほしい点は、

State = 値の状態

となっていることです。
age 変数が持つ値は 0,1...であり、これを State として管理されています。

要件から読み解く

例として、

特定の画面を小学生, 中学生, 高校生, 社会人によって振る舞いを変えたい

という要件を考えます。

  • 課金の広告は高校生以上じゃないと出さない
  • 小学生には文字を大きくして表示する

などですね。

ここで考えてほしいのですが、
この要件では

画面の状態 = 小学生 or 中学生 or 高校生 or 社会人

であり、

値の状態 と 画面の状態が衝突している

ということです。
もし、衝突している状態で実装を行うと、負債となる依存を生んでしまいます。

ここで、登場するのが 「 StateMachine 」 です。

つまり、StateMachine とは...

StateMachine を利用することで、先ほどの衝突を回避することができます。

StateMachine は、

イベント → 画面の状態に変換 → ロジック

という流れで行われます。

イベント とは、先ほどの実装で言う、TextFeild に入力されることです。
それを画面の状態である、小学生, 中学生...に変換します。

そして、画面の状態を元にロジックを構築します。
このように行うことで、

ロジックが画面の状態に依存するため、綺麗な状態管理が可能になります。

思想から Code に

想像しやすくするため、簡易的にコードに落とし込みます。

image.png

まず、"画面の状態""値→画面の状態に変換する関数" を定義します。
※ここでは enum を採用していますが、実務では sealdclass の場合が多いかと思います。

image.png

そして、ViewModel に画面の状態をします State と言う変数を定義します。

そして、最後の行では、
画面の状態である、PersonState.NONEを軸にロジックを定義しています。

このように行うことで、StateMachine をコードに落とし込むことができます。

勘違いを生まないように

ここでは、簡易的なコードを用いて解説しました。
そのため、enum は実際は sealed class 場合が多い など、実務のコードに落とし込むには不十分な実装が多くあります。

この記事では、あくまで思想を持ち帰っていただければ幸いです。

また、画面の状態についても、小学生, 中学生 ... と例を挙げましたが、
実際には Idle, Loading, Success, Error... などを定義する場合が多いです。

あとがき

この記事をお読みいただきありがとうございます。
今回は以下のイベントにて登壇させていただいた内容を元に書かせていただきました。

この記事だどなたかの一助になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?