i という名前の変数は受け入れられませんか?[閉まっている]
-
02-07-2019 - |
質問
変数の命名規則に関する限り、イテレータには名前を付ける必要があります i
またはもっと意味的なもの count
?使用しない場合 i
, 、 なぜだめですか?そう感じたら i
は許容されますが、反復の中で使用すべきではないケースはありますか?
解決
文脈によると思います。いくつかのコレクションで一連のオブジェクトをループする場合、それはあなたがしていることから、コンテキストからかなり明白であるはずです。
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;
}
}
他のヒント
"私" 手段 プログラマーにとっては「ループカウンター」。何も問題ありません。
完全に問題ないものの別の例を次に示します。
foreach (Product p in ProductList)
{
// Do something with p
}
私は非常に局所的なループ (ソース行数の点で短期間のみ存在する) に i、j、k を使用する傾向があります。より大きなソース領域に存在する変数の場合は、コードを遡って検索しなくてもその変数が何のためのものであるかを確認できるように、より詳細な名前を使用する傾向があります。
ところで、これらの命名規則は、私が最初の整数変数 (A ~ H は浮動小数点でした) だった初期の Fortran 言語から来ていると思います。
i
確かに受け入れられます。しかし、私はある学期、すべての変数に説明的な名前がついていないコードを拒否した C++ の先生から膨大な量のことを学びました。すべてにわかりやすい名前を付けるという単純な行為によって、自分のコードについてより真剣に考えるようになり、そのコースの後は、C++ の学習ではなく、すべてに名前を付けることを学ぶことで、より良いプログラムを書くことができました。 コードの完成 同じトピックに関していくつかの良い言葉があります。
私 は問題ありませんが、次のようなものは不適切です。
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 は非常に一般的なので、記述的な変数名が好きな人でも受け入れられます。
絶対に受け入れられないこと (そして私の本では罪) は、ループ内の整数インデックスとして以外のコンテキストで i、j、または k を使用することです。例えば
foreach(Input i in inputs)
{
Process(i);
}
私は間違いなく受け入れられます。どのような正当化をする必要があるのかわかりませんが、私は常にこれを使用していますし、他の非常に尊敬されているプログラマーも同様に使用しています。
社会的な検証、だと思います:)
はい、実際、コードを読むプログラマはそれが単なる反復子であることを理解するため、これが推奨されます。
より具体的な変数名の代わりに i を使用するメリットは何でしょうか?1 秒、10 秒、あるいは 30 秒でも考えて入力する時間を節約するには?
i の使用料金はいくらですか?もしかしたら何もないかもしれない。おそらくコードは非常に単純なので、 i を使用しても問題ありません。しかし、多分、たぶん、私は将来このコードに来る開発者を強制します。彼らは考えなければなりません:「それはインデックス、カウント、オフセット、旗ですか?」彼らは考えなければなりません:「この変更は安全ですか、正しいですか、1 ずれますか?」
i を使用すると、コードを作成する際の時間と知的労力が節約されますが、将来的にはより多くの知的労力が費やされる可能性があり、場合によってはコードの誤解により不注意で欠陥が発生する可能性もあります。
一般的に、ソフトウェア開発のほとんどは保守と拡張であるため、コードを読むのに費やされる時間は、コードを書くのに費やされる時間の時間を大幅に上回ります。
あらゆる場所で意味のある名前を使用する習慣を身につけるのは非常に簡単で、一度その習慣が身につくと、意味のある名前のコードを書くのに数秒しかかかりませんが、読みやすく、理解しやすいなどのコードが完成します。明らかに正しい。
短いループには i を使用します。
それがOKである理由は、誰かがイニシャライザを伴うイテレータ型の宣言を見て、その3行後に変数が何を表しているかが明確ではないと主張するということは、まったく信じられないことだと思うからです。彼らは「意味のある変数名」は「長い変数名」を意味するに違いないと判断しているため、そのふりをしているだけです。
実際にそうする理由は、当面の特定のタスクとは無関係で、狭い範囲でのみ使用するものを使用すると、誤解を招く名前や曖昧な名前を使用するのではないかという心配がなくなるからです。いつか、もっと広い範囲で何かに役立つでしょう。「q」や「count」ではなく「i」である理由は、数学から借用した単なる慣例です。
次の場合には i を使用しません。
- ループ本体が小さくないか、
- イテレータは、範囲の開始からループの終了まで前進 (または後退) 以外のことを行います。
増分が一貫していて明確である限り、必ずしも 1 ずつ増分する必要はありません。もちろん、反復回数の終了前に停止する可能性もありますが、方向が変わる場合、またはループの反復によって変更されない場合は、 (順方向ループでの iterator.insertAfter() の悪魔的な使用を含む)、私は別のものを使用することを忘れないようにしています。これは、「これは単なる単純なループ変数ではないため、これは単純なループではない可能性がある」ことを示します。
「より意味的なもの」が「反復子」である場合、i を使用しない理由はありません。それはよく理解された慣用句です。
for ループの状況では完全に許容できると思います。私はこれがかなり標準的であるといつも思っており、この例で i が使用されるときに解釈の問題に実際に遭遇することはありません。foreach-loopは少し複雑になり、実際には状況に依存すると思います。このような場合、 i はあまりにも説明的ではないので、foreach では i を使用することはめったになく、for ループでのみ使用します。foreach では、ループされるオブジェクト タイプの省略形を使用しようとします。例えば:
foreach(DataRow dr in datatable.Rows)
{
//do stuff to/with datarow dr here
}
とにかく、私の 0.02 ドルだけです。
ループ内容を説明する名前を付けると役立ちます。ただし、通常は i だけを使用します。
i をループのカウントに使用しているか、0 (PL に応じて 1) から n までのインデックスの一部を使用している限り、i は問題ないと思います。
それ以外の場合は、単なるインデックスではなく、意味のある名前を付けるのが簡単でしょう。
i と j も行列インデックスの数学的表記法であることを指摘しておきます。そして通常は、配列をループします。したがって、それは理にかなっています。
単純なループ内で一時的に使用している限り、何をしているのかは明らかです。そうは言っても、代わりに使える短い単語はありませんか?
i
はループ反復子として広く知られているため、ループの外で使用すると、実際にはメンテナンス プログラマを混乱させる可能性が高くなりますが、より説明的なもの (たとえば、 filecounter
)、コードがより良くなります。
場合によります。特定のデータセットを反復処理する場合は、わかりやすい名前を使用する方が合理的だと思います。(例えば。 filecounter
ダンが提案したように)。
ただし、任意のループを実行している場合は、 i
許容されます。ある仕事仲間が私にこう説明してくれました。 i
は、「この変数は、 for
ループ構造。そうでない場合は使用しないでください i
"
INTEGER ループ カウンターに i、j、k が使用されたのは、FORTRAN の初期の時代に遡ります。
個人的には、INTEGER カウントである限り、問題はありません。
しかし、私は FORTRAN で育ちました。
私の気持ちは、 コンセプト 「単純な」ループには 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 は反復子として理解される」という群衆にとってはそれが真実かもしれませんが、私にとってそれは「変数 Y に値 5 を代入してください」のようなコメントと同等です。コメントのような変数名は、「方法」ではなく、「理由」と「内容」を説明する必要があります。
前の回答の例を使用するには、次のようにします。
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 の名前もかなりひどいものです。