さて、ここではサンプルソースにあるDataModel層について解説します。
といっても、ここはあまり難しくありません。
この層はビジネスロジックの入る余地がなく、
DataModelは単に
「MXMLにデータバインディングするためのデータの入れ物」
でしか、ないからです。
このあたりもCairngorm特有のものではないでしょうか。
以下のように構成されています。
1)ApplicationDataModelクラス
2)画面固有のDataModelクラス
ここではDataModelパッケージにある2つのクラスを見てみましょう。
1)
Cairngormで唯一、静的な領域にデータをもつDataModelが
このApplicationDataModelです。
package sample.datamodel
{
import sample.datamodel.samplecairngorm.SamplecairngormDataModel;
/**
* View層のデータバインディングのためのデータの器であるDataModelクラスです。
*/
[Bindable]
public class ApplicationDataModel
{
/**
* デフォルトコンストラクタです
* ただし、このコンストラクタを利用しての外部からの
* インスタンス化は認めてはいけません。
* 「static」で宣言されているgetInstanceメソッドの中でのみ、
* このコンストラクタを呼ぶようにします。
*/
public function ApplicationDataModel() ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・①
{
_sampleModel = new SamplecairngormDataModel();
}
// ここでは「static」な領域に自分のインスタンスを持つようにしています。
// Flexでは基本的にAというMXMLとBというMXMLとの値のやりとりは不可能に近いです。
// これを有効にするために「静的」な領域にデータの器であるDataModelをもつことにより、
// AとBとのやりとりを可能にしています。
private static var _model:ApplicationDataModel;
/**
* 「static」な領域にある自分のインスタンスを取得します。
* インスタンスがない場合はインスタンス化して、そのインスタンスを返却します。
* @return ApplicationDataModel データバインディングモデル
*/
public static function getInstance():ApplicationDataModel ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・②
{
if( _model == null )
{
_model = new ApplicationDataModel();
}
return _model;
}
// 画面固有のデータバインディングのためのDataModelクラスを定義しています。
// View層に配置されるMXMLファイルの数に応じて、このDataModelを増やしていくほうが
// わかりやすいと思われます。
private var _sampleModel:SamplecairngormDataModel; ・・・・・・・・・・・・・・③
public function get sampleModel():SamplecairngormDataModel { return _sampleModel; }
public function set sampleModel(model:SamplecairngormDataModel):void { _sampleModel = model; }
}
}
①コンストラクタ
クラス宣言のところに[Bindable]の宣言が書いてあるので、
このクラスはデータバインディング用のクラスある、と言えるのですが、
このコンストラクタは利用しないようにしてgetIsntace()メソッドを用意しているのが特徴です。
これはCairngormがMXMLとMXMLとの間(あるいはMXMLとActionScriptの間)のデータのやりとりを
基本的に静的なデータ領域にデータをおいて、そのデータの領域を用いてやりとりを行うようにしているからです。
ですので、このコンストラクタを用いて、ApplicationDataModelのインスタンス化を許してしまうと、
静的な領域にDataModelは作成されません。
③にある画面固有のDataModelのインスタンス化のタイミングがないために、このコンストラクタが記述されていますが、
Cairngormでは使われないコンストラクタになります。
②public static function getInstance():ApplicationDataModel
①に述べたように静的な領域にデータを持たせたいがために、
DataModelを使いたいクラスはこのgetInstanceメソッドを用いて、
ApplicationDataModelのインスタンスを取得するようにしています。
③View層にあるMXML専用のDataModelのプロパティ
サンプルのようにMXMLが1画面しかないような場合には、ApplicationDataModelクラスだけあればよいのですが、
複数の画面になると、ApplicationDataModelクラスひとつでやっていくと、どうしても大きくなってしまいます。
そこで各々のMXML専用にDataModelを作成し、ApplicationDataModelでプロパティとしてもつようにすれば、
少なくとも、ApplicationDataModelが煩雑になるのを防ぐことができます。
2)
MXML専用のDataModelです。
今回のサンプルではHelloと返すためにtxtFieldというプロパティしか実装されていませんが、
画面の数が増えればそれだけ、ここにい上げたMXML専用のDataModelが増えていくのではないでしょうか。
package sample.datamodel.samplecairngorm
{
[Bindable]
public class SamplecairngormDataModel
{
public function SamplecairngormDataModel()
{
txtField = "";
}
public var txtField:String;
}
}
Controller層に比べ、やっていることはデータバインディングのための器でしかないDataModel層。
役割がはっきりしている分、わかりやすいのではないでしょうか。
最終更新:2008年08月20日 15:43