2010-05-21 56 views
11

可能重複:
Is a variable named i unacceptable?
What is an ideal variable naming convention for loop variables?int i vs int index等哪一個更好?

從C背景我一直使用int i爲通用的循環變量來了。當然,在大的嵌套循環或其他複雜的東西中,我可能會使用一個描述性名稱,但是您最喜歡看哪一個?

int i; 
for(i=0;i<Controls.Count;i++){ 
    DoStuff(Controls[i]); 
} 

int index; 
for(index=0;index<Controls.Count;index++){ 
    DoStuff(Controls[index]); 
} 

在當前項目中,我的工作也有這兩種風格和指數ndx所取代。

哪一個更好? i變量是否通用?那麼其他C風格的名字呢? i, j, k這些都應該被實際的描述性變量替代嗎?

+3

ndx是否真的比我或索引更具描述性?或者它只是對輸入字符數量的妥協? ;) – 2010-05-22 00:06:52

+0

我覺得'ind'比'ndx'更直接,即使它只有相同數量的字符。 – Ponkadoodle 2010-05-22 00:09:02

+0

@Tuzo不問我。一個人是Delphi程序員,所以也許在那裏更正常?我相信我已經看到'idx'和'ndx'。 – Earlz 2010-05-22 00:11:34

回答

14

i然而,在第一個循環方面是相當標準的,其次是內部循環的j和內部循環的k,依此類推。

就像幾乎所有的命名規則一樣,只要它在項目中是標準的,並且對所有成員都適用,那就沒問題。

+0

我不知道「等等」一點。進入四個級別可能需要重新考慮設計。另外,'l'在任何情況下都是一個可怕的變量名稱(一種天然屏障:-)。 – 2010-05-22 00:24:46

+0

@Marcelo:當然。我實際上是用'k'開始循環,然後進入'm'和'n',我從來不需要第四個:如果你的矩陣是列主要的,那麼不需要第四個:P – 2010-05-22 01:06:05

+0

。在線性代數世界中,m和n對於維度來說非常標準,而不是運行變量(它們是i,j,k)。 – Anycorn 2010-05-22 01:59:54

8

如果可能,我喜歡描述性名稱,因爲我們應該爭取可讀的代碼。

對於在緊密代碼塊中使用的臨時變量,可以使用短變量名稱。

但是,如果循環或代碼塊非常長,最好有一個更長的描述性變量名稱,如果沒有其他原因,它會使文本搜索更容易。

+1

'i'是一個標準索引變量,在任何循環結構中都應該可以識別。 – Jason 2010-05-22 03:13:59

1

如果它是小塊,並且沒有嵌套for循環,我很好,它幾乎是不成文的規則,我是一個循環增量變量,只要它出現。在一切更復雜的情況下,好的命名至關重要。

2

說到命名,這都是關於清晰度。我認爲大多數看代碼的人都知道「int i」是某種索引,但他們可能認爲這是一種普通的舊式香草用法。所以如果它做了一些聰明的事情(即不僅僅是簡單的計數),你應該把它叫做事實清楚。

1

就我個人而言,我使用i,j,而不是循環變量,我傾向於嘗試和當語言允許它 - 我發現,甚至更好。

+0

當然可以,但這與我在C和C#中的編碼有關,甚至可能與Ruby – Earlz 2010-05-22 00:07:25

+0

+1有關。如果不需要索引並且語言支持集合迭代,那麼即使速度較慢,我也更喜歡它。 – Anurag 2010-05-22 00:20:42

5

如果您正在執行嵌套循環以訪問多維數組元素,則描述性迭代器名稱是創建自我評論代碼的必備條件。 例如,

for(int i=0;i<someMax;i++){ 
    for(int j=0;j<someOtherMax;j++){ 
    DoStuff(someArray[i,j]); 
    } 
} 

for(int row=0;row<someMax;row++){ 
    for(int column=0;column<someOtherMax;column++){ 
    DoStuff(someArray[row,column]); 
    } 
} 
+0

你的意思是像「行,列」? – Earlz 2010-05-22 00:07:54

+1

僞代碼遵循您希望的任何約定 - 僅將它切換爲逗號就是因爲。 – jball 2010-05-22 00:10:07

+0

如果您有三維數組或三個嵌套循環(矩陣矩陣乘),該怎麼辦?我認爲i,j,k是一樣的描述性,你可以是 – Anycorn 2010-05-22 02:01:30

0

我從來不是一個簡單的原因使用單字母的變量名 - 你曾經試過搜索某個變量中出現的所有文件,或在多個文件?最好使用一些不太模糊,更容易搜索的東西。

+3

如果您的單字母標識符總是被限定範圍,那麼搜索它們的所有事件都沒有意義。 :) – 2010-05-22 01:55:35

1

我經常使用xy作爲當我解析像位圖一樣的二維對象時的情況。

for (int (y = 0; y < height; y++) 
{ 
    for (int x = 0; x < width; x++) 
    { 
     // work 
    } 
} 
3

我使用單字母變量作爲計數器很多。 這裏是我怎麼循環,詳盡地使用字母在字母表:

for (int i = 0, l = array.length; i < l; i ++) { 
    for (int j = 0, m = array[i].length; j < m; j ++) { 
    for (int k = 0, n = array[i][j].length; k < n; k ++) { 
     for (int o = 0, p = array[i][j][k].length; o < p; o ++) { 
     for (int q = 0, r = array[i][j][k][o].length; q < r; q ++) { 
      for (int s = 0, t = array[i][j][k][o][q].length; s < t; s ++) { 
      for (int u = 0, v = array[i][j][k][o][q][s].length; u < v; u ++) { 
       for (int w = 0, x = array[i][j][k][o][q][s][u].length; w < x; w ++) { 
       for (int y = 0, z = array[i][j][k][o][q][s][u][w].length; y < z; y ++) { 
        f(array[i][j][k][o][q][s][u][w][y]); 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+8

真棒+1現在,如果這將是'陣列[國家] [州] [縣] [城鎮] [街道] [建築物] [家] [居民] [0] [名稱]',我會被困住。 – Anurag 2010-05-22 00:18:20

+3

哦,我的上帝是恐怖! – Earlz 2010-05-22 00:22:48

+2

更不用說,l,m,n,p,r,t,v和x吸取爲循環變量的事實。 – Anurag 2010-05-22 00:24:03

4

短變量名是偉大的,但他們應該有小的範圍。他們應該遵守該語言的慣例。直到有一天我一天,我的Haskell和ML代碼將函數值的變量fgh和一元計算m,unnknown型ab的變量,並列出了未知的元素類型asbs的。但這些變量的範圍將侷限於短函數或where子句。

我的C代碼將有變量稱爲ijpqst。但是這些變量的範圍將侷限於單個循環(所有讚揚C99和C++ backports!)或簡短函數。無論是循環索引還是其他變量,出現在大範圍內的東西都會獲得更長的名稱。

+0

怎麼沒有'r'變量? – Anycorn 2010-05-22 02:03:16

3

項目的可見性的範圍應該說明名稱需要是如何描述的。

如果你真的有一個小循環,i,j和k是很好的典型指標計數器。有時候一個更具描述性的名字可以幫助說明意圖,但是如果for循環的設置類似於以下內容,那麼更具描述性的名稱並不重要。

for (int i = 0; i < totalCount; ++i) 
{ 
    Thing& myThing = things[i]; 

    // do stuff with myThing, never refer to i again 
} 

這就是說,縮寫不應該被使用,除非他們一貫使用。我個人認爲ndx是一個可怕的標識符,因爲它很難打字;我可以很好地輸入英文,而且編程速度不受我輸入速度的限制。如果你想說indexindex

我相信這是在語用程序員,他們說你不應該使用縮寫,因爲那樣人們永遠不會知道使用什麼縮寫。我知道我想要一個名爲index的東西,所以我鍵入index但我得到一個編譯器錯誤。怎麼辦? (通過代碼尋找,發現它寫ndx會打擾我。)

當我試圖想一想,關於我使用的唯一不是遊戲特定的縮寫是'num'來代表' numberOf」。除此之外,我使用'npc'表示非玩家角色,'ai'表示人工智能等等,有時我使用小塊的縮寫,例如在攝像頭上操作的10線功能可能只是稱其爲「凸輪」,但範圍很小,因此很容易看出發生了什麼,並且混淆的可能性有限。

所以 - 小範圍 - >做任何你喜歡的事情(只要有一定的一致性)。大範圍 - >讓你的名字毫不含糊,有意義且易於輸入。 (通過「易於輸入」我的意思是「容易記住如何拼寫」以及「不要過度」)。