PureMVCサンプル解説3

PureMVC、というよりはすべてのロジックの肝となる
Model層について記述していきます。
この層で利用されるクラスは以下の通りです。
  • Proxyクラス
  • ValueObjectクラス
このクラスについても既に概要は述べています。
ので、ここではサンプルをあげてみていきましょう。
まずはProxyクラスです。

「CalclationProxy.as」
package example.model
{
import org.puremvc.interfaces.IProxy;
import org.puremvc.patterns.proxy.Proxy;
import mx.collections.ArrayCollection;
/**
 * Proxyクラス
 * 実際の処理の実態をここで記述する
 */
public class CalclationProxy extends Proxy implements IProxy       ・・・・・・・・・・・・・・・・・・・・①
{
	// このクラスのNAMEプロパティの設定。このNAMEでfacade内のインスタンスは管理されるので、
	// これはプロジェクトでユニークになること
	public static const NAME:String = "CalclationProxy";      ・・・・・・・・・・・・・・・・・・・・②
	// プロパティ
	private var _plusFlg:Boolean;
	private var _minusFlg:Boolean;
	private var _saveData:String;
	/**
	 * コンストラクタ
	 */
	public function CalclationProxy():void
	{
		// 親クラスのコンストラクタの呼び出し。
		// 第1引数は自分を示す文字列のNAMEを、
		// 第2引数はプロパティとして保持する型を
		// new演算子で指定してあげる。
		// こうすることで第2引数に指定された型が
		// dataというプロパティの型が設定される。
		super(NAME, new String );                  ・・・・・・・・・・・・・・・・・・・③
		_plusFlg = false;
		_minusFlg = false;
		_saveData = "";
	}
	/**
	 * プロパティ値の取得
	 */
	public function get calcString():String               ・・・・・・・・・・・・・・・・・・④
	{
		// dataという型のプロパティをキャストして(ここではStringにして)返却
		return data as String;                    ・・・・・・・・・・・・・・・・・・⑤
	}
	/**
	 * プロパティ値の設定
	 * 文字列を引数として渡された場合については
	 * 既存の文字列と結合する。
	 */
	public function set calcString(s:String):void           ・・・・・・・・・・・・・・・・⑥
	{
		if(_plusFlg == true )
		{
			_saveData = calcString;
			data = s;
		}
		else if(_minusFlg == true )
		{
			_saveData = calcString;
			data = s;
		}
		else if( s.length == 0)
		{
			data = "";
		}
		else
		{
			data += s;
		}
	}
	/**
	 * 文字列をプロパティに設定
	 */
	public function setNumber(s:String):void         ・・・・・・・・・・・・・・・・・・⑦
	{
		calcString = s;
	}
	/**
	 * 計算結果をプロパティに設定
	 */
	public function calcEqual():void             ・・・・・・・・・・・・・・・・・⑧
	{
		var result:int;
		if( this._plusFlg == true ) 
		{
			result = int(this._saveData) + int(calcString)
			calcString = result.toString();
			this._plusFlg = false;
			this._minusFlg = false;
			this._saveData = "";
		}
		else if( this._minusFlg == true )
		{
			result = int(this._saveData) - int(calcString)
			calcString = result.toString();
			this._plusFlg = false;
			this._minusFlg = false;
			this._saveData = "";
		}
		
	}
	/**
	 * 足し算するためのフラグをONにする
	 */
	public function plusNumber():void             ・・・・・・・・・・・・・・・⑨
	{
		this._plusFlg = true;
		this._minusFlg = false;
	}
	/**
	 * 引き算するためのフラグをONにする
	 */
	public function minusNumber():void            ・・・・・・・・・・・・・・・⑩
	{
		this._plusFlg = false;
		this._minusFlg = true;
	}
	/**
	 * すべてのクリア
	 */
	public function clear():void               ・・・・・・・・・・・・・⑪
	{
		calcString = "";
		this._saveData = "";
		this._plusFlg = false;
		this._minusFlg = false;
	}
}
}
① public class CalclationProxy extends Proxy implements IProxy
Proxyクラスの宣言部。
ここではProxyクラスの継承とIProxyインターフェースの実装を宣言しています。
Proxyクラスそのものは振る舞いを持っているわけではありません。
このクラスはビジネスロジックを実装するためのクラスであり、
親クラスであるProxyとインターフェースであるIProxyはFacadeクラスへ登録するためのクラスの型と
捉えることができます。
つまりFacadeクラスにビジネスロジックを登録したい場合にはこのProxyクラスを継承しIProxyのインターフェースを
実装しなければなりません。

② public static const NAME:String = "CalclationProxy"
Facadeクラスに登録するための名前をここで定義しています。
ここで定義された名称でFaçadeクラスの中にインスタンスが生成されます。
よって、この名前はアプリケーションの中でユニークになっている必要があります。

③ super(NAME, new String );
Proxyクラスのコンストラクタを呼び出しています。
引数として文字列、オブジェクトの「型」を渡すのですが、
第1引数である文字列は自分のインスタンス名が何であるかを、自分自身が知るために渡すためのもので、
前述の②で指定したものを渡せば良いです。
第2引数はオブジェクトの「型」を渡すといっていますが、ここでいう第2引数はどのような役割を
もつのでしょうか。
Proxyクラスはビジネスロジックを実装するためのクラスであることは既に述べました。
このビジネスロジックで必要となるであろう、privateなインスタンス変数(クラス変数ともとれます)の
オブジェクトの型をこの第2引数によって決定しています。
このprivateなインスタンス変数は「data」という名称で親クラスであるProxyクラスに定義されており、
この「data」という変数に対して「型」を与えることができるのが第2引数というわけです。
つまりStringを第2引数に渡せば「data」はString型になるし、
Arrayを渡せば「data」はArray型になります。

④ public function get calcString():String
  前述にある「data」を取得するメソッドです。
  dataとしてそのままアクセッサメソッドを定義してもよかったのですが、
  dataはprivateで定義されたものです。
  ですので、アクセッサメソッドを用意してあげることでdataへのアクセスが
  できるように用意しました。

⑤ return data as String;
dataをString型として返却しています。
前述の③でdataの型は定義されているのですが、ここでも明示的に型を示すことにより、
暗黙的なキャストをしないようにしています。

⑥ public function set calcString(s:String):void
dataへ値をセットするアクセッサメソッドです。
④と同様です。
privateで定義されたdataへの値設定メソッドです。

⑦ public function setNumber(s:String):void
  ビジネスロジックです。
  View層で押された「0~9」までの数字ボタンに応じて、インスタンス変数のdata(このロジックでは直接dataにセットするわけではなく
アクセッサメソッドを通じてdataにセットしています)に文字列を設定します。

⑧ public function calcEqual():void
  ビジネスロジックです。
  View層で「=」ボタンを押下した際に呼び出すためのメソッドです。
  インスタンス変数のplusFlgとminusFlgの判定により、
  足し算または引き算をした結果をインスタンス変数のdataに設定しています。

⑨ public function plusNumber():void
  ビジネスロジックです。
  View層で「+」ボタンを押下した際に呼び出すためのメソッドです。
  plusFlgをtrueにしてminusFlgをfalseにしています。

⑩ public function minusNumber():void
  ビジネスロジックです。
  View層で「-」ボタンを押下した際に呼び出すためのメソッドです。
  minusFlgをtrueにしてplusFlgをfalseにしています。

⑪ public function clear():void
  ビジネスロジックです。
  View層で「C」ボタンを押下した際に呼び出すためのメソッドです。
  インスタンス変数のdataとplusFlg、minusFlgを初期化しています。

次にValueObjectクラスです。
といっても、解説するほどのものではありませんが、とりあえず。

「CalclationVO.as」
package example.model.vo
{
/**
 * 計算結果等を保持するVOクラス
 */
[Bindable]               ・・・・・・・・・・・・・・・・・・・・・・・①
public class CalclationVO       ・・・・・・・・・・・・・・・・・・・・・・・②
{
	// プロパティ
	private var _calcString:String;           ・・・・・・・・・・・・③
	/**
	 * コンストラクタ
	 */
	public function CalclationVO():void        ・・・・・・・・・・・④
	{
		this._calcString = "";
	}
	/**
	 * GETTER
	 */
	public function get calcString():String ・・・・・・・・・・・・・・・・・・⑤
	{
		return this._calcString;
	
	}
	/**
	 * SETTER
	 */
	public function set calcString(s:String):void    ・・・・・・・・・・⑥
	{
		this._calcString = s;
	}
}
}
① [Bindable]
Bindable宣言です。
このクラスはView層で表現する値(ここで言えば計算機のボタンを押したときの文字の表示)を保持するため、
クラス全体をバインディングします。

② public class CalclationVO
  クラス名です。
  ValueObjectクラスとわかりやすくするためにクラス名+VOとしています。
  Cairngormの場合、ValueObjectインターフェースを実装していましたが、
  PureMVCの場合には実装する必要はなくただのクラスとして定義します。

③ private var _calcString:String
  インスタンス変数です。

④ public function CalclationVO():void
コンストラクタです。
この中でインスタンス変数を初期化しています。

⑤ public function get calcString():String
  ゲッターメソッドです。
  インスタンス変数の値を返却します。

⑥ public function set calcString(s:String):void
  セッターメソッドです。
  インスタンス変数に値を設定します。

Model層はここまでです。
ここもまたFlexのCairngormと違うことがわかります。
Cairngormを元としているPureMVCですが、基本的には別ものですので、
注意が必要です。
Model層といってもView層と交錯するVOクラスがいますが、
VOクラス自体のインスタンスはView層が持っていますので、
厳密に言えば、View層の値を表現するVOクラスはView層に属するといえるかもしれませんが、
VOにアクセスするクラスがProxyクラスであり、そのProxyクラスはModel層なので、
ここに分類しました。

タグ:

+ タグ編集
  • タグ:

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

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

下から選んでください:

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