49

単純な小さなループを作成している場合、カウンターに何という名前を付ける必要がありますか?

ループの例を提供してください!

4

28 に答える 28

42

単一レベルのループで、変数が「このループを通過した回数」以外の意味を持たない場合を除き、私は常に意味のある名前iを使用します。

意味のある名前を使用する場合:

  • あなたのコードを読んでいる同僚にとって、コードはより理解しやすいものです。
  • ループ ロジックのバグを見つけやすくなります。
  • 変数名をテキスト検索して、同じデータで動作する関連するコードを返す方が信頼性が高くなります。

例 - バグを見つける

この入れ子になったループで 1 文字を使用してバグを見つけるのは難しい場合があります。

int values[MAX_ROWS][MAX_COLS];

int sum_of_all_values()
{
    int i, j, total;

    total = 0;
    for (i = 0; i < MAX_COLS; i++)
        for (j = 0; j < MAX_ROWS; j++)
             total += values[i][j];
    return total;
}

一方、意味のある名前を使用すると簡単です。

int values[MAX_ROWS][MAX_COLS];

int sum_of_all_values()
{
    int row_num, col_num, total;

    total = 0;
    for (row_num = 0; row_num < MAX_COLS; row_num++)
        for (col_num = 0; col_num < MAX_ROWS; col_num++)
             total += values[row_num][col_num];
    return total;
}

なぜrow_numですか?- 拒否された代替案

他のいくつかの回答とコメントに応えて、これらは使用するためのいくつかの代替提案と、row_numそれらcol_numを使用しないことを選択した理由です。

  • rand : これはandcよりもわずかに優れています。私の組織の標準が、1 文字の変数が整数であり、常に同等の記述名の最初の文字である場合にのみ、それらの使用を検討します。関数内に "r" で始まる名前の変数が 2 つあると、システムが機能しなくなり、"r" で始まる他のオブジェクトがコードのどこかに現れても可読性が損なわれます。ij
  • rrand cc: これは私には奇妙に見えますが、2 文字のループ変数スタイルには慣れていません。それが私の組織の標準であれば、 や よりもわずかに優れていると思いrますc
  • rowand col: 一見するrow_numと、これは andよりも簡潔に見えますがcol_num、同様に説明的です。ただし、「行」や「列」などの裸の名詞は、構造体、オブジェクト、またはこれらへのポインターを指すと思います。行構造自体または行番号のいずれかrowを意味する場合、混乱が生じます。
  • iRowand iCol: これは追加情報を伝えます。これは、これiがループ カウンター while であることを意味し、RowColをカウントしているかを示すことができるためです。ただし、コードをほぼ英語で読めるようにしたいと考えています。
    • row_num < MAX_COLS最大未満です」と表示されます。
    • iRow < MAX_COLSせいぜい、「行の整数ループカウンター最大(数)未満です」と表示されます。
    • 個人的なことかもしれませんが、私は最初の読み方が好きです。

row_num私が受け入れる代替案はrow_idx次のとおりです。アプリケーションのドメインがデータベースエンジンの設計、金融市場などにない限り、「インデックス」という単語は一意に配列の位置を指します。

上記の私の例は私ができる限り小さく、そのため、関数全体を頭の中で一度に保持できるため、変数にわかりやすい名前を付ける意味がわからない人もいるかもしれません。ただし、実際のコードでは、関数が大きくなり、ロジックがより複雑になるため、読みやすくし、バグを回避するために適切な名前がより重要になります。

要約すると、(ループだけでなく) すべての変数の命名に関する私の目的は、完全に明確にすることです。誰かが私のコードの一部を読んで、変数の目的をすぐに理解できない場合、私は失敗しています

于 2008-09-19T11:38:33.513 に答える
38

1) 通常の古いスタイルの小さなループ (i、j、k) の場合 - 3 つ以上のレベルのネストされたループが必要な場合、これは、アルゴリズムが非常に特殊で複雑であるか、コードのリファクタリングを検討する必要があることを意味します。

Java の例:

for(int i = 0; i < ElementsList.size(); i++) {
  Element element = ElementsList.get(i);
  someProcessing(element);
  ....
}

2)新しいスタイルのJavaループのfor(Element element: ElementsList)場合、通常の意味のある名前を使用する方が良い

Java の例:

for(Element element: ElementsList) {
  someProcessing(element);
  ....
}

3)使用する言語で可能であれば、ループを変換してイテレータを使用します

Java イテレータの例:ここをクリック

于 2008-09-19T11:06:08.880 に答える
14

私の経験では、ほとんどの人が1文字を使用します。たとえば、、、、、 ...または、、、 iまたは 、 j( 行 /列の場合)または 、 ( 幅/高さの場合)などです。kxyrcwh

しかし、私はずっと前に素晴らしい代替案を学び、それ以来それを使用してきました: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は、探している変数ではないコードで頻繁に発生します。

于 2008-09-19T10:55:41.747 に答える
14

例: . . . Javaで


非反復ループ:


ネストされていないループ: . . . インデックスは値です。

. . . 代数で行うように、を使用 するのが最も一般的な方法です。. .i

for (int i = 0; i < LOOP_LENGTH; i++) {

    // LOOP_BODY
}


ネストされたループ: . . . 指標の微分は理解に役立ちます。

. . . 説明的なサフィックスを使用します。. .

for (int iRow = 0; iRow < ROWS; iRow++) {

    for (int iColumn = 0; iColumn < COLUMNS; iColumn++) {

        // LOOP_BODY
    }
}


foreachループ: . . . 名前がObject必要です。

. . . わかりやすい名前を使用します。. .

for (Object something : somethings) {

    // LOOP_BODY
}


反復ループ:


forループ: . . . イテレータはオブジェクトを参照します。どちらでもないイテレータ。インデックスでも、インデックスでもありません。

. . . iter Iterators の目的を省略します。. .

for (Iterator iter = collection.iterator(); iter.hasNext(); /* N/A */) {

    Object object = iter.next();

    // LOOP_BODY
}


whileループ: . . . Iterator のスコープを制限します。

. . . ループの目的についてコメントします。. .

/* LOOP_DESCRIPTION */ {

    Iterator iter = collection.iterator();

    while (iter.hasNext()) {

        // LOOP_BODY
    }
}

この最後の例は、コメントなしでは読みにくいため、コメントを奨励しています。 おそらく冗長ですが、C のスコープ制限ループで役立ちます。

于 2008-09-19T13:00:13.590 に答える
9

常に、変数に意味のあるコンテキスト内の名前を付けるようにしてください。

決定できない場合は、「インデックス」を使用します。これは、他の誰か(おそらくあなた!)が後でリファクタリングするために簡単にクリックできるようにするためだけです。

ポールスティーブンソン例については、この回答を参照してください。

于 2008-09-19T10:59:51.110 に答える
7

ijk (または行と列のループにはr & c )を使用します。メソッドに3 つ以上のループ変数が必要な場合、そのメソッドはおそらく長すぎて複雑なので、メソッドを複数のメソッドに分割し適切な名前を付けるとコードが改善される可能性があります。

于 2008-09-20T17:22:34.980 に答える
6

i

ネストされたループがある場合もj

この規則は非常に一般的であるため、コード ブロック内の変数に出くわした場合でも、変数iの始まりがわからない場合でも、それが何であるかをすぐに認識できます。

于 2008-09-19T11:05:12.097 に答える
5

I use i, ii, iii, iv, v ... Never got higher than iii, though.

于 2008-09-19T23:19:46.580 に答える
4

ループカウンターがインデックスである場合にのみ、1文字を使用します。私は二重文字の背後にある考え方が好きですが、それはコードをかなり読みにくくします。

于 2008-09-19T11:00:31.763 に答える
3

カウンターをコンテナーへのインデックスとして使用する場合は、 , を使用ijますk

範囲を反復する (または設定された反復回数を実行する) ために使用する場合、私はよく を使用しますniただし、ネストが必要な場合は、通常は, j, に戻りますk

foreachスタイルの構成を提供する言語では、通常、次のように記述します。

foreach widget in widgets do
  foo(widget)
end

widgetに似たネーミングだと嫌われる方もいるwidgetsと思いますが、かなり読みやすいと思います。

于 2008-09-19T11:34:25.367 に答える
2

以前のポスターのように、私も ii、jj、.. を使用します。これは主に、多くのフォントで 1 つの i が 1 に非常に似ているためです。

于 2008-09-19T11:25:01.380 に答える
2

私は長い間、i/j/k 命名スキームを使用してきました。しかし最近、より結果的な命名方法を採用し始めました。

すべての変数にその意味で名前を付けたので、同じ決定論的な方法でループ変数に名前を付けてみませんか。

リクエストに応じて、いくつかの例を示します。

アイテム コレクションをループする必要がある場合。

for (int currentItemIndex = 0; currentItemIndex < list.Length; currentItemIndex++)
{
    ...
}

しかし、リスト内の実際の位置ではなく、リスト内の実際のアイテムが必要であり、それを使用する傾向があるため、通常の for ループを回避しようとします。したがって、 for ブロックを次のように開始する代わりに:

Item currentItem = list[currentItemIndex];

言語の foreach コンストラクトを使用しようとしています。を変換します。

for (int currentItemIndex = 0; currentItemIndex < list.Length; currentItemIndex++)
{
    Item currentItem = list[currentItemIndex];
    ...
}

の中へ

foreach (Item currentItem in list)
{
   ...
}

コードの本当の意味のみが表現され (リスト内のアイテムを処理する)、アイテムを処理したい方法 (現在のアイテムのインデックスを保持し、長さに達するまで増加させる) が表現されるため、読みやすくなります。リストの最後であり、それによってアイテム コレクションの終わりを意味します)。

私がまだ 1 文字の変数を使用しているのは、ディメンションをループするときだけです。ただし、x、y、および場合によっては z を使用します。

于 2008-09-19T13:00:05.697 に答える
1

変数名として「counter」または「loop」を使用します。最近の IDE では通常、単語の補完が行われるため、長い変数名を使用するのは面倒ではありません。さらに、変数にその機能に応じた名前を付けると、コードを保守するプログラマーに対して、意図が何であったかが明確になります。

于 2008-09-19T11:37:30.507 に答える
1

私も二文字表記を採用しています。ii、jj、kk。それらをgrepすることができ、不要な一致の束を思いつくことはありません.

2 重になっていても、これらの文字を使用するのが最善の方法だと思います。倍増しても、それはおなじみの慣習です。

慣習に固執することについては、言いたいことがたくさんあります。それは物事をより読みやすくします。

于 2008-09-27T01:55:25.497 に答える
1

最初のルールは、変数名の長さが変数のスコープと一致する必要があるということです。2 つ目のルールは、意味のある名前はバグを浅くするということです。3 つ目のルールは、変数名にコメントを追加したい場合は、間違った変数名を選択したということです。最終的なルールは、以前のルールに反しない限り、チームメイトと同じように行うことです。

于 2008-09-20T00:21:15.183 に答える
1

どちらを選択する場合でも、同じ意味を持つコードでは一貫して同じインデックスを使用してください。たとえば、配列をウォークスルーするには、 、 、 、何でも使用できますがijj常にkappaどこでも同じ方法で行います。

for (i = 0; i < count; i++) ...

ベスト プラクティスは、ループのこの部分がコード全体で同じように見えるようにすることです (一貫しcountて制限として使用することを含む)。これにより、コードの本質に集中するために精神的にスキップできるイディオムになります。ループ本体。

同様に、たとえば、ピクセルの 2 次元配列をウォークスルーしている場合は、次のように記述できます。

for (y = 0; y < height; y++)
  for (x = 0; x < width; x++)
    ...

このタイプのループを記述するすべての場所で、同じ方法で実行してください。

読者が退屈な設定を無視して、実際のループで行っていることの素晴らしさを確認できるようにしたいと考えています。

于 2008-09-22T14:22:03.027 に答える
1

@ジャストマイク。. . いくつかの C の例: . . . Javaのものに同行します。

ネストされていないループ: . . . 可能な限り範囲を制限する

/*LOOP_DESCRIPTION*/ {

    int i;

    for (i = 0; i < LOOP_LENGTH; i++) {

        // loop body
    }  
}


ネストされたループ: . . . 同上

/*LOOP_DESCRIPTION*/ {

    int row, column;

    for (row = 0; row < ROWS; row++) {

        for (column = 0; column < COLUMNS; column++) {

            // loop body
        }
    }  
}

このレイアウトの良い点の 1 つは、コメントがないと読みにくいことです。
冗長かもしれませんが、個人的にはこれが C でのループのやり方です。

また、最初は "index" と "idx" を使用していましたが、これは通常、仲間によって "i" に変更されました。

于 2008-09-19T22:14:18.390 に答える
1

Perl 標準

Perl では、内部ループの標準変数名は$_です。forforeach、およびwhileステートメントはデフォルトでこの変数に設定されるため、宣言する必要はありません。通常、$_は中性総称代名詞「it」のように読むことができます。したがって、かなり標準的なループは次のようになります。

foreach (@item){
    $item_count{$_}++;
}

英語では、次のように翻訳されます。

アイテムごとに、item_count をインクリメントします。

ただし、さらに一般的なのは、変数をまったく使用しないことです。多くの Perl 関数と演算子のデフォルトは$_です:

for (@item){
    print;
}

英語で:

[各]項目について、[それ]を印刷します。

これもカウンターの定番です。(しかし、カウンターは、C などの他の言語よりも Perl で使用される頻度がはるかに低くなります)。したがって、1 から 100 までの整数の 2 乗を出力するには、次のようにします。

for (1..100){
    print "$_*$_\n";
}

$_変数を使用できるループは 1 つだけなので、通常は最も内側のループで使用されます。この用法は、英語の通常の動作と一致します。

車ごとに、各タイヤを見て、圧力を確認します。

パールでは:

foreach $car (@cars){
    for (@{$car->{tires}}){
        check_pressure($_);
    }
}

上記のように、外側のループではより長くわかりやすい名前を使用することをお勧めします。これは、コードの長いブロックでは、一般的なループ変数名が実際に何を意味するのかを覚えるのが難しい場合があるためです。

場合によっては、 $_または説明的な名前ではなく、$i$j$kなどの短くて説明的でない一般的な名前を使用する方が理にかなっています。たとえば、cross productなどの公開されたアルゴリズムで使用される変数を一致させると便利です。

于 2008-09-19T19:13:11.790 に答える
1

Steve McConnell のCode Completeには、いつものように、この点に関して優れたアドバイスがあります。関連するページ (とにかく初版) は 340 と 341 です。ループ コーディングの改善に関心のある人には、これを見てください。McConnell は意味のあるループ カウンターの名前を推奨していますが、人々は私の弱い要約に頼るのではなく、彼が言わなければならないことを自分で読むべきです。

于 2008-09-24T13:26:25.263 に答える
0

ハンガリー語と混合したコンテキスト関連のループ変数名を使い始めました。

行をループするときは、を使用しますiRow。列をループするときは、を使用しますiCol。車をループするときは、を使用しますiCar。あなたはその考えを理解します。

于 2008-09-20T17:59:45.827 に答える
0

数値計算、MATLABなどの場合は、i、jを使用しないでください

これらは予約済みの定数ですが、matlabは文句を言いません。

私の個人的なお気に入りは

最初のインデックス、2番目のカウンターカウント

于 2008-09-20T18:14:02.673 に答える
0

私はphpでperlismsを使い始めました。

それが単一の反復である場合、$_その使用法を知っている人にとっては良い名前です。

于 2008-09-19T11:00:50.093 に答える
0

整数の場合は、int インデックスを使用します。ネストされていない限り、int groupIndex や int userIndex のように反復されるものに対して Index サフィックスを使用します。

于 2008-09-27T02:08:01.257 に答える
0

行列のようなセットをループするための私のお気に入りの規則は、デカルト座標で使用される x+y を使用することです。

for x in width:
    for y in height:
        do_something_interesting(x,y)
于 2008-09-20T21:12:37.533 に答える
0

Python では、時間を数えるだけなら i、j、k を使用します。反復回数がインデックスとして使用されている場合は、x、y、および z を使用します。ただし、実際に一連の引数を生成する場合は、意味のある名前を使用します。

于 2008-11-26T14:04:53.403 に答える
0

私の習慣は 't' を使うことです - 'r' に近いので、'for' を入力した後に簡単に続きます

于 2008-09-19T11:04:56.293 に答える
0

単純なカウンターの場合は、「i」を使用することに固執します。それ以外の場合は、コンテキストを示す名前を付けます。私は可変長を 4 に保つ傾向があります。これは主にコード読み取りの観点からのもので、オートコンプリート機能があるため、書き込みはカウントされません。

于 2008-09-19T12:33:34.527 に答える
0

私は通常使用します:

for(lcObject = 0; lcObject < Collection.length(); lcObject++)
{
   //do stuff
}
于 2008-09-25T02:55:55.597 に答える