もちろん、かけますが、二重ループは、可読性を下げると思います。
可読性の高いコードをかくためには、二重ループのネストしているループを別メソッドにわけ、そのメソッド名にループの目的にそったメソッド名をつけ、外だししたメソッドの戻り値に、そのループで欲しかった値を戻せば、二重ループでも可読性を下げないと思います。
職場で、話題になりましたが、結構みんな二重ループを多用してました。
皆さんは、二重ループつかってますか?
可読性を下げないために、二重ループを私みたいにつかわない人はいますか?
書くか、書かないか、だけを問われれば、「書く」と答えます。
二重ループを書くかどうか、というのは、結果であって、そもそものところは、
メソッドの振る舞いを決まるときに、ループを意識させるかどうか、なのだと思います。
言い換えれば、クラス設計に、どれだけ心血を注いでいるかの、結果だと。
二重ループが適切なのかどうかは、内側のループだけに着目すれば良いと思います。
というか、そのループは必要なのか、という観点です。
例えば、極端な例として、複数のものからひとつを見つけて、何かをする場合。
List list = target.getList(...); Iterator i = list.iterator(); while (i.hasNext()) { Item item = i.next(); if (item ...) { ... break; } }
なのか、
Item item = target.findItem(...); if (list != null) { ... }
なのか。
target が複数あると、最初に書いた方は、二重ループになっちゃいますよね。
じゃあ、二重ループは駄目なのか、って話ですけど、探索方向が一次元に収まらなければ、多重ループになるのは必然です。
例えば、画像のビットマップがあって、特定のピクセルを探して処理するような場合には、横と縦の二重ループになるのは、当然ですよね。
for (y = 0; y < image.sizeY() ; ++y) { for (x = 0; x < image.sizeX() ; ++x) { ... } } }
教条的に、二重ループを嫌って、横方向の1ラインの探索を、別のメソッドに隠蔽するのは、ちょっとやり過ぎな感じがします。
for (y = 0; y < image.sizeY() ; ++y) { image.searchLine(...); } }
コメント(1件)
例えば、次のような3重ループがあったとしましょう。
for (int x = 0; x < MAX_X; ++x) {
for (int y = 0; y < MAX_Y; ++y) {
for (int z = 9; z < MAX_Z; ++z) {
何か
}
}
}
ここの何かが
volume[x][y][z] = 0;
みたいなものなら、これを関数に分ける方が読みにくいでしょう。
また、メモリの連続アクセスとかを意識するときには、このままの方が分かりやすいかと思います。
かといって、この何かが数十行に及ぶ処理であれば、ループを減らすか、何かを関数にまとめるなりしないと読みに行くいと思います。
2重ループが絶対悪だとは思わずに、読みやすいか、読みにくいかで判断される方がよいかなと。
知り合いにネストは絶対に嫌って人がいるのも事実ですが。