web-dev-qa-db-ja.com

ループ変数の理想的な変数命名規則は何ですか?

simple小さなループを書いている場合、どのshouldカウンターに名前を付けますか?

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

42
just mike

私は常に意味のある名前を使用します。ただし、それが単一レベルのループであり、変数が「このループを通過した回数」以外の意味を持たない場合は、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_numcol_numを使用するためのいくつかの代替案と、それらを使用しないことを選択した理由です。

  • rおよびc:これはiおよびjよりもわずかに優れています。私の組織の標準が1文字の変数を整数であり、常に同等の説明名の最初の文字である場合にのみ、それらの使用を検討します。名前が「r」で始まる関数に2つの変数があるとシステムがダウンし、「r」で始まる他のオブジェクトがコードのどこかに表示されても読みやすさが低下します。
  • rrおよびcc:これは私には奇妙に見えますが、2文字のループ変数スタイルには慣れていません。それが私の組織の標準だったとしたら、rcよりも少し良いと思います。
  • rowおよびcol:一見すると、これはrow_numおよびcol_numよりも簡潔に見えますが、説明として。ただし、「行」や「列」などの裸名詞は、構造、オブジェクト、またはこれらへのポインターを指すと思います。 rowどちらか行構造自体、または行番号を意味する場合、混乱が生じます。
  • iRowおよびiColiは、RowColは、何をカウントしているかを示します。しかし、私はほとんど英語でコードを読むことができることを好みます:
    • row_num < MAX_COLSは「行番号 berは未満最大最大(数) =ええとs";
    • iRow < MAX_COLSは、せいぜい「整数ループカウンター for row is less thanmax imum(数)col umns"。
    • 個人的なことかもしれませんが、私は最初の読書を好みます。

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

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

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

40
Paul Stephenson

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イテレータの例: ここをクリック

35
m_pGladiator

例:。 。 。 Javaの場合


非反復ループ:


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

。 。 。 usingi代数の場合と同様に、最も一般的な方法です。 。 。

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 Loops:。 。 。 Objectには名前が必要です。

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

for (Object something : somethings) {

    // LOOP_BODY
}


反復ループ:


for Loops:。 。 。イテレータはオブジェクトを参照します。イテレータでもありません。インデックスでも、インデックスでもありません。

。 。 。 iterはイテレータの目的を省略します。 。 。

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

    Object object = iter.next();

    // LOOP_BODY
}


while Loops:。 。 。イテレータの範囲を制限します。

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

/* LOOP_DESCRIPTION */ {

    Iterator iter = collection.iterator();

    while (iter.hasNext()) {

        // LOOP_BODY
    }
}

この最後の例はコメントなしでひどく読み、それによってそれらを奨励します。それはおそらく冗長ですが、 C。

12
Ande TURNER

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

しかし、私はずっと前に素晴らしい代替案を学び、それ以来それを使用してきました:二重文字変数。

// 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は、探している変数ではないコードで頻繁に発生します。

12
just mike

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

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

Paul Stephenson 例については、この回答を参照してください。

9
Nescio

ijk(またはrc for row-列ループ)。 メソッドに3つ以上のループ変数が必要な場合、メソッドはおそらく長すぎて複雑であり、コードはおそらくメソッドを分割することのメリットより多くのメソッドに命名それら適切に

6
petr k.

私はi、ii、iii、iv、vを使用しています...しかし、iiiより高くなることはありません。

5
Oddmund

i

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

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

5
AnthonyWJones

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

4
Vaibhav

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

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

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

foreach widget in widgets do
  foo(widget)
end

widgetwidgetsと同じように名前を付けると言う人もいると思いますが、かなり読みやすいと思います。

3
Jez

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

2
Emile

私は長い間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を使用します。

1
Davy Landman

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

1
Tim Ottinger

@JustMike。 。 。 いくつかのCの例:。 。 。 Javaのものに同行します。

NON-NESTEDループ:。 。 。可能な場合は範囲​​を制限する

/*LOOP_DESCRIPTION*/ {

    int i;

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

        // loop body
    }  
}


NESTEDループ:。 。 。同上

/*LOOP_DESCRIPTION*/ {

    int row, column;

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

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

            // loop body
        }
    }  
}

このレイアウトの良い点の1つは、コメントなしで読みが悪く、それによってそれらを奨励することです。
おそらく冗長ですが、個人的にはこれがCでループを行う方法です。

また:開始時に「index」と「idx」を使用しましたが、これは通常、ピアによって「i」に変更されました。

1
Ande TURNER

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

1
Learning

スティーブマコネルのコード完了は、いつものように、この点に関していくつかの優れたアドバイスを持っています。関連するページ(とにかく初版)は340と341です。ループコーディングの改善に興味のある人は、これを見てみることを強くお勧めします。マコーネルは意味のあるループカウンター名を推奨していますが、人々は私の弱い要約に頼るのではなく、彼が言わなければならないことを読むべきです。

1

私も2文字の規則を使用します。 ii、jj、kk。あなたはそれらをgrepすることができ、不要な一致の束を思い付くことはありません。

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

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

1
the0ther

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

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

ベストプラクティスは、ループのこの部分をコード全体で同じように見せることです(countを制限として一貫して使用することを含む)。これにより、精神的にスキップして、コードの肉、ループの本体。

同様に、たとえば、ピクセルの2D配列を歩いている場合は、次のように記述します。

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

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

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

1
Derek Clegg

Perl標準

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

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

英語では、次のように解釈されます。

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

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

for (@item){
    print;
}

英語で:

[各]アイテムについては、[it]を印刷してください。

これは、カウンターの標準でもあります。 (ただし、PerlではCなどの他の言語よりもカウンターの使用頻度がはるかに低くなっています)。したがって、1から100までの整数の平方を出力するには:

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

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

各車について、各タイヤを見て、その空気圧を確認します。

Perlの場合:

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

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

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

1
Jon Ericson

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

0
J.T. Hurley

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

0
Karthi

hungarian と組み合わせてコンテキスト関連のループ変数名を使い始めました。

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

0
Tim Gradwell

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

for x in width:
    for y in height:
        do_something_interesting(x,y)
0
Ed L

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

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

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

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

0
Midhat

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

0
loudej

私は通常使用します:

for(lcObject = 0; lcObject < Collection.length(); lcObject++)
{
   //do stuff
}
0
Riddari

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

特異な反復の場合、$_は、その使用法を知っている人にとっては良い名前です。

0
Kent Fredric

私の習慣は、「t」を使用することです-「r」に近いので、「for」と入力した後、簡単にフォローできます

0
Simon Munro