ホーム >> 左脳Script >> Adobe Flash >> Action Script >> クラス定義の管理方法

クラス定義の管理方法


クラス(インスタンスではない)を条件によって振り分けたい」と試行錯誤したメモ。
「Class型でクラス定義を管理するとこういう事も出来る」というサンプルです。



問題

例えば、拡張子が flv の時は flvVideo クラス、拡張子が swf の時は swfPlayer クラス、どちらも mediaStream クラスを継承していて、制御は mediaStream クラスのメソッド&プロパティから行う。と言う場合。

拡張子毎の切り替えコードは、普通に書けば以下のような素直な物になるでしょう。

var screen:mediaStream;

switch(extension.toLowerCase())
{
    case    "flv":
        screen = new flvVideo();
        break;
    case    "swf":
        screen = new swfPlayer();
        break;
}
今後さらなる拡張で、拡張子に対する mediaStream クラスのサブクラスが増える(増やせるようにする)場合、そのまま追加していけば、switch~case が長く肥大する事になってしまいます。

もっとエレガントなやり方が有るような気がしてなりません。


と言うわけで、「class as3」等で検索してみました。

「flash.utils.getDefinitionByName() を使って文字列でクラスを云々~」と言うページが沢山ヒットします。
しかし、動的にクラス定義の切り替えをするだけならば、「これを使わずに出来るんではなかろうか?」という直感の下、Classクラスで色々やってみるうちに、ソレっぽくなりました。


var screen:mediaStream;

var classArray:Object =
{
    flv:flvVideo,
    swf:swfPlayer
};

var classObject:Class = classArray[extension.toLowerCase()];
screen = new(classObject)();
アルゴリズム的?に単純になり、記述的にもさっぱりしたと思います。

getDefinitionByName と違い、クラス定義への参照が配列の中に有るので、「コードのどこかでクラスを読み込んでいなければならない」という事もありません。
なにより、今後の拡張は classArray に「拡張子と mediaStream サブクラスの関連付け」を追加するだけで済みます。


この例のコードではコンストラクタに引数を取りませんでしたが、以下のようにすれば引数を付加は容易です。

screen = new(classObject)(initWidth:Number, initHeight:Number);
実はそのまま引数を書けます。


雑感

本当は、インターフェースを使っておしゃれにコーディングしたかった。
の、ですが、DisplayObject を継承しなければならなかったり、インターフェースどころか内容記述が同じ関数を何度も書かなければならない可能性が出てきたりで、結局クラス継承で作った経緯をメモしたモノだったりします。


エレガントなコードを書ける≒良い設計が出来る」と信じて今年も精進してまいりたいと思います。



トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/245

コメントする

ホーム >> 左脳Script >> Adobe Flash >> Action Script >> クラス定義の管理方法

アーカイブ

このブログ記事について

このページは、n-yagiが2010年1月 1日 20:38に書いたブログ記事です。

ひとつ前のブログ記事は「クラス定義と静的初期化処理のタイミング」です。

次のブログ記事は「AIR から WebCamera を使うには」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。