要約:知らないと損するアプリ開発におけるStateMachineの活用法

  • 146
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

知らないと損するアプリ開発におけるStateMachineの活用法(SlideShare full版)」

知らないと損するアプリ開発におけるStateMachineの活用法(full版).png

という内容でクラスメソッド & ゆめみ 合同勉強会 Developers.IO Meetup 09で発表させて頂きました。

これについての要点をまとめます。

内容

StateMachineとは何か?

StateMachineは簡単に言うとUMLの「状態図(ステートチャート)」の実装です。
状態図による分析・設計は、実は色々な分野で活用されていて、iOS/Android/WebApp などのクライアントアプリでは実は非常に有用なものなのです。

ただ、StateMachineの実装は真面目にやると大変です。

例えば、こんな単純な状態図でも

知らないと損するアプリ開発におけるStateMachineの活用法_のコピー_pptx.png

真面目にJavaで実装すると300行以上になります。
https://gist.github.com/mokemokechicken/9eb89e3c69d7e97800ea
まあもちろん、実装方針とか言語的な行数傾向はありますが、意外と大変であると言えると思います。

StateMachine Generator

そこで State Machine Compiler(SMC) というOSSを活用します。
これは、SMC用のDSLから状態図、StateMachineコードを生成してくれます。そして、この状態図とコードは意味的に同じであることが保証されます。従って 状態図を見ればStateMachineの膨大なコードを見る必要が無くなります

StateMachineのメリット

このStateMachine Generatorのおかげで次のようなメリットが生まれます。

  • ModelやViewControllerから複雑な非同期遷移ロジックはStateMachineに移せる。
  • StateMachineは状態図と同じなので状態図を見ればコードを読む必要はない。ModelやViewControllerは単純なアクションのみ実装すればよいので、「状態図+アクションコード」のみ人間は理解すれば良い。これは非常に可読性が高い。
  • 状態遷移の変更にも非常に強く、コードの修正は局所的なもので済む。

この辺の詳細はスライドの方を参照してもらえればと思います。

SMCのWeb実行環境

SMCは便利なのですが、Setupが少し面倒です(要Java, Graphviz)。
また、生成したコードとDSLの結びつきの管理が少し面倒です。

そこで、SMCの実行をWebから行えるようにして、更にソースコードにDSLが再現されたSMCのWebのURLを埋め込んでおくことでこれらの問題を解消できます。

この仕組みをDockerに詰め込んだものを配布しています。詳しくは下記の投稿を参考にしてください。
State Machine CompilerのWebUI付きDockerコンテナの使い方

設計Tips

StateMachineの設計時の注意事項です。

  • 状態名は名詞にする(動詞にしない)
  • 複合状態はなるべく作らない(状態数が爆発するので)
  • 1つのStateMachineは複数スレッドにまたがらない

などがあります。

さいごに

以前作ったスライドとあわせてアプリ設計の3部作みたいになりました。
一つ目で言いたかったことの細かいことを2,3で書いたような感じです。

興味のある方は時間のある時にでも見てみてください!