2001-01-02  iやjの是非に終止符を

Brian W.Kernighan・Rob Pike著/福崎俊博訳:プログラミング作法,(アスキー)」に,iやjという変数名の是非に関する見解を見つけたので報告しておきます。iやjを絶対に許さない頭の固い人を説得する材料に使うとよいでしょう。

「p.20,第1章スタイル」 より引用

特定の場面で使われるローカル変数はごく短い名前でかまわない。ループインデックスのiとj、ポインタのpとq、文字列のsとtは非常によく使われるので、これより長い名前を使ってもあまりメリットはないし、おそらく無駄だろうと思う。

<中略>

文脈にかかわらず長い変数名を使うように言われることがよくあるが、それは間違いだ。

私はこの意見に概ね賛成です。同様に著者らは,(例えば点の集合の個数を格納する変数名は)“n”で十分だが,“npoints”が最善であり,“numberOfPoints”は過剰だといいます。私は日常的にどう記述するのかというと,著書らとほぼ同じです(文脈による使い分け)。ただし,読者の対象すなわち読む人の能力に合わせて使い分けることがあります。

(1)初心者向けの記述
for (int indexOfArray = 0; indexOfArray < 16; indexOfArray ++) {
	array[indexOfArray] = 0;
}

(2)教科書でよく見られる記法
for (int i = 0; i < array.length; i ++) {
	array[i] = 0;
}

(3)実践的な記法
for (int i = 0; i < array.length; array[i ++] = 0); // array の初期化(ゼロクリア) 

(1)から(3)は,いずれも配列を初期化するコードです。(1)は説明を過剰にした記法,(2)は標準的な記法,(3)は実践的な記法です。(1)は表現が回りくどいですが,「iやjは使い捨て変数である。iやjは局所的に使われるので,読み捨ててよい」という暗黙の了解を知らない人向けに使うことがあります。教育的な見地から言えば,初心者に短い変数名を使ったコードを見せない方がいいのです。なぜなら,短い変数名に慣れてしまうと,ふさわしい変数名(一般にこれは長い名前)を付ける能力が培われないからです。(3)はfor文の繰り返し式 (loop-expr) に,初期化コードを記述してしまう記法です。初期化処理が,“init”とか“initialize”という名前の手続き(関数ならびにメソッド)でまとめて処理されるのなら,このようにコードを圧縮しても可読性は損なわれないはずです。

というわけで,「最近の出来事 #1997-0622-01 iやkの原因は?」以来続いていた疑問はだいたい解消されました。