Ads by Google

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AS3ではeval関数が使えない。



javaScript感覚でeval()が使えると思ったら、





【AS3ではeval()が使えない】



こんな記事が見つかった。



え〜。消す意味が分からないよ!



とびっくりした。



で、eval関数を使えるライブラリやら、JavaScriptを使用して使えるようにする方法などいろいろあったが、


どうやら以下のようにすることで、eval()と同じようなことができるようだ。

≪JavaScript≫

eval("cstColorSelect" + 1);


≪AS3≫

this["cstColorSelect" + "1"]




言語によって書き方変わるのはよくあることだけど、



肝心なことは統一してよ!




で、さっき作った5つのカラー配色できるFlashに、
色数によって選択できる【ColorSelect】を規制するように修正した。

ColorSelectに規制をかけるサンプル
規制をかける




で、なぜeval関数が使えないと嘆く羽目になるのかというと

【eval関数もどきをつかった関数】

[定数の値]
ConstColor.MIN_SELECT_NUM = 1
ConstColor.MAX_SELECT_NUM = 5
COLOR_SELECT_ID ="cstColorSelect"


// カラー数を引数に渡すとColorSelectに規制をかけてくれる
private function enableColorSelect(colorNum:uint):void
{
try {
Logger.debug("enableColorSelect:Start");

// カラー数によって選択できるColorSelectを規制する
//
// ※)カラー数以下 :規制をかけない
// カラー数より大きい:規制をかける
//
for (var i:int = ConstColor.MIN_SELECT_NUM;
i <= ConstColor.MAX_SELECT_NUM;
i++)
{
// カラー数によって規制をかける
if (i <= colorNum )
{
// カラー数以下:規制をかけない
this[COLOR_SELECT_ID + i.toString()].enabled = true;
} else {
// カラー数より大きい;規制をかける
this[COLOR_SELECT_ID + i.toString()].enabled = false;
}
}

Logger.debug("enableColorSelect:End");
} catch (e:Error)
{
throw(e);
}

}



【eval関数もどきが使えない場合】


// カラー数を引数に渡すとColorSelectに規制をかけてくれる
private function enableColorSelect(colorNum:uint):void
{
try {
Logger.debug("enableColorSelect:Start");

if (colorNum <= 5) {
cstColorSelect5.enabled = true;
} else {
cstColorSelect5.enabled = false;
}

if (colorNum <= 4) {
cstColorSelect4.enabled = true;
} else {
cstColorSelect4.enabled = false;
}

if (colorNum <= 3) {
cstColorSelect3.enabled = true;
} else {
cstColorSelect3.enabled = false;
}

if (colorNum <= 2) {
cstColorSelect2.enabled = true;
} else {
cstColorSelect2.enabled = false;
}

if (colorNum <= 1) {
cstColorSelect1.enabled = true;
} else {
cstColorSelect1.enabled = false;
}

Logger.debug("enableColorSelect:End");
} catch (e:Error)
{
throw(e);
}

}




eval関数もどきを使った場合と、使わなかった場合の大きな違いは、



【ColorSelect】の数が6つになった時にどうするの?


といったことに対応できるかどうかということだ、
eval関数もどきを使った場合は定数の値を変えるだけでいい
(ConstColor.MAX_SELECT_NUM = 6とする)


でも、使わなかった場合は

if (colorNum <= 6) {
cstColorSelect6.enabled = true;
} else {
cstColorSelect6.enabled = false;
}



と関数を変更しなくてはならない。
で、こんな変更が入るとコピペして

if (colorNum <= 6) {
cstColorSelect5.enabled = true;
} else {
cstColorSelect6.enabled = false;
}


と5個目の【ColorSelect】が変わるだけで、
一向に6個目が規制がかかった状態となってしまうような間違いを起こす。


極力関数を作成する場合は、中のロジックを変更することがないように作成しないと、
バグを連発する結果となるし、テストを再度行わなければならなくなる。


テクニックで何とかなる場合はできるだけシンプルにつくり、
必ず中で使用する数値や文字列は定数化しなければならない!



テーマ : Adobe Flex3
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

Author:GAN彩坊
FC2ブログへようこそ!

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード