ActionScript

Flex/AIRアプリケーションの記述をするには、ActionScriptという言語を使うことになる。これは一応オブジェクト指向言語で、各種のライブラリも、オブジェクトとして実装されている。これはGUIのコンポーネント要素も同様である。

一見、普通のオブジェクト指向言語なのだが、これが、結構癖が強くて、色々はまり道だったりするわけである。ちっぽけな世界時計アプリを書いただけで、はまり道ぐねぐねなのだからたまったモノではない。とりあえず、はまり道だったことを、ぱらぱらと、備忘録的に書いておく。

  • すべからく参照渡し
    とにかく、代入、関数への引数の引き渡し、何をとっても参照渡しとなる。なので、うっかり、オブジェクトの中身を書き換えたりすると、思わぬ所へ波及することがある。
    そのくせ、オブジェクトを単純に複製するという操作がないので、コピーを作るのも面倒だったりする。
    配列だったら、var b:Array = a.concat(); とするとコピーができる。日時型の場合は var t: Date=new Date(d.getTime()); とでもするしかない。
  • シングルトンが書けない?
    これは、既に、あちこちで、例が出ている。コンストラクタを privateにできないので、外から呼べないような仕組みを無理矢理使う。パッケージのスコープを逆手に取る方法だ。

    package
    {
        class Singleton
        {
            private static var _instance: Singleton = null;
            public Singleton(b: Blocker = null)
            {
                if (b == null)
                {
                     throw new Error(“use Singleton.instance to get the instance of this class.”);
                }
                init();
            } 
            public static function get instance(): Singleton
            {
                if (_instance == null)
                {
                    _instance = new Singleton(new Blocker());
                }
                return _instence;
            }
            …
        }
    }
    class Blocker {}

    こんな、クラスを作ってやり、var s: Singleton = Singleton.instance; のようにアクセスしてやることで、シングルトン的に使うことができる。class Blockerには、このファイル外からアクセス出来ないので、外部からコンストラクタを呼び出すと、失敗するようになっているというわけ。
  • MXMLのプロパティへのアクセスのチェックがかなりルーズ
    オブジェクトの実態は、ほぼハッシュである。これは、実装上は便利だろうけれど、存在しないプロパティへのアクセスもするりとすり抜けるので、typoによるバグが、頻繁に発生する。これは、特に、MXMLコンポーネントに対して発生しやすい。問題は、オブジェクトがハッシュであることよりもMXMLコンポーネントの実装というかエラーチェックに問題があるのかもしれないが。厳密に class で定義されたオブジェクトの場合は、もう少しマシなチェックが働いてるようであるので、余計に気持ち悪いともいえる。
  • 演算子のオーバーライドはできない?
    定義したクラスの比較を、オーバライドしたいと思ったが、できなかった。valueOf()をオーバライドして、その結果を比較しようとか考えてみたりもしたが、うまくいかなかった。加算とか、色々場面場面でオーバライドしたいこともあるが、できないっぽい。
  • ライブラリの実装が微妙に非対称
    配列の要素数や、文字列の長さは v.length というプロパティとして取得できる。しかし、XMLデータに子どもがいくつ存在しているかを得るには、xml.children().length()と、関数形式にする必要がある。うっかり、 .lengthとやっても、実はエラーにならない。これは、XMLデータの、<length>~</length>にアクセスしたと解釈されるわけだ。MXMLのプロパティへのアクセスに通じるルーズさなのだが、仕方がない。エラーにならないので、中々気付きにくいバグとなる。
    そもそもの、長さを、プロパティではなく、関数で取得するように統一しておけば生じにくい間違いなのだが。

結構、いろんなところがルーズで、まあ、それがゆえに便利なんだろうけれど、大昔、BASICでプログラムを書いていた頃のことをちょっと思い出したりした。