È una cattiva pratica creare blocchi di codice?


12

In C ++, è una cattiva pratica creare blocchi di codice all'interno di alcune funzioni, come le seguenti:

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

Il punto di fare questo sarebbe usare lo stesso nome variabile di "test" più volte, per lo stesso tipo di procedura. In realtà il mio progetto, ho più variabili e sto eseguendo più test. Non voglio davvero continuare a creare nuove variabili con nomi diversi per ciascuno dei test, considerando come i test siano così simili.

È una cattiva pratica inserire blocchi di codice in modo che le variabili vadano dall'ambito di applicazione dopo ogni test e quindi posso riutilizzare i loro nomi? O dovrei cercare un'altra soluzione? Va notato che ho considerato di utilizzare lo stesso set di variabili per tutti i miei test (e di impostarli tutti su 0 dopo ogni test), ma avevo l'impressione che questa potrebbe essere una cattiva pratica.


19
Se avessi ripreso questo codice, ti direi di separare ciascuno di questi test in singoli metodi ... Di conseguenza non avresti bisogno di usare blocchi di codice per individuarli separatamente.
Maybe_Factor

1
@Maybe_Factor - Sono d'accordo. Il vantaggio di metodi separati è che puoi nominare ciascun blocco, fornendo un codice più leggibile.
mouviciel,

@mouviciel Non solo codice più leggibile, ma rapporti di test più leggibili!
Maybe_Factor

@Maybe_Factor Non sono d'accordo. Spostare le cose in funzioni separate ha l'effetto negativo di farle sembrare piccole parti riutilizzabili di funzionalità. Mantenere tutta la logica per una funzione in un posto è buono.
Miglia in rotta il

1
@MilesRout Questa non è una funzione logica, si tratta di più test unitari per una funzione tutta stipata in una singola funzione di test. Blocchi di codice e funzioni nel codice normale sono un'altra discussione.
Maybe_Factor

Risposte:


22

I blocchi sono perfettamente ragionevoli se li stai usando per individuare alcune risorse. File, connessioni di rete, allocazioni di memoria, transazioni di database, qualunque cosa. In questi casi, il blocco fa effettivamente parte della struttura logica del codice: si genera una risorsa, esiste per un certo periodo di tempo e poi scompare in un momento designato.

Ma se tutto ciò che stai facendo è individuare un nome , direi che sono cattive pratiche. In generale, ovviamente; circostanze speciali possono applicarsi.

Ad esempio, se questa funzione è stata generata da un sistema di generazione di codice, framework di test o simili, i blocchi per motivi di scoping dei nomi sono una cosa ragionevole. Ma parleresti di codice scritto allo scopo di una macchina, non di un essere umano.

Se un essere umano sta scrivendo un codice in cui deve riutilizzare i nomi all'interno della stessa funzione, direi che probabilmente quei blocchi devono essere funzioni separate. Soprattutto se quei nomi vengono usati con tipi e / o significati diversi all'interno di quei blocchi.


10

Non è una cattiva pratica creare blocchi come questo. È come funzionano gli ambiti.

Di solito questo viene fatto quando si utilizza RAII (acquisizione delle risorse è inizializzazione) e si desidera controllare quando vengono chiamati i distruttori.

Se dura molto, prenderei in considerazione lo spostamento di quel codice nella sua funzione.

Secondo me, semplicemente usarlo per riciclare i nomi delle variabili non è una buona idea. Ma posso vedere che è stato utile in casi con poca memoria


Il riutilizzo dei nomi delle variabili locali non ha alcun effetto sull'uso della memoria.
Kevin Cline,

1
Non pensi che un ottimizzatore intelligente potrebbe utilizzare 1 posizione di memoria per le 2 variabili?
Robert Andrzejuk,

3
Sì. Ma può anche farlo se sono nella stessa portata, se non hanno distruttori.
Sebastian Redl,
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.