上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--|スポンサー広告||TOP↑
私はforeach文が大好きだ。

理由は複数あるのでまずは疑似言語で使う場合と使わない場合を書いてみよう。
疑似言語はC言語風の文法で書く。というかほぼJavaだけど。

配列として以下を宣言する。
int[10] data;

この配列に対してすべての要素に1を加算する。

for文の場合

for (int idx; idx < data.length; idx++)
    data[idx]++;

foreach文の場合

foreach (int elem : data)
    elem++;


両者を比較すると
・カウンタを4回書く必要のあるforと異なりforeachでは要素を半分の2回にできた。
・多重ループではカウンタに適当な変数名をつけるべきだが、○○カウンタと言う名称は冗長。foreachではたとえばテーブルに対してレコードという名称を与えられる。
・継続条件を書き間違える危険がない。
・配列の全要素に操作を行うということが元のループよりも直感的にわかる。
・より高速な動作が期待できる※1
となる。

※1の内容は少し補足したい。
なぜ高速になるのだろうか。
Javaをはじめと比較的新しい言語の多くが、配列のインデックスアクセスにおいてその範囲が長さを超えていないことをチェックする。しかしながらこれはループの中でインデックスが範囲に収まるようにプログラムを作成していれば本来不要である。ところが、ここにコード上の誤りにより範囲を超える余地のあるfor文ではチェック機能を外すことができない。
しかしながらforeach文であればインデックスアクセスをしない以上、範囲外を参照することはあり得ず、このようなチェック機能を省略可能である。
結果より高速に動作することが期待できる。
(むろん実際は注意深くコーディングされたCやC++と同等になるだけなのだが、しかし範囲外アクセスの危険がなくなったことを忘れてはいけない)

結論としては
foreach文を書ける言語なら積極的に使うべきである。
と言いたいところであるが、この言い回しは不適切である。多くの文書においてこのような表現を見つけるが根本的な誤りがある。

コレクション(配列など)の全要素を対象とする操作はすべてforeach文を使い、特別な事情のない限りfor文を使ってはならない。
としたい。
for文はgoto文のように特別な事情のない限り使用してはならない最後の手段である。
特にD言語やRubyあたりは、配列や整数の範囲オブジェクトを作成してそれを使ってforeach文をかけるのでfor文を使う機会は本当にない。
すなわち、
for文はもはや時代遅れである。

*2009/01/25追記
本文が説明不足なので補足するが、Rubyには実際にはforeach文はない。
ただし、ブロック付きメソッドのeachメソッドが使われるため、単に制御構造として定義されていないだけだが。また、単純な固定回数の繰り返しにはInteger#timesが使われる。ようするに、Rubyではブロック付きメソッドのおかげで文を追加しないでいろいろな機能を付け加えられると言うだけなんだが。
スポンサーサイト

01/21|プログラムコメント(0)トラックバック(0)TOP↑
この記事にコメント
名前:
コメントタイトル:
メールアドレス:
URL:
コメント:

パスワード:
管理人だけに表示:
管理者にだけ表示を許可
この記事にトラックバック
プロフィール

G.U.Nex

Author:G.U.Nex
職業:プログラマ
趣味:ゲーム(PC、コンシューマ)、ネットサーフィン、ニコニコ動画視聴、プログラミング、鉄道全般
PHP, C, C++, VB(系), Java, JavaScriptを使える。
最近はRubyにはまってる。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム
ブログ内検索
RSSフィード
リンク
フリーエリア
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。