2010-05-21 11 views
11

Possibili duplicati:
Is a variable named i unacceptable?
What is an ideal variable naming convention for loop variables?int i vs int index ecc Qual è il migliore?

Provenendo da un background C ho sempre usato int i per le variabili di loop generici. Ovviamente in grandi loop annidati o in altre cose complesse potrei usare un nome descrittivo, ma quale preferiva vedere?

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

o

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

Nel progetto attuale sto lavorando ci sono entrambi questi stili e indice di essere sostituito dal ndx.

Qual è il migliore? La variabile i è troppo generica? Inoltre, che dire degli altri nomi in stile C? i, j, k Dovrebbero essere sostituiti tutti da variabili descrittive effettive?

+3

È ndx davvero più descrittivo di io o indice? O era solo un compromesso sul numero di personaggi da digitare? ;) –

+0

Penso che 'ind' sia più diretto di' ndx', anche se è solo lo stesso numero di caratteri. – Ponkadoodle

+0

@Tuzo non chiedermelo. Un ragazzo è un programmatore Delphi quindi forse è più normale lì? Credo di aver visto sia 'idx' che' ndx' usati però. – Earlz

risposta

14

i, tuttavia, è piuttosto standard in termini di primo ciclo, seguito da j per un ciclo interno e da k per un ciclo interno interno e così via.

Come quasi tutte le regole di denominazione, purché siano standard in un progetto e funzionino correttamente per tutti i membri, va bene.

+0

Non conosco il bit "e così via". Andare a quattro livelli probabilmente giustifica un ripensamento del design. Inoltre, 'l' è un nome terribile per una variabile in qualsiasi contesto (una sorta di barriera naturale :-). –

+0

@Marcelo: certo. In realtà inizio i loop con 'k' e procede con' m' e'n', non ho mai avuto bisogno di un quarto: P –

+0

non se le matrici sono colonne maggiori. Nell'algebra lineare il mondo m e n sono praticamente standard per le dimensioni, non per le variabili correnti (che sono i, j, k) – Anycorn

8

Se possibile, preferirei nomi descrittivi, poiché dovremmo cercare di ottenere un codice leggibile.

Per le variabili temporanee utilizzate in un blocco di codice limitato, è accettabile un nome di variabile breve.

Ma se il ciclo o il blocco di codice è molto lungo, è meglio avere un nome di variabile descrittivo più lungo, se non altro perché renderà più semplice la ricerca di testo.

+1

'i' è una variabile di indice standard che dovrebbe essere riconoscibile in quasi tutte le strutture del ciclo. – Jason

1

Se è un blocco piccolo e non ci sono cicli annidati, io sto bene, è quasi come una regola non scritta che io sia una variabile incrementale del ciclo ogni volta che appare. In ogni cosa più complessa, una buona denominazione è cruciale.

2

Quando si tratta di denominazione, è tutto sulla chiarezza. Direi che la maggior parte delle persone che guardano il codice sanno che "int i" è una sorta di indice, ma probabilmente presuppongono che si tratti di un semplice vecchio uso di vaniglia. Quindi, se fa qualcosa di intelligente (cioè non solo un semplice conteggio), dovresti chiamarlo qualcosa che chiarisca questo fatto.

1

Personalmente uso i, j invece di variabili di loop, tendo a provare a usare per ogni quando il linguaggio lo consente - lo trovo ancora meglio.

+0

Sì, certo, ma questo riguarda entrambi la mia codifica in C e C# e forse anche un po 'di Ruby – Earlz

+0

+1 .. se gli indici non sono necessari e la lingua supporta l'iterazione della raccolta, la preferisco anche se è più lenta. – Anurag

5

Se si eseguono cicli nidificati per accedere a elementi di array multidimensionali, i nomi descrittivi dell'iteratore sono indispensabili per creare un codice di commento automatico. ad es.,

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

vs.

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

Intendi come 'riga, colonna'? Lo pseudocodice – Earlz

+1

segue ogni convenzione che si desidera - passando a una virgola solo perché. – jball

+0

Cosa succede se si dispone di una matrice tridimensionale o di tre anelli annidati (matrice matrice moltiplicata)? Penso che i, j, k sia descrittivo come puoi essere – Anycorn

0

ho mai usare una sola lettera nomi di variabili per una semplice ragione - avete mai provato a cercare tutte le occorrenze di una certa variabile in un file o in più file? È meglio usare qualcosa di un po 'meno ambiguo e più ricercabile.

+3

Se gli identificativi di una singola lettera sono sempre strettamente legati, allora non ha senso cercare tutte le occorrenze. :) –

1

Uso frequentemente x e per le istanze in cui sto analizzando alcuni oggetti bidimensionali come una bitmap.

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

Uso le variabili a lettera singola come contatori molto. Ecco come ho ciclo, in modo esaustivo utilizzare le lettere dell'alfabeto:

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

impressionante +1 .. ora se questo sarebbe stato 'matrice [paese] [stato] [contea] [città] [strada] [edificio] [casa] [residenti] [0] [nome]', I sarebbe stato perplesso. – Anurag

+3

oh mio dio l'orrore! – Earlz

+2

Per non parlare del fatto che l, m, n, p, r, t, v e x succhiano come variabili di ciclo. – Anurag

4

nomi delle variabili brevi sono grandi, ma essi dovrebbero avere piccoli telescopi. E dovrebbero onorare le convenzioni della lingua. Fino al giorno in giorno, il mio codice Haskell e ML avrà variabili della funzione con valori f, g, e h e calcoli monadici m, variabili di tipo unnknown a e b, e gli elenchi dei tipi di elementi sconosciuti as e bs. Ma gli scopi di queste variabili saranno limitati alle brevi funzioni o alle clausole where.

Il mio codice C avrà variabili chiamato i, j, p, q, s e t. Ma gli scopi di queste variabili saranno limitati ai singoli loop (tutti lodano C99 e i backport C++!) O alle funzioni brevi. Indipendentemente dal fatto che si tratti di un indice di loop o di un'altra variabile, , un elemento visualizzato in un ambito di grandi dimensioni ottiene un nome più lungo.

+0

come mai nessuna variabile 'r'? – Anycorn

3

L'ambito della visibilità di un articolo deve determinare quanto descrittivo deve essere il nome .

Se si dispone letteralmente di un loop minuscolo, i, j, ek sono contatori dell'indice fini e tipici. A volte un nome più descrittivo può aiutare a illuminare l'intento, ma se il ciclo for è impostato come segue, allora un nome più descrittivo non ha molta importanza.

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

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

Detto questo, abbreviazioni non dovrebbero mai essere utilizzati se non sono utilizzati in modo coerente. Personalmente ritengo che ndx sia un terribile identificatore perché è difficile da digitare; Posso digitare perfettamente l'inglese e la mia velocità di programmazione non è limitata dalla mia velocità di digitazione. Se vuoi dire index, dire index.

Credo che sia stato in The Pragmatic Programmer che hanno detto che non si dovrebbero usare le abbreviazioni perché quindi la gente non saprà mai quale abbreviazione usare. So che voglio una cosa chiamata index così scrivo index ma ottengo un errore del compilatore. Ora cosa? (Cercare il codice per scoprire che è scritto ndx mi infastidirà.)

Mentre provo a pensarci, l'unica sigla che uso che non è specifica del gioco è "num" per " numero di'. A parte questo, io uso 'npc' per significare il carattere non giocatore, 'ai' per indicare l'intelligenza artificiale, ecc., Ecc., Ea volte uso abbreviazioni in piccoli blocchi, ad es.una funzione a 10 linee che funziona su una fotocamera può semplicemente chiamarla 'cam', ma l'ambito è piccolo, quindi è facile vedere cosa sta succedendo e la possibilità di confusione è limitata.

Scopo così piccolo -> fai quello che vuoi (a patto che ci sia una certa coerenza). Ampia portata -> rendere i vostri nomi non ambigui, significativi e facili da digitare. (Per "facile digitare" intendo "facile ricordare come si scrive" e "non esagerare".)