2008年10月13日月曜日

スクリプトの話(8)〜「if」の場合

前回は字下げがスクリプトを見やすくするということを書きました。
ここでやっかいなのが「if」の処理の場合です。
何故かというと、「if」の場合はその後単純に「}」で終わることよりも、
「else if...else if...」つまりそうでない場合、というのが
いくつも続く場合があるからです。
だからこそ使い勝手のいい道具であるわけですが。。。

例えば、タッチすると色が変わるスクリプトを作っていて、
ダイアログで色名を選んだ後の処理をしているところを想定して、
前回の【例1】に忠実に書いていってみましょう。

【例1】
if (message == "yellow")
{
  llSetColor(<1.0, 1.0, 0.0>, ALL_SIDES);
}
else if (message == "red")
{
  llSetColor(<1.0, 0.0, 0.0>, ALL_SIDES);
}
else if (message == "blue")
{
  llSetColor(<0.0, 0.0, 1.0>, ALL_SIDES);
}

う〜ん、何とも間延びしたのと、
結局このif文、どこまで続いているのか
わかりにくくなってますね。
分岐もいくつあるのか。。。

そこで、ここでは【例2】の方法をとりながら、
その変形でいくのをお勧めします。
つまり、

if (message == "yellow") {
  llSetColor(<1.0, 1.0, 0.0>, ALL_SIDES);
} else if (message == "red") {
  llSetColor(<1.0, 0.0, 0.0>, ALL_SIDES);
} else if (message == "blue") {
  llSetColor(<0.0, 0.0, 1.0>, ALL_SIDES);
}

何と、「else if(elseの場合も同じ)」のキーワードを
前の条件の終わりの「}」の後に書くのです。
こうすると大元の「if」と条件の終わりの「}」が並び、
しかも、「}」の数をぱっと見ただけで
条件がいくつに分岐してるかわかるというものです。

私個人は一番間違えやすいのはこの「if」の分岐のところです。
複雑なものになってくるとすぐにたくさん分岐してしまい、
その途中で何かを書き漏らすということはしばしばです。
それを防ぐためにも上の書き方は有効です。
なので、個人的には結果として、【例2】の方法を
お勧めしたいところです。

さて、これに関連してもう一つ。
「do〜while文」の書き方についても説明しておきます。

繰り返しの処理をするのに「while文」というのと
「do〜while文」というのがあります。
似てますが、使い方も処理の結果も全然違うので
注意が必要です。

「while文」は簡単で、

while (繰り返し条件){
  繰り返す内容
}

という形で、繰り返し条件に当てはまれば
「{」〜「}」の処理を繰り返すことになります。
言い換えると、条件に当てはまらなければ
「while文」の処理は一度も実行されません。

対する「do〜while文」は、

do {
  繰り返す内容
} while (繰り返し条件)

という形をしていて、必ず一回処理をして、
処理が終わったら繰り返し条件を確認して、
当てはまったら繰り返し、
当てはまらなかったらこの文を抜けて次の処理へと進みます。

ここでも、【例1】の方法で、

do
{
  繰り返す内容
}
while (繰り返し条件)

と書いてもいいのですが、
そうすると「do」の終わりの「}」が「while」の前にあって、
あたかも「while」は別物、「while文」のはじまりのように
見えてしまします。

今見たように「while文」と「do〜while」文は
処理の内容が全然違うので、
この違いを際だたせるためにも、「do〜while文」の場合は
先に示したように、

do {
  繰り返す内容
} while (繰り返し条件)

とするのがよいのです。
これで「while」は「do」で始まる処理の
終わりの部分なんだよ、というのがはっきりしました。
「else if」の場合と似てますね。

それでは長くなりましたので、今回はこの辺で。

No response to “スクリプトの話(8)〜「if」の場合”

Leave a Reply