Entries

AS3メモ Commandライブラリ仕様メモ

FlashOOPのクラス共有プロジェクト用に、Commandクラスライブラリを作ろうかと模索中。

というか仕事でもプライベートでも、自動化したい処理がやたらいっぱいあって、AS2でもAS3でも両方必要な気分になってきた。
作る前に考えまとめたいので、メモ。

Applyをラップして、任意のタイミングで任意の関数を呼び出すクラスを実装するとして、結城先生の本をベースにEventDispatcherを追加するとこんな感じかな??

public class Command implements ICommand extends EventDispatcher{
private var _thisObj:Object;
private var _functionRef:Function
private var _arguments:Array

public function Command( _thisObj:Object, _functionRef:Function, _arguments:Array):void{
this._thisObj = _thisObj;
this._functionRef = _functionRef;
this._arguments = _arguments;
}

public function execute( ... args:Array ):Object{
var rslt:Object = _functionRef.apply( _thisObj, args || _arguments);
var event:CommandEvent = new CommandEvent( CommandEvent.COMPLETE)
event.result = rslt;
dispachEvent( event );
return rslt;
}
}

基本的に、コンストラクタで関数の引数を定義するのだけど、executeから関数を呼び出すタイミングでも引数を渡せる。で、関数の実行結果を戻してくれる。 AS3からクロージャが自動でデリゲートされるらしいけど、AS2とロジックをできるだけ共有したいのでapplyで逝きます。


で、考えられるサブクラスは以下の通りかな・・・

TimerCommand
Timerクラスをラップして、一定時間毎にx回繰り返しで任意の処理を実行してくれる。繰り返し終了後にCompleteイベントを発行。

EnterFrameCommand
TimerCommandのonEnterFrame版。
nフレーム毎にx回繰り返して関数を実行してくれる。繰り返し終了後にCompleteイベントを発行。

MacroCommand
n個のCommandを配列で格納して、execute実行時に登録した全てのコマンドを実行する。全て実行し終えた時点でCompleteイベントを発行。
複数の処理をまとめて行いたい場合に使用。

SequenceCommand
n個のCommandを配列で格納して、execute実行時に最初のコマンドを実行する。最初のコマンドのCompleteが発行された時点で、次のコマンドを実行し・・・ と1つづつ順番にコマンドを実行する。全て実行し終えた時点でCompleteイベントを発行
Aを行ったらBという風に、同期処理で作業を行う場合に使用。

名称未定Command
n個のCommandを配列で格納して、execute時に全てのコマンドを実行する。全てのコマンドからCompleteイベントが帰ってきた時点で、Completeイベントを発行。
全てのXMLを読み終えたらというように、非同期で全ての処理を行いたい場合に使用。

こんだけあれば、動的に色々やりにくいAS3でもかなり柔軟にできるし。AS2でもRIA系の場合にはかなり便利そう。
こういう汎用設計のライブラリって実はあまりやったことないんだけど、こんな感じでいいんすかね?
なんか、こう改造したらいいんじゃね?とかあったら教えてください。

週末にでも実装しますです。
多分。