FlashLite ネストを少なくする対処
FlashLite1.0~1.1はFlash4ベースのためfunctionがありません。function代わりにcall関数を用いて特定処理を呼び出しに行きます。
フレームに直接記述されるスクリプトは勿論functionではないので、処理途中の特定条件の時 returnを用いて処理を終了する、といった事を行うことができません。その為、自然とif文のネストが深くなり とても見難いスクリプトになってきてしまうことがあります。
例えば、次のような多数functionを呼び出した関数があるとします。
function test(){ //func1の処理結果が偽ならば処理終了 if( func1() == false ){ return; } //func2の処理結果が偽ならば処理終了 if( func2() == false ){ return; } //func3の処理結果が偽ならば処理終了 if( func3() == false ){ return; } //全て条件を満たすため 以降処理を実行 ~ }
Flash4で上記スクリプトを記述する場合、プログラマとして失格の烙印を押されそうなif文のネストラッシュになってしまいます。
//func1を呼び出し 結果を変数reVar1に戻り値として設定 call( "func1" ); //reVar1が真なら実行 if( reVar1 == 1 ){ //func2を呼び出し 結果を変数reVar2に戻り値として設定 call( "func2" ); //reVar2が真なら実行 if( reVar2 == 1 ){ //func3を呼び出し 結果を変数reVar3に戻り値として設定 call( "func3" ); //reVar3が真なら実行 if( reVar3 == 1 ){ //以降処理を実行 ~ } } }
ここでピカンと閃いた苦肉の策、「while緊急脱出」を用いると以下のように記述することができます。
while(true){ //func1を呼び出し 結果を変数reVar1に戻り値として設定 call( "func1" ); //reVar1が偽ならループ脱出 if( reVar1 == 0 ){ break; } //func2を呼び出し 結果を変数reVar2に戻り値として設定 call( "func2" ); //reVar2が偽ならループ脱出 if( reVar2 == 0 ){ break; } //func3を呼び出し 結果を変数reVar3に戻り値として設定 call( "func3" ); //reVar3が偽ならループ脱出 if( reVar3 == 0 ){ break; } //以降処理を実行 ~ //終了後ループ脱出 break; }
whileブロックを擬似的にfunctionブロックとして用い、breakをreturnの代わりに用いてしまうことにより、ネストが深くなることを避けています。(こんな書き方してしまっていいのでしょうか。)