月別アーカイブ: 2008年10月

ステータスを一括で管理するクラス EventDispatcher機能付

AS3の仕事が増える中、AS2で使っていたBroadcasterクラスというオリジナルクラスのようなものがほしくなり、AS3用に作りました。

まず断っておきますが、これは汎用的に使えるクラスではなくノウハウのようなものです。でも一部は汎用的に使えるコードですのでカスタマイズして使ってみると何かと重宝します。

ステータスを一括で管理するというケースではイベント処理とデータの保持の両方が必要になります。

例えば「本」のようなアプリケーションの場合、「いま何ページを表示している」といったデータはそのアプリケーションの中では一つなはずですね。でもそのデータを知りたい、もしくは変更したいオブジェクトはアプリケーションのなかで点在するものです。これをうまく解決するのにはオブザーバーパターンを使えばいいわけですが、それ自体はEventDispatcherクラスを使えば簡単に実現できます。

一方アプリケーションが中くらいの規模になってくると(例えばフルスクリーンのちょっとリッチなサイト)イベントごとにクラスを作っているとクラスだらけになってしまいます。またステータスが変わったらそれをみんなに知らせたいというケースが大半なはずですね。(ちなみにここでいうステータスとはステータスパターンとはなんの関係もありません。)

つまりオブザーバーパターンの実装とステータスの保持はセットだと話が早いというわけです。また、ステータスの種類はいくらでも増やせたほうがいいですね。

サンプルです。

使うほうは
まずMovieStatusをinit()します。(これはアプリケーション内で一回でよし。ドキュメントクラスのコンストラクタでやるとベター)
つぎにファンクション定義。function onPageChanged(e:MovieStatus){trace(e.status.current);}
最後にイベント登録。MovieStatus.addEventListener(MovieStatus.PAGE,onPageChanged);

あとはMovieStatus.page = 1;とかすると先ほどのonPageChangedが呼ばれます。

今回はpageというステータスを用意しましたが、サンプルの「カスタマイズ」の部分を増やしたり改造したりすることで、アプリケーションごとに設定することができます。

本当は最初にinitするという仕様が腑に落ちないのですが、staticなクラスにしたかったことと、一つのクラスにまとめたかったことと、singletonなんかつかっていちいちインスタンス化するのが面倒だったことがあってこうなりました。ベターな方法があれば教えてください。