AS3の*型の問題点とその代替案 〜その2.オブジェクトリテラルの長所〜

目次

ではなぜ使う?

これらの問題があるのになぜオブジェクトリテラルと*型を使うのか?
まぁ理由があるからなのだが。

引数の多い関数では使いにくい

//---Tweener.as---
class Tweener{
	function addTween(obj:DisplayObject,x:Number=0,y:Number=0,alpha:Number=1,time:Number=0,delay:Number=0):void{
	//code
	}
}
//---呼び出し---
Tweener.addTween(obj,100,100,1,5);

addTween()の引数を*型にせず、一部羅列してみた例。
全部羅列しきれていない。
引数の順番を間違えないように注意深く使わないといけないし、途中の引数の省略ができない。
これでは使いにくすぎる。

型を用意して初期化しても余計な一時変数が増えてしまう

それならばクラスを用意してやって初期化すれば?

//---Tweener.as---
class Tweener{
	public function addTween(obj:DisplayObject,args:TweenArgs):void{
		//code
	}
}

//---TweenArgs.as---
class TweenArgs{
	public var x:Number=0;
	public var y:Number=0;
	public var alpha:Number=1;
	public var time:Number=0;
	public var delay:Number=0;
}

//---呼び出し---
var args:TweenArgs = new TweenArgs();
args.x = 100;
args.y = 100;
args.time = 5;
Tweener.addTween(obj,args);

擬似コード
静的型付けのOOPではよくやる例。
さっきよりはマシになったが、argsという変数を使わないといけなくなった。
addTween()を大量に使う場合には、いちいち変数を用意するというのが面倒になる。
あとTweenArgsというクラスを作らないといけないという手間が増えるが、これはライブラリ提供者としての手間なのでここでは目をつむることにする。

オブジェクトリテラルが一番シンプルにできる

//Tweener.as
class Tweener{
	public function addTween(obj:DisplayObject,args:*):void{
		//code
	}
}
//---呼び出し---
Tweener.addTween(obj,{x:100,y:100,time:5});

そう考えると、オブジェクトリテラルを使った例が、一番短く書けるというのがわかる。
しかしそれだと、静的型付けできない・・・。プログラマのジレンマ。


つづき
その3.解決策