内部状態の見直し - Expense Report (4)

 携帯電話用小遣い帳アプリ Expense Report のバージョン0.4.2をリリースした後、内部の状態遷移を再定義して、その構成を大幅に書き直すことにした。追加する予定の大きな機能として次のものが残っており、そのままの構成では、機能追加で破綻が生じる恐れがあったためである。

  • 他の電話機とデータを同期する。
  • データをPCで取り込めるようにする。

 いずれもユーザーの操作ステップ数が多く、その上、入出力において非同期処理が必要な機能である。これらの機能追加に耐えうる構成を作っておかなければならない。
 これまでは状態遷移といえば画面遷移と同義で、すべてユーザーのコマンド・ボタン押下が契機となるものばかりであった。そのため、状態遷移(画面遷移)はCommandListener.commandAction()の処理として行っていた。非同期処理が加わるとそれだけではすまなくなる。そこで、ステートマシンを定義して、コマンド・ボタン押下をステートマシンへのイベント入力として扱うように処理を変更した。この処理を愚直に実装していくと、Windowsアプリケーションのウィンドウ関数のように巨大なswitch-case構造ができ上がった。これは後で、switch-caseをいくつかに分割するか、テーブル式にするか、あるいはStateパターンを使うなどして書き換える必要がある。