多重ループを抜ける

受託開発担当の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 追記: 「続きを読む」タグを追加。