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でプログラムを書いていた頃のことをちょっと思い出したりした。
コメント