プロジェクト

全般

プロフィール

JavaFXとMVVM

はじめに

JavaFXとMVC の姉妹編です。MVC構造では、FXMLに対するControllerがFXMLで定義したビューの書き換え、ドメインモデルの読み書きを行う処理を担います。ドメインモデルは、「モデルとビューの分離」を基本方針とするので1、JavaFX由来のAPI(プロパティ等)には依存しないようにすると、Controllerがかなり頑張ってドメインモデルとビューの橋渡しをするので複雑・肥大化しがちです。

小さいアプリケーション(1つのドメインモデルとそのビューで成立)であればそれほどControllerが肥大化せずに済みます。
しかし、複数のモデルを一つの画面に表示するなど大きなアプリケーションになると、複数のドメインモデルを横断して画面に表示する要素を取り出しビューに設定する、ドメインモデルの取得先が複数に跨っているとそれぞれのアクセスを意識して取得する、ローカルでキャッシュする仕組みが入るとその制御にも関与する、などいろいろな処理がコントローラーに入り込んでしまいます。

そこで、MVVM(Model, View, ViewModel)構造を導入し、Controllerの肥大化を避けるようにできないかを探っていきます。

1 JavaFXアプリケーションにおいて、モデルを割り切ってJavaFX APIに依存するように作ってしまうと、MVC構造でもControllerの複雑化をある程度抑えられます。これはどこまでモデルをビューから切り離すかとのトレードオフです。

MVVM構造の導入

クラス構造

JavaFXでMVVM構造を導入する一案として次のクラス構造を作成します。

Mvvm_class.png

Viewは、FXMLで定義します。Viewで定義した画面において、表示更新(モデル等の更新による変更や、ユーザー入力による変更)のあるView要素を、FXMLに対応するControllerのフィールドに定義します。フィールドの値はFXMLで定義したViewを表示する際にJavaFX側でインジェクションされます。

モデルの値に基づきViewに表示するものは、モデルの値をJavaFXのproperty型でViewModelのフィールドに定義します。Controllerは、View要素のpropertyとViewModelの対応するpropertyを紐づけます。この紐づけにより、ViewModelのpropertyが変更されるとView要素のpropertyが変化し、画面の表示が更新されます。また、View要素にユーザーが入力するとその値がViewModelのpropertyに反映されます。

ViewModelまでは、JavaFXへの依存があるビューの世界の構成要素となります。一方、モデルはビューから分離したドメインの世界の構成要素となります。
ここでは、ViewModelからModelへ単純な依存関係だけをクラス図に示していますが、実際にはModelはデータベースやネットワーク上の他のシステムやローカルのファイルやキャッシュなど様々なところから取得するので、ViewModelとModelの間にさらにRepositoryなどの構成要素を追加する設計がよく使われます。


1年以上前に更新