ドメイン駆動設計(DDD)でAndroidアプリを開発する実例を作る
最近よく見るでも前からあるけれど実践するにはどうすればいいかさっぱり分からないドメイン駆動設計(DDD)でFEH Battle Simulator(以下FEHBS)を作ってみます。個人開発でないと実践するチャンスが少ないですからね。
なんにでも使えるように抽象的な言葉を使っているので今ひとつピンときませんのでFEHBSのドメインに適用した例を日本語で書いてみます。
FEHBSはファイアーエムブレムヒーローズ(任天堂。以下FEH)のシミュレータである。
FEHは将棋盤上のステージでヒーローを操作して敵を撃破するゲームである。
ヒーローが敵ヒーローを攻撃した場合、能力値やスキルによってダメージや撃破判定が発生する。これには攻撃順やヒーロー同士の距離によるスキル効果は関係するが、将棋盤上の操作とは関係が無い。
つまり、FEHBSは将棋盤上の操作とヒーロー同士の戦闘判定の二つのサブドメインに分割することができる。
・エンティティ:ヒーローはFEH内のオブジェクトであり(属性=能力値やスキルではなく)連続性と識別性により定義される。
・値オブジェクト:ヒーローは個体差のある能力値やスキルを持つが、スキルは誰が持っても同じ効果を持ち、LVはあるが状態として持つわけではない。誰かの獅子奮迅スキルのレベルが上がっても他の人の獅子奮迅スキルのレベルも上昇したりはしない。よってスキルは読み出し専用のオブジェクトであり、各ヒーローが共有する。
・サービス・リポジトリ・ファクトリ:FEHBSでは適宜使用するがAndroidプラットフォーム上で動作するため、ドメインに存在する「定義」とAndroidに存在する「実装」に分かれる。
このドメインの分析により、まずサブドメインに分割してモジュール化します。サブドメインは「将棋盤上の操作」「ヒーロー同士の戦闘」の二つです。
android:LibGDXで動かす画面のAndroid依存部分。リポジトリ実装であるRealmの準備と戦闘画面の起動を行う。開発中。
core:LibGDXで動かす画面のAndroid非依存部分であり、将棋盤上の操作をモデル化したもの。FEH操作モデル。LibGDXに依存。
desktop:LibGDXで動かす画面のデスクトップ依存部分。詳しくはないがデスクトップJavaベースなのだろう。現在は開発スコープに入っていない。
fehbs:操作とは無関係にヒーロー同士の戦闘を計算する仕組み、を駆動するAndroidアプリ。現在GooglePlayで公開している部分のUIを担当。Realmの準備も行っている。
fehsbattlemodel:操作とは無関係にヒーロー同士の戦闘を計算する仕組み、のモデル部分。fehbsからアクセスされるが、何にも依存していない。
クリーンアーキテクチャに適用した場合、
中心のEntitiesはfehsbattlemodelとcoreモジュール内のアプリケーション非依存部
UseCasesはcoreモジュール内のアプリケーション依存部
Controllersとその外側がandroidとfehbsモジュール
となります。ビルドのDependencyの都合により、Entitiesはその外側に依存することは不可能になります。これによりモデルの独立性を保ちます。
以降はandroid部は未完成であるために公開してるアプリであるfehbsと戦闘モデルの関係を作っていきます。PlantUML勉強してはてなブログで直接書けるようにならないと…。