変数の命名規則に関する限り、イテレータには名前を付ける必要がありますか、i
それとももっとセマンティックな名前を付ける必要がありますcount
か?使わないのならi
、どうして?それが許容できると感じたi
場合、それを使用すべきではない反復のケースはありますか?
21 に答える
私が推測する文脈に依存します。あるコレクション内の一連のオブジェクトをループしている場合、何をしているのかはコンテキストからかなり明白なはずです。
for(int i = 0; i < 10; i++)
{
// i is well known here to be the index
objectCollection[i].SomeProperty = someValue;
}
ただし、コンテキストから何を行っているかがすぐにわからない場合、またはインデックスに変更を加えている場合は、使用法をより示す変数名を使用する必要があります。
for(int currentRow = 0; currentRow < numRows; currentRow++)
{
for(int currentCol = 0; currentCol < numCols; currentCol++)
{
someTable[currentRow][currentCol] = someValue;
}
}
「i」はプログラマーにとって「ループカウンター」を意味します。何も問題はありません。
完全に問題ない別の例を次に示します。
foreach (Product p in ProductList)
{
// Do something with p
}
私は、非常に局所化されたループに i、j、k を使用する傾向があります (ソース行の数に関しては、短期間しか存在しません)。より大きなソース領域に存在する変数については、より詳細な名前を使用する傾向があるため、コードをさかのぼって検索しなくても変数の目的を確認できます。
ところで、これらの命名規則は、最初の整数変数 (A ~ H は浮動小数点数) であった初期の Fortran 言語から来たと思いますか?
私は非常に一般的であるため、説明的な変数名を愛する人々にとっても受け入れられます。
絶対に受け入れられないこと(そして私の本では罪)は、ループ内の整数インデックスとして以外のコンテキストでi、j、またはkを使用することです。
foreach(Input i in inputs)
{
Process(i);
}
i
確かに受け入れられます。しかし、私は 1 学期間、私が担当していた C++ の教師から膨大な量のことを学びました。教師は、すべての変数にわかりやすい名前を付けていないコードを拒否しました。すべてのものにわかりやすい名前を付けるという単純な行為によって、自分のコードについてより真剣に考えるようになり、そのコースの後、C++ を学ぶことからではなく、すべてのものに名前を付けることを学ぶことによって、より良いプログラムを書きました。Code Completeには、これと同じトピックに関する良い言葉がいくつかあります。
私は大丈夫ですが、このようなものではありません:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
string s = datarow[i][j].ToString(); // or worse
}
}
プログラマーがコード内の i と j を誤って入れ替えてしまうことは非常によくあることです。特に、視力が悪い場合や、Windows のテーマが「ホットドッグ」である場合はそうです。これは私にとって常に「コードのにおい」です。これが台無しにならないのはまれです。
私は間違いなく受け入れられます。どのような正当化を行う必要があるのかわかりませんが、私は常にそれを使用しており、他の非常に尊敬されているプログラマーも同様に使用しています。
社会的検証、私は推測します:)
はい、実際、コードを読んでいるプログラマーなら誰でも、それが単なるイテレーターであることを理解するので、それが好まれます。
より具体的な変数名の代わりに i を使用する価値は何ですか? 1 秒または 10 秒、あるいは 30 秒も考えて入力する時間を節約するには?
i の使用料金はいくらですか? たぶん何もない。たぶん、コードはとても単純なので i を使っても問題ありません。しかし、おそらく、i を使用すると、将来このコードにたどり着く開発者は、「ここで私が何を意味するのか?」と考えなければならなくなるでしょう。「それはインデックスですか、カウントですか、オフセットですか、フラグですか?」と考える必要があります。彼らは、「この変更は安全か、正しいか、1 ずれるか」と考える必要があります。
i を使用すると、コードを記述する際の時間と知的労力を節約できますが、将来的にはより多くの知的労力が費やされたり、コードの誤解による不注意による欠陥の導入につながる可能性さえあります。
一般的に言えば、ほとんどのソフトウェア開発は保守と拡張であるため、コードの読み取りに費やされる時間は、コードの記述に費やされる時間よりもはるかに多くなります。
あらゆる場所で意味のある名前を使用する習慣を身につけるのは非常に簡単です。その習慣が身に付くと、意味のある名前を使用してコードを記述するのに数秒かかるだけで済みますが、読みやすく理解しやすいコードが得られます。明らかに正しい。
短いループには i を使用します。
それが問題ない理由は、誰かがイニシャライザを使用したイテレータ型の宣言を見て、その後 3 行で、変数が何を表しているかが明確ではないと主張するというのは、まったく信じがたいことだと思うからです。「意味のある変数名」は「長い変数名」を意味する必要があると判断したため、彼らはふりをしているだけです。
私が実際にそうする理由は、目の前の特定のタスクに関係のないものを使用し、小さなスコープでのみ使用することで、誤解を招く名前、あいまいな名前、またはいつの日か、より大きな範囲の何かに役立つでしょう。「q」や「count」ではなく「i」である理由は、数学から借用した慣習です。
次の場合は i を使用しません。
- ループ本体が小さくない、または
- イテレータは、範囲の開始からループの終了まで、前進 (または後退) 以外のことを行います。
i は、インクリメントが一貫して明確である限り、必ずしも 1 ずつインクリメントする必要はありません。もちろん、イテランドの終了前に停止する可能性がありますが、方向が変わるか、ループの反復によって変更されない場合(前方ループでの iterator.insertAfter() の悪魔的な使用を含む)、私は何か違うものを使用することを忘れないようにしています。これは、「これは単純なループ変数ではないため、単純なループではない可能性がある」ことを示しています。
「よりセマンティックなもの」が「イテレータ」である場合、i を使用しない理由はありません。よくわかるイディオムです。
for ループの状況では、i は完全に受け入れられると思います。私はこれが非常に標準的であり、このインスタンスで使用されたときに実際に解釈の問題に遭遇することは決してないことを常に発見しました. foreach-loops は少しトリッキーになりますが、実際には状況に依存すると思います。i が foreach で使用されることはめったになく、for ループでのみ使用されます。foreach では、ループするオブジェクト タイプの省略形を使用しようとしています。例えば:
foreach(DataRow dr in datatable.Rows)
{
//do stuff to/with datarow dr here
}
とにかく、私の 0.02 ドルだけです。
「単純な」ループでは、1文字を使用するという概念は問題ないと思いますが、ずっと前に2文字を使用することを学び、うまくいきました。
私は先週同様の質問をしました、そして以下は私自身の答えの一部です:
// recommended style ● // "typical" single-letter style
●
for (ii=0; ii<10; ++ii) { ● for (i=0; i<10; ++i) {
for (jj=0; jj<10; ++jj) { ● for (j=0; j<10; ++j) {
mm[ii][jj] = ii * jj; ● m[i][j] = i * j;
} ● }
} ● }
利点がすぐにはわからない場合:コードを検索して1文字を検索すると、探しているものとは異なる多くのものが見つかります。この文字i
は、探している変数ではないコードで頻繁に発生します。
私は少なくとも10年間この方法でそれをやっています。
上記のいずれか/両方が「醜い」と多くの人がコメントしていることに注意してください...
ループしているものを説明する名前を付けると役立ちます。しかし、私は通常、iを使用します。
i を使用してループをカウントするか、0 (または PL によっては 1) から n までのインデックスの一部を使用している限り、i は問題ないと思います。
それ以外の場合は、単なるインデックス以上の意味のある名前を付けるのはおそらく簡単です。
i と j も行列インデックスの数学表記であることを指摘しておく必要があります。そして通常、配列をループしています。それは理にかなっています。
単純なループ内で一時的に使用していて、何をしているのかが明らかである限り、確かに. そうは言っても、代わりに使用できる短い言葉は他にありませんか?
i
はループ イテレータとして広く知られているため、実際にはループの外で使用するとメンテナンス プログラマを混乱させる可能性が高くなりますが、より記述的なもの ( などfilecounter
) を使用すると、コードがより適切になります。
場合によります。特定のデータセットを繰り返し処理している場合は、わかりやすい名前を使用する方が理にかなっていると思います。(例えばfilecounter
、ダンが提案したように)。
ただし、任意のループを実行している場合i
は許容されます。ある同僚が私に説明したように、i
これは「この変数はfor
ループ構成によってのみ変更されることを意味する慣例です。そうでない場合は、使用しないでくださいi
」
INTEGER ループ カウンターの i、j、k の使用は、FORTRAN の初期の時代にさかのぼります。
個人的には、INTEGER カウントである限り、問題はありません。
しかしその後、私は FORTRAN で育ちました!
私は穀物に反対し、ノーと言うつもりです。
「iはイテレータとして理解されている」と言う群衆にとって、それは本当かもしれませんが、私にとっては、「値5を変数Yに割り当てます。コメントのような変数名は、理由/そうでないものを説明する必要があります。どうやって。
前の回答の例を使用するには:
for(int i = 0; i < 10; i++)
{
// i is well known here to be the index
objectCollection[i].SomeProperty = someValue;
}
そのような意味のある名前を使用するのはそれほど難しいですか?
for(int objectCollectionIndex = 0; objectCollectionIndex < 10; objectCollectionIndex ++)
{
objectCollection[objectCollectionIndex].SomeProperty = someValue;
}
付与された(借用された)変数名objectCollectionもかなりひどい名前です。