多重ループを抜ける
受託開発担当のRyuです。
このたび開発者blogを書かせてもらえることになりました。
このblogを書く面々の中では、今のところ一番の下っ端なので、下っ端ならではの視点で色々書いていけたらなと思います。
さて、今回は「多重ループを抜ける」です。
void loop() { boolean flag = false; for (...) { for (...) { if (条件) { (処理) flag = true; break; } } if (flag) break; } }
こんなコードをコーディングをしている方なら、一度は見たことがあるでしょう。
これでいいような気もしますが、flagという直接処理に関係のない変数が紛れ込んでいるのは、あまり綺麗とは言えません。
またループの数が増えるたびに「if (flag) break;」を記述しなければならないのも煩わしいです。
そこで行うのが関数化です。
上記コードを関数化すると以下のようになります。
void loop() { for (...) { if (subLoop()) { (処理) break; } } } boolean subLoop() { for (...) { if (条件) { return true; } } return false; }
これで邪魔なflag変数が消えました。
関数化には他にも様々な良否があります。
関数化のメリット
・余計なflag変数が減る
・カプセル化が進み、修正に強くなる
・ネストが減ることにより、可読性が向上する
関数化のデメリット
・関数呼び出し時のオーバヘッドにより、速度が低下する
・最適化により、コード量が増加する可能性がある
等が考えられます。
特殊なパフォーマンスを追及する環境でもない限り、メリットのほうが大きいでしょう。
また言語によっては、flagを使わず、GOTOやLabelなどを使用することで抜けることができます。
どうしても関数化をしたくない!関数化することによって被るデメリットが大きすぎる!等の場合は
これらを利用するのも手かもしれません。
- 2009/02/12 追記: 「続きを読む」タグを追加。