AS2でコンパイルしたときに含まれるクラスに関するTIPS

FLASHコンパイラはどの段階でswf内にクラスを組み込むか

FLASHはimport文を書いただけではクラスの情報をswf内に組み込こまない。
組み込まれる条件としては

  • そのクラスで型宣言された変数がある(例:var hoge:Hoge
  • そのクラスをnewしている(例:new Hoge())
  • ライブラリのMovieClipに紐付けられている

のどれか一つでも満たした場合。

複数のswfでコンパイルしたクラスのバージョンが違う場合どうなるのか

FLASHで開発する場合swfを分けて複数のファイルにすることは多いです。きっと。


もし、複数のswfに(パッケージ名まで含んで)同じ名前のクラスを含んでいた場合には、先に読み込まれたswfのクラスの内容が使用されます。
例えばbase.swfにa.swfとb.swfを読みこむ場合を考えます

base.swf <-+---func1.swf(swf内にHogeクラスのデータを含む)
           |
           +---func2.swf(swf内にHogeクラス内のデータを含む)

この場合a.swfとb.swfが同じクラスのバージョンでコンパイルされていれば問題ありませんが、違うバージョンの場合には先にロードされたほうが優先されるので、先に読まれるほうが古いクラスだと問題がでてきます。


数百クラスの規模くらいの開発になってくるとswfの数もそれなりに増えてくるので全てコンパイルしなおすのもあまり現実的ではないですね

コンパイル時に含めるクラスを意図的に分離してみる

たとえば機能を分離してfunc1とfunc2という機能があった場合を考えます
もの凄い省略した考え方ですがクラスのパッケージを作るさいに

projectname-+--common(共通)
            |
            +--func1(func1用)
            |
            +--func2(func2用)

という構造だとします。
commonに関してはどこからでもコールしていい。他は独立したswfからのみコールしていいという条件を決めます。
そうすることでcommonはどのswfにも含まれますが、それぞれの機能に特化した部分はそれぞれにしか含まれないという形にします。
次にファイルを

base.swf <-+---common.swf(commonのクラスデータのみ書き出したもの)
           |
           +---func1.swf(swf内にHogeクラスのデータを含む)
           |
           +---func2.swf(swf内にHogeクラス内のデータを含む)

という形にしてかならずcommon.swfを初めに読み込むようにします。
common.swfの中身は

var hoge0:projectname.common.a;
var hoge1:projectname.common.b;
var hoge2:projectname.common.c;
 ・
 ・
 ・

と定義だけしておくだけです。こうすることでクラスデータのみ持つとくに単体としては機能しないファイルができます。これを初めによむことで共通部分を固定化させることが可能になります。
もちろんcommon内のクラスのインターフェイス(入出力)がかわったらクラスの使い方も変わるのでプログラムを書き直して再コンパイルする必要がでてきますが、インターフェイスさえかわらなければcommon.swfさえ最コンパイルすれば全体の定義を強制的に更新することが可能です。
func1.swfやfunc2.swfはつねにコンパイルすればそのときの最新の形で単独テストできますし、全体結合の際もスムーズに進めやすくなります。


ただ気をつけることはcommon以下のクラスからはfunc1やfunc2などの別のパッケージへ(common以下以外)への参照をなくすことです。その際にはコールバックなどのテクニックが役に立ちます。


共通部分はコアパッケージになるので早めの段階で入出力はきまってくるので、たとえばひとつの変更のために何十もあるflaファイルを再コンパイルする必要はなくなります。


数百クラス規模になるようなプロジェクトでないとこれの有用性はなかなか発揮しませんが、初めにフレームワークから設計していくような規模の大きい案件ではフレームワーク部分のデータだけ別ファイルにして書き出したりと、何かと使えるテクニックです。


そうとう触りこんでる人じゃないと、実用性がわかりにくいかも・・・