基本的な構成
UI(android依存部)
UIは実質画面のみ。シミュレータ画面とキャラ登録画面。登録画面は後で。
シミュレータ画面では選択したキャラと他のキャラをRepositoryに出してもらって戦いを指示するだけ。戦うロジックは全てビジネスロジック部に入っている。
ロジック部
キャラクターを構成する部分と戦いの経過・結果を格納する部分に分かれる。キャラクターを構成する部分は下図のように
BaseHero:ベースとなるキャラ
ArmedHero:装備を変更・個体差を持ったキャラ
BattleUnit:HPなど戦闘中に変動する部分
で構成される。BaseHeroはStandardBaseHeroに登録されていてRepository経由で取り出すが扱うのは基本的にArmedHero。装備や個体値が変更されてない相手のときのみBaseHeroの値をコピーして使う形になる。なおスキルは全てのメソッドが空実装されていて、効果を発揮しないタイミングでは空メソッドが実行され何も起きない。
肝心の戦闘ロジックは以下。スキル効果は全てSkillに入っているので順番に起動するだけ。主にスキルの持ち主のステータスを変動させたり追撃の追加や制限を登録する、攻撃順の変更を行う。攻撃開始指示時に追撃が発生しない条件で追撃を取り除いて両ユニットに攻撃指示をする。
リポジトリ
気が変わってリポジトリも別モジュールにした。これはAndroidに依存しているがUIに依存していないため、モジュールにすることで複数アプリから共通して使うことができる。またこれによりRealmへの依存もモジュール内で完結する。なお、見てわかるようにクラスではなくシングルトンオブジェクトであり、ApplicationでビジネスロジックのRepositoryに手動インジェクションしている。これによりリポジトリが複数できてしまうことを防げる。
Realmの“ライブオブジェクト”に別スレッドからアクセスをするとデータの一貫性を維持するために落ちる。本来ならばライブオブジェクトを有効活用するべきなのだろうが私はデータストアは明示的にアクセスしたいしリポジトリという概念と相性が悪い。Hibernateも嫌いでデータストアとしてしか使っていない。
各モジュール間の関係は以上のようになっており、作って使う事はできるがそれ以上の操作ができないように隔離されている。ビルドの都合上内部のロジックから外部の画面などは見えない。こうすることでロジックは漏れなくなるというか漏らせなくなる。
次回は各モジュールの内部の話。とはいっても画面やリポジトリについて話すことは皆無なので戦闘ロジックの話になる。