Qual è il possibile svantaggio di inserire dichiarazioni in blocchi interni, anziché 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). Dato che sono stati specificati da persone più esperte di me, sono sicuro che ci deve essere una buona ragione, ma non riesco a capire quale potrebbe essere. Sarebbe bello sapere se ci sono vantaggi in termini di tempo di compilazione / tempo di esecuzione nel farli dichiarare in un ambito più ampio.

Risposte:


8

Vedo due vantaggi principali:

  • Il riutilizzo di nomi di variabili con un tipo diverso è impedito.
  • Diventa chiaro in precedenza che una routine deve essere riformulata. Le variabili in alto diventano un disordine importante abbastanza rapidamente e questo disordine è facile da riconoscere.

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

Per i miei due centesimi, preferirei comunque la più intima dichiarazione della variabile per trasportare l'intento dell'ambito al compilatore. Se intendevi avere accesso a una variabile solo all'interno di un ciclo, puoi prendere qualsiasi riferimento successivo in fase di compilazione quando dichiari la variabile nel ciclo.


3

L'unico vantaggio che ho trovato finora è la semplicità del codice. Saprai sempre dove cercare le dichiarazioni variabili e tutti i membri del team adottano lo stesso stile di codifica. Queste cose rendono più semplice la manutenzione del codice ma non sono sicuro che facilitino la scrittura di codice migliore. Non intendo dire che scrivi codice peggiore solo che a volte è più difficile scrivere codice altrettanto bene. Tuttavia, se il team di sviluppo è grande o i suoi membri cambiano frequentemente utilizzando gli standard di codice è utile.


3

Sembra una decisione di preservare la coerenza. Inoltre impedisce l'uso degli stessi nomi per variabili diverse in ambiti vicini e aumenta la leggibilità. Come sottolinea Gus, saprai anche dove cercare le variabili. Penso che il principio dell'ambito più stretto sia migliore perché impedisce il disordine variabile nella parte superiore. La dichiarazione più esterna è molto simile alla dichiarazione dei membri privati ​​di un primo IMO di classe.


3

Ogni lingua potrebbe differire nelle preferenze di stile e pratica. Segue le regole JSF-AV , che Stroustrup indica come gli standard di codifica che preferisce.

Regola AV 136
Declarations should be at the smallest feasible scope

La logica di ciò è 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 variabile quando ne hai bisogno.


3

Non sono sicuro di poter chiamare questa procedura consigliata. Quando imposto le linee guida per un nuovo progetto C, dichiaro sempre che è meglio dichiarare le variabili vicine a dove vengono utilizzate. Per due motivi, semplifica il refactoring del codice in un secondo momento (ovvero durante l'estrazione di un metodo). Aiuta anche il compilatore a fare una migliore ottimizzazione.

Non sono solo con questa opinione. Ecco una domanda che affronta lo stesso problema: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -them La risposta qui è dichiararli dove li usi. La stessa pratica è descritta nel libro "Codice pulito" di Robert C. Martin.

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


2

Se la dichiarazione rientra in una clausola if che viene esercitata solo raramente (se mai), ma necessita di molta memoria, il footprint della memoria è più piccolo (il più delle volte) rispetto a quando si alloca tutto all'inizio della funzione.

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

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


1

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

Solo da quando le dichiarazioni C99 sono consentite ovunque. Forse il tuo posto non è ancora passato a C99.


Usiamo C99 - ma soprattutto, stavo cercando quali sono le implicazioni di dichiararlo nel blocco più interno, piuttosto che all'inizio della funzione. Forse non ero abbastanza chiaro ...
TCSGrad,

1

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.