Qual è il possibile svantaggio di mettere le dichiarazioni nei blocchi interni, invece che all'inizio della funzione?

9

Nel luogo in cui lavoro, ci sono linee guida esplicite per il posizionamento delle dichiarazioni di variabili. In base a ciò, è necessario metterli a livello globale e / o all'inizio delle funzioni, e non in blocchi interni (come un ciclo for). Dal momento che sono stati specificati da persone più esperte di me, sono sicuro che ci deve essere una buona ragione per farlo, ma non riesco a capire cosa possa essere. Sarebbe bello sapere se ci sono dei vantaggi in termini di tempo / durata di compilazione per averli dichiarati in un ambito più ampio.

    
posta TCSGrad 11.11.2011 - 13:30
fonte

8 risposte

8

Vedo due vantaggi principali:

  • È stato impedito il riutilizzo dei nomi delle variabili con un tipo diverso.
  • Diventa chiaro in precedenza che una routine deve essere sottoposta a refactoring. Le variabili nella parte superiore diventano un grosso problema abbastanza rapidamente, e questo casino è facile da riconoscere.

Qualsiasi compilatore degno di questo nome ottimizzerà comunque l'ambito delle variabili, quindi è puramente un problema di formattazione.

Per i miei due centesimi, preferirei comunque la dichiarazione più interna della variabile per trasportare l'intento di scope al compilatore. Se intendevi far accedere una variabile solo all'interno di un ciclo, puoi catturare qualsiasi riferimento successivo al momento della compilazione quando dichiari la variabile nel ciclo.

    
risposta data 11.11.2011 - 13:53
fonte
3

L'unico vantaggio che ho trovato finora è la semplicità del codice. Sai sempre dove cercare le dichiarazioni variabili e tutti nel team adottano lo stesso stile di codifica. Queste cose rendono più semplice la manutenzione del codice, ma non sono sicuro che facciano in modo che scrivere codice migliore sia più facile. Non voglio dire che scrivi codice peggiore solo che a volte è più difficile scrivere codice come buono. Tuttavia, se il team di sviluppo è grande oi suoi membri cambiano frequentemente utilizzando gli standard del codice è utile.

    
risposta data 11.11.2011 - 13:43
fonte
3

Sembra una decisione per preservare la coerenza. Impedisce inoltre l'uso degli stessi nomi per variabili diverse negli ambiti vicini e aumenta la leggibilità. Come fa notare Gus, saprai anche dove cercare le variabili. Penso che il principio del raggio d'azione più stretto sia migliore anche perché impedisce l'ingombro variabile in alto. La dichiarazione più esterna è molto simile alla dichiarazione dei membri privati di una prima IMO di classe.

    
risposta data 11.11.2011 - 13:47
fonte
3

Ogni lingua può differire nelle preferenze di stile e pratica. Di seguito è riportato JSF-AV-rules , che Stroustrup indica come standard di codifica lui preferisce.

AV Rule 136
Declarations should be at the smallest feasible scope

La logica per questo è descritta come

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

Se sei in C ++, è preferibile dichiarare la variabile quando ne hai bisogno.

    
risposta data 11.11.2011 - 15:06
fonte
3

Non sono sicuro se puoi chiamare questa best practice. Quando imposto le linee guida per un nuovo progetto C, dichiaro sempre che è meglio dichiarare le variabili vicino a dove sono usate. Per due motivi, rende più facile il refactoring del codice in un secondo momento (ad esempio quando si estrae un metodo). Aiuta anche il compilatore a fare un'ottimizzazione migliore.

Non sono solo con questa opinione. Ecco una domanda che affronta lo stesso problema: link La risposta qui è dichiararli dove li usi. La stessa pratica è descritta nel libro "Codice pulito" di Robert C. Martin.

Tuttavia, se si utilizza un C-standard più vecchio (C-89), è necessario definire le variabili locali nella parte superiore della funzione. Quindi forse la linea guida è un residuo del tempo in cui fu usato il C-89? Probabilmente è meglio chiedere alla persona che ha scritto le linee guida perché la regola è ancora lì.

    
risposta data 05.12.2011 - 14:21
fonte
2

Se la dichiarazione si trova all'interno di una clausola if che viene esercitata solo raramente (se mai) ma richiede molta memoria, l'ingombro della memoria è minore (il più delle volte) rispetto a quando si alloca tutto all'inizio della funzione .

Se si trova all'interno di un ciclo, devi riallocare ripetutamente la memoria, questo può essere costoso in termini di prestazioni.

Ci sono ragioni per fare le cose in entrambi i modi.

    
risposta data 11.11.2011 - 14:12
fonte
1

Il vecchio standard C del 1989 consente solo dichiarazioni variabili all'inizio di un blocco.

Solo poiché le dichiarazioni C99 sono consentite ovunque. Forse il tuo posto non ha ancora fatto il passaggio a C99.

    
risposta data 11.11.2011 - 14:22
fonte
1

Sembra che coloro che hanno preso questa decisione siano abituati a un momento in cui le dichiarazioni in cima erano la norma e hanno scelto di non passare a una preferenza per dichiarare più vicino a dove è stata utilizzata.

Non sono sicuro di quanto sia eloquente questo livello di coerenza. Alcuni IDE probabilmente riescono a trovare le cose più facilmente di altri. Per le variabili globali questo ha senso, ma se la tua funzione è così lunga da rendere difficile trovare dichiarazioni variabili, hai problemi più grandi.

    
risposta data 11.11.2011 - 15:02
fonte

Leggi altre domande sui tag