È una cattiva forma usare lo stesso nome di variabile in diversi ambiti?

1

Supponiamo di avere un codice di base in cui operazioni simili si svolgeranno in ambiti lessicali vicini. Prendi ad esempio un semplice pseudo codice:

variable = "foo"
# Do something with variable
if (True) {
    variable = "bar"
    # Do something else with variable
}
for i in range 1..100 {
    variable = i
    # Do another thing with variable
}

Dire che in ogni ambito, la variabile viene utilizzata per un'attività distinta, ma simile e quindi il nome "variabile" è appropriato in ciascun caso. Qual è la migliore pratica in questo caso per la denominazione? Dovresti usare il nome "variabile" ogni volta? Incrementa il nome come "variabile1", "variabile2", ecc.? O qualcos'altro interamente?

    
posta jkeuhlen 18.02.2015 - 21:46
fonte

5 risposte

3

Se la variabile in questione rappresenta la stessa cosa per entrambe le funzioni, non riesco a capire perché sarebbe un problema. Se stai arbitrariamente utilizzando variable per indicare "qualsiasi variabile all'interno di una funzione che può fare qualsiasi cosa" allora sì, è un problema. Assegna un nome alle variabili nel contesto in cui vengono utilizzate.

    
risposta data 18.02.2015 - 21:48
fonte
3

Ci sono due cose completamente diverse in gioco qui: riutilizzo variabile e riutilizzo del nome variabile (redeclaration. ) Il tuo pseudocodice di esempio non chiarisce quale dei due casi ti stai riferendo, quindi ne parlerò entrambi.

Questo è un riutilizzo variabile:

int i = 5;
for( ;; )
{
    i = 3;
    ...
}

Questo è il riutilizzo del nome variabile:

int i = 5;
for( ;; )
{
    int i = 3;
    ...
}

Il riutilizzo variabile è molto, molto brutto e dovrebbe essere evitato a tutti i costi perché porta al codice spaghetti. Il codice può essere aggiunto un giorno dopo il ciclo for , aspettando i per contenere 5 , e potrebbe essere molto scioccato scoprire che non lo è. Le persone che leggono questo codice presumono che stai sostituendo il valore di i per utilizzare il nuovo valore dopo il ciclo. I compilatori decenti ti daranno un avviso di "riutilizzo variabile" o "ambito variabile troppo ampio" se lo fai, ma potrebbero non essere sempre in grado di rilevarlo, (nel caso di un ciclo for , non possono, perché tu potrebbe farlo intenzionalmente,) quindi è meglio non spingere la fortuna.

Il riutilizzo del nome variabile è perfettamente soddisfacente e, di fatto, è auspicabile in determinati scenari. Ad esempio, il riuso del nome variabile garantisce che all'interno del ciclo for non sia possibile accidentalmente fare riferimento all'ambito esterno i , perché è stato ridefinito e quindi è ora inaccessibile. (Sfortunatamente C # non gli piace, ma la maggior parte delle altre lingue non ha problemi con esso.)

Non risponderei "è buono o cattivo a seconda di ciò che dicono i tuoi coetanei", perché potresti porre questa domanda sullo stackoverflow proprio per avere argomenti quando discuti di questo argomento con i tuoi colleghi.

    
risposta data 19.02.2015 - 01:00
fonte
1

Se la variabile è qualcosa di semplice e chiaro, come i, count, sum , vai avanti e riutilizzala.

Se la variabile è al centro del metodo, come calculatedResult , oppure sei in una serie di blocchi if/else (o blocca tutti quelli che finiscono in return calculatedResult ), riutilizzalo.

Ma se i blocchi non si escludono a vicenda e il controllo scorre da uno all'altro, potrebbe essere più chiaro non riutilizzare lo stesso nome di variabile. Ad esempio, se stai facendo una serie di query SQL, potrei andare (sintassi Java-ish)

if (theyCareAboutPeople) {
   peopleQuery = "SELECT * FROM people WHERE blah blah...";
   ResultSet people = mySqlDriver.execute(peopleQuery);
   // do something with people
}
if (theyCareAboutAges) {
   ageQuery = "SELECT * FROM ages WHERE blah blah...";
   ResultSet ages= mySqlDriver.execute(ageQuery );
   // do something with ages
}

Si noti che ho usato nomi significativi, come "peopleQuery" e "ages", invece di chiamare tutte le query "query" e tutti i risultati "risultato". IMO, questo è leggermente più chiaro, ma YMMV.

    
risposta data 19.02.2015 - 00:45
fonte
0

Riutilizzare una variabile non è buona, perché un compilatore che normalmente ti avviserà di variabili non inizializzate ecc. non può avvisarti, perché al momento del secondo utilizzo, la variabile verrà inizializzata.

Riutilizzare un nome di variabile di solito non è un problema.

Potresti ricevere avvisi del compilatore se crei una variabile con lo stesso nome di un'altra variabile in un ambito esterno. Con una buona ragione, perché questo sarà confuso e soggetto a errori. Evita se ricevi avvertimenti o meno.

Potresti avere problemi con un debugger che pensa che ci siano una dozzina di variabili con lo stesso nome e non è in grado di dirti quale stai usando in questo momento. Questo è un problema del debugger e dovrebbe essere risolto, ma se si verifica la situazione, è possibile scegliere di scrivere codice più amichevole del debugger.

    
risposta data 19.02.2015 - 01:46
fonte
0

Specificità: non utilizzare una variabile denominata variabile a meno che non si riferisca a qualcosa di specifico, come il timing variabile su un motore. Basta non farlo.

In un determinato contesto:

Non riutilizzare i nomi delle variabili in un dato contesto per scopi diversi. In una funzione, non rendere variable = 'foo' per l'uso come una stringa, poi in seguito rendere la variabile un indice numerico in un ciclo - questa è una cattiva pratica e tornerà a morderti in un modo grande.

Puoi riutilizzare i nomi delle variabili in un determinato contesto per lo stesso scopo generico, ma considera l'utilizzo di una nuova variabile per evitare confusione:

var i, j, myarray = [];
for( i = 0; i < 100; i++){
//
   mayarray.push[ i ];
}

for( j = 0; j < 1000; j++){
   // something with j
}

Potresti riutilizzare tecnicamente i per il secondo ciclo invece di usare una nuova variabile, j, ma eviterei di riutilizzarlo in questo caso perché può portare a confusione nella lettura del codice e potrebbe introdurre bug in seguito.

Al di fuori dello stesso contesto

Tutti riutilizziamo nomi di variabili comuni come i per gli indici di loop; questa è una buona pratica e migliora la leggibilità finché non si trovano nello stesso contesto.

Se stai pensando di riutilizzare un nome di variabile non generico, come numero parte, limita il loro riutilizzo a luoghi in cui si riferiscono alla stessa cosa logica nel codice di altri usi della variabile. Altrimenti può creare confusione nel codice.

La tua applicazione ha uno schema interno che mostra i dati che stai manipolando. Mappare lo schema con i nomi delle variabili, utilizzare nomi di variabili generiche per scopi generici ed essere a conoscenza dei propri contesti per il riutilizzo delle variabili.

    
risposta data 19.02.2015 - 11:16
fonte

Leggi altre domande sui tag