Mutable なエンティティモデル(2)
可変実装を考える前に、不変実装を振り返ってみます。
XCLはcubsonというコードジェネレーターを使っています。元がmojaLEというmojavi2のX2適用サブセットのカスタム版ですので、若干古いのですが、プロパティの追加/削除程度の改変であれば、さすがに対応することができます。
モデル定義コードの変更
プログラムで使用しているモデルクラスが新しいプロパティを受け入れられるように、プロパティの定義を追加する必要があります。XoopsObject のシンプル版である XoopsSimpleObject のサブクラス実装がエンティティモデル毎に定義されていますので、そのダイナミックプロパティリストの初期化コードに、新しいプロパティ定義を追加します。
UIの変更
次に、必要があれば(たいてい必要ですが)、プロパティの入力を受け付けるためのUIを追加します。ほとんどの場合、テンプレートにHTMLコードを追加することになるでしょう。
グルーコードの追加
追加したUIアイテムと、モデルのプロパティを結びつけるグルーコードを追加する必要があります。cubsonスタイルではアクションフォームがこの役割を果たしており*1、アクションフォームにプロパティと検査を追加し、モデルの値を読み書きするメソッドにコードを追加します。
この箇所の汎用自動バインディングがあってもよかったのですが、ついに作られませんでした。世の流れを見るに、バインドは名前で縛り、UI入力検査もデータモデル検査にまとめてデータモデルのほうに書いてしまうというのが流行のようです。
アップグレード
cubsonスタイルの場合、というより、X2とXCL自体がデータソースの抽象化をモジュールに提供しないというポリシーのため、既存のデータソースにプロパティぶんの保存域を追加するコードはそれぞれのモジュールで書く必要があります。
*1:cubsonスタイルはUIにバインドされるのはアクションフォームという考え方です