Cairngormサンプル解説(3

さて、ここではサンプルソースにある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層。
役割がはっきりしている分、わかりやすいのではないでしょうか。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2008年08月20日 15:43
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。