さて、ここではCairngormのもっとも重要な部分である
Controller層について解説していきます。
Cairngormでは
「ScriptタグはMXMLの中にはできるだけ書かないようにしよう」
という考え方のもとに作られているのですが、
もうひとつの特徴が
「発生するイベントを一元管理しよう」
というものがあげられます。
このイベントの一元管理を実現しているのが
Controller層なのです。
Controller層は大きく分けて3つになります。
1)SamplecairngormControllerというクラス
2)Commandパッケージ
3)Eventパッケージ
1)
SamplecairngormControllerというクラスはイベントを一元管理するためのクラスです。
サンプルのソースを解説していきましょう。
package sample.controller.samplecairngorm
{
import com.adobe.cairngorm.control.FrontController; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・①
import sample.controller.samplecairngorm.command.*; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・②
/**
* イベントマッピングを行うコントローラークラスです。
* このクラスでイベントを一元管理しています。
*/
public class SamplecairngormController extends FrontController ・・・・・・・・・・・・・・・・③
{
/** イベントを一意に識別するためのイベント名称をここで設定します */
public static const SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT:String = "clickBtnHelloWorldEvent"; ・・・④
/**
* コンストラクタです。
*/
public function SamplecairngormController():void
{
super();
// addCommandメソッドで一意に指定したイベント識別名とCommandクラスとのマッピングを行います。
// これによりこの識別イベント名のイベントが発生するとCommandクラスが呼び出されるようになります。
addCommand(SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT,ClickBtnHelloWorldCommand); ・・・・・⑤
}
}
}
①import com.adobe.cairngorm.control.FrontController
Cairngormでイベントを一元管理するために必要なFrontControllerクラスをインポートしています。
後で記述していますが、このFrontControllerクラスを継承することで、
イベントを一元管理してくれる役割をもったクラスになるわけです。
②Commandパッケージのインポート
Commandパッケージに所属するCommandクラスをインポートしています。
2)のパッケージですね。
Commandというのはイベントと1対1になるもので、
イベントが発生した際に、実行されるロジックが実装されたクラスを指しています。
クラスの内容は2)で解説します。
③FrontControllerを継承したクラスの宣言
①で出てきたFrontControllerクラスを継承したクラスの宣言です。
既に記したようにイベントを一元管理するために必要なクラスを継承しているという宣言です。
④public static const SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENTの宣言
Eventクラスを作成したときに使う「イベント名」をここで設定しています。
この「イベント名」がMXMLより送出されれる「イベント名」になります。
ですので、ここで宣言したイベント名がFrontControllerの中で管理されるようになります。
⑤addCommand()メソッド
④で宣言したイベント名とCommandパッケージの中のCommandクラスの名前を引数として
実行されるメソッドです。
このaddCommandメソッドこそがCairngormでイベントと実行ロジック実装クラスとをマッピングするメソッドなのです。
このメソッドでイベントとCommandクラス名を設定しなければ、
イベントが起こってもイベントに対応した実行ロジックを呼び出すことができません。
このメソッドはCairngormの中でもっとも重要なメソッドのひとつでしょう。
2)
Commandパッケージは前述にある実行ロジックの実装クラスのパッケージです。
ここでは実際にサンプルアプリケーションのCommandクラスを見てみましょう。
package sample.controller.samplecairngorm.command
{
import com.adobe.cairngorm.commands.ICommand; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・①
import com.adobe.cairngorm.control.CairngormEvent; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・②
import mx.rpc.IResponder; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・③
import sample.controller.samplecairngorm.event.ClickBtnHelloWorldEvent; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・④
import sample.datamodel.ApplicationDataModel; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑤
import sample.service.samplecairngorm.SamplecairngormHttpDelegate; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑥
/**
* イベントを実際に実行するコマンドクラスです
*/
public class ClickBtnHelloWorldCommand implements ICommand,IResponder ・・・・・・・・・・・・・・・・・・・・・・・・・⑦
{
/**
* イベント発生後、最初に実行されるメソッドです。
* @param event CairngormEvent
*/
public function execute(event:CairngormEvent):void ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・⑧
{
// イベントはCairngormイベントの形でわたってきますので、
// それを専用のイベントにキャストします。
var e:ClickBtnHelloWorldEvent = event as ClickBtnHelloWorldEvent; ・・・・・・・・・・・・・・・・・・・・・・・⑨
// Delegateクラスをインスタンス化する際に自分のインスタンスを渡します。
// これは「IResponder」インターフェースを実装したクラスが自分だからです。
var httpDelegate:SamplecairngormHttpDelegate = new SamplecairngormHttpDelegate(this); ・・・⑩
// Delegateをインスタンス化する際に自分のインスタンスを渡していますが、
// このことにより、下記、メソッドが実行され、HTTPServiceあるいはRemoteObjectでの
// サーバー連携の結果が自分のインスタンスの「result」あるいは「fault」メソッドに
// 帰ってくるようになります。
httpDelegate.clickBtnHelloWorld(new Object()); ・・・・・・・・・・・・・・・・・・・・・・・・⑪
}
/**
* Resultイベントハンドラです。
* @param data オブジェクト
*/
public function result(data:Object):void ・・・・・・・・・・・・・・・・・・・・・・・・⑫
{
var model:ApplicationDataModel = ApplicationDataModel.getInstance(); ・・・・・・・・・・・・・・⑬
model.sampleModel.txtField = data.result.docs.doc.say; ・・・・・・・・・・・・・⑭
}
/**
* Faultイベントハンドラです。
* @param info オブジェクト
*/
public function fault(info:Object):void ・・・・・・・・・・・・・・・・・・・・・・⑮
{
}
}
}
①ICommandインターフェースのインポート
ICommandインターフェースはFrontControllerクラスを継承したクラス(サンプルではSamplecairngormController)で、
addCommandメソッドを実行する際に第2引数として渡していたCommandクラス名を
確定させるためのインターフェースです。
つまり、このICommandインターフェースを実装しないと、
FrontControllerを継承したクラスの中でaddCommandメソッドを呼び出した際に、認識してくれないのです。
ですので、Commandクラスを作成する際には必ずimplementsしましょう。
②CairngormEventクラスのインポート
このCommandクラスが受け取るEventをインポートしています。
CairngormでのイベントはすべてこのCairngormEventクラスを継承して作られています。
このあたりについては3)にて解説しますが、
executeメソッドの第1引数として渡されるクラスがこのCairngormEventなのです。
③IResponderインターフェースのインポート
IResponderインターフェースはHTTPServiceでのサーバサイドの呼び出し、
あるいはRemoteObjectのメソッドを使ってのサーバサイドの呼び出しの際に、
成功(result)か失敗(fault)かをハンドルするためのインターフェースです。
これもまたCommandと同様にimplementsしないと、後に出てくるDelegateのメソッドを実行した際に、
成功したか失敗したかの結果が返ってこなくなってしまいます。
ですので、Commandクラスを作成する際には必ずimplementsしましょう。
④ClickBtnHelloWorldEventクラスのインポート
executeメソッドで実際にイベントを受け取った際に、
このCommand専用のイベントにキャストするためにインポートしているクラスです。
ecxecuteメソッドが呼び出されたときに引数としてCairngormEventをもっているのですが、
多くの場合、呼び出されたCommand特有のイベントへとキャストして使います。
今回の場合は
var e:ClickBtnHelloWorldEvent = event as ClickBtnHelloWorldEvent
としてCairngormEventからClickBtnHelloWorldEventへとキャストをしています。
⑤ApplicationDataModelクラスのインポート
ApplicationDataModelはデータバインディングのデータの入れ物、器です。
詳しいことはDataModel層の解説で述べますが、
データの入れ物ということなので、MXMLでデータを表示する際に使うためインポートしています。
⑥SamplecairngormHttpDelegateクラスのインポート
DelegateクラスはHTTPServiceあるいはRemoteObjectと直接連携するために
設けられたクラスです。
これはService層で解説しますが、このサンプルではHTTPServicecと連携したいために、
その連携方法をもつDelegateであるSamplecairngormHttpDelegateをインポートしています。
⑦public class ClickBtnHelloWorldCommand implements ICommand,IResponder
前述のICommand、IResponderを実装したクラスの宣言です。
⑧executeメソッド
イベントが送出された際に呼び出される実行メソッドです。
FrontControllerを継承したクラスの中でaddCommandメソッドを用いて、
イベントとCommandクラスをマッピングしていますが、
このイベントが起こった際に呼び出されるメソッドがこのメソッドです。
またイベントが起こった際にはCairngormEventが渡されてきます。
多くの場合、自分のCommandクラスに関連付けされたEventへキャストして利用します。
これは④で、既に述べられています。
⑨ClickBtnHelloWorldEventクラスへのキャスト
④、⑧の解説ですべてです。
⑩HTTPServiceあるいはRemoteObjectとの橋渡し役をするDelegateクラスのインスタンス化
Delegateクラスの役割は⑥の解説とService層の解説に記述されていますが、
ここでのポイントはDelegateクラスをインスタンス化するときに、
new SamplecairngormHttpDelegate(this)
と、自分のインスタンスを渡しているところです。
この自分のインスタンスを渡すことで、自分の持っているメソッドであるresult、faultに
HTTPServiceやRemoteObjectメソッドの実行結果が返ってくるようになります。
これはIResponderインターフェースを実装しているからです。
⑪Delegateのメソッドの呼び出し
HTTPServiceやRemoteObjectを利用しての呼び出しはすべてDelegateクラスを
用いて行うこと、というのがCairngormのひとつのルールです。
このサンプルでもそのルールに従って呼び出しています。
⑫resultメソッド
⑬ApplicationDataModelのインスタンスの取得
⑭結果をDataModelへ設定
⑩にて解説されていますが、Delegateクラスのメソッドを実行したときに、
その実行が成功した場合に実行されるメソッドです。
サーバサイドと連携した場合、このメソッドにデータベースの検索結果等が
返ってきますので、それを用いてロジックを実装していくところです。
多くの場合、データベースの検索結果などは
ApplicationDataModelのインスタンスを取得して、
そのDataModelのプロパティに該当する結果を設定する、といった形になります。
⑮faultメソッド
⑩にて解説されていますが、Delegateクラスのメソッドを実行したときに、
その実行が失敗した場合に実行されるメソッドです。
HTTP接続エラーなどのエラーハンドリングは、このメソッドで記述していくことが多いのではないでしょうか。
3)
EventパッケージはFrontControllerクラスを継承したクラスを作る際に
public static const SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT
のように静的領域に文字列を宣言していましたよね。
その文字列を使って作ったものがEventパッケージの中に入ります。
ここでは実際にサンプルアプリケーションのEventクラスを見てみましょう。
package sample.controller.samplecairngorm.event
{
import com.adobe.cairngorm.control.CairngormEvent; ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・①
import sample.controller.samplecairngorm.* ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・②
/**
* イベントクラスです
*/
public class ClickBtnHelloWorldEvent extends CairngormEvent ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・③
{
/**
* コンストラクタです
*/
public function ClickBtnHelloWorldEvent(o:Object):void ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・④
{
// コントローラーに設定した一意に識別するためのイベント名を
// superクラスのコンストラクタに渡しています。
// これにより、このイベントはコントローラーに設定した一意の識別名をもつ
// イベントとして認識されるようになります。
super(SamplecairngormController.SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT); ・・・・・・⑤
}
}
}
①import com.adobe.cairngorm.control.CairngormEvent
Eventクラスを作る際には、Cairngormでは必ず、このCairngormEventクラスを継承します。
その継承のためにインポートをしています。
② import sample.controller.samplecairngorm.*
後で記述が出てきますが、FrontControllerクラスを継承したクラスの中で
「public static const」と宣言した文字列があると思います。
その文字列を利用するため、Controllerクラスをインポートしています。
③public class ClickBtnHelloWorldEvent extends CairngormEvent
CairngormEventを継承してEventクラスを宣言しています。
④ ClickBtnHelloWorldEventコンストラクタ
⑤super(SamplecairngormController.SAMPLECAIRNGORM_BTNHELLOWORLD_CLICK_EVENT)
このコンストラクタの中で宣言されている親クラスのコンストラクタを呼び出すsuper()メソッドの中で、
②にてインポートしたFrontControllerクラスを継承したクラスの
「public static const」で宣言した文字列を利用して親のコンストラクタを呼び出しています。
この親のコンストラクタに渡される文字列が、Cairngormの中で一元管理されるようになります。
以上、少し長くなりましたがController層の解説になります。
最終更新:2009年03月19日 11:38