Ist es eine schlechte Praxis, Codeblöcke zu erstellen?

12

Ist es in C ++ nicht üblich, Codeblöcke in einer Funktion zu erstellen, z.

    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;

    }

Dazu müsste derselbe Variablenname von "test" mehrmals für dieselbe Art von Prozedur verwendet werden. In meinem Projekt habe ich mehrere Variablen und führe mehrere Tests durch. Ich möchte nicht immer neue Variablen mit unterschiedlichen Namen für jeden der Tests erstellen, wenn man bedenkt, wie ähnlich die Tests sind.

Ist es eine schlechte Praxis, Codeblöcke einzufügen, damit die Variablen nach jedem Test den Gültigkeitsbereich verlassen und ich ihre Namen wieder verwenden kann? Oder soll ich eine andere Lösung suchen? Es sollte beachtet werden, dass ich in Betracht gezogen habe, für alle meine Tests denselben Variablensatz zu verwenden (und sie nach jedem Test auf 0 zu setzen), aber ich hatte den Eindruck, dass dies eine schlechte Praxis sein könnte.

Inertial Ignorance
quelle
19
Wenn ich diesen Code überarbeiten würde, würde ich Sie bitten, jeden dieser Tests in einzelne Methoden zu unterteilen. Infolgedessen müssten Sie keine Codeblöcke verwenden, um sie separat zu erfassen.
Vielleicht_Faktor
1
@Maybe_Factor - Ich stimme zu. Der Vorteil separater Methoden besteht darin, dass Sie jeden Block benennen können, um einen besser lesbaren Code bereitzustellen.
mouviciel
@mouviciel Nicht nur besser lesbarer Code, sondern auch besser lesbare Testberichte!
Maybe_Factor
@Maybe_Factor Ich stimme nicht zu. Das Verschieben von Dingen in separate Funktionen hat den negativen Effekt, dass sie wie kleine wiederverwendbare Teile der Funktionalität erscheinen. Es ist gut, die gesamte Logik für eine Funktion an einem Ort zu haben.
Miles Rout
1
@MilesRout Dies ist keine logische Funktion, sondern ein Test mit mehreren Einheiten für eine Funktion, die alle in einer einzigen Testfunktion zusammengefasst ist. Codeblöcke gegen Funktionen in normalem Code sind eine andere Diskussion.
Vielleicht_Faktor

Antworten:

22

Blöcke sind absolut vernünftig, wenn Sie sie verwenden, um Ressourcen einzuschränken. Dateien, Netzwerkverbindungen, Speicherzuordnungen, Datenbanktransaktionen, was auch immer. In diesen Fällen ist der Block tatsächlich Teil der logischen Struktur des Codes: Sie erzeugen eine Ressource, sie existiert für einen bestimmten Zeitraum und verschwindet dann zu einem festgelegten Zeitpunkt.

Aber wenn Sie nur einen Namen nennen , würde ich sagen, dass es sich um eine schlechte Übung handelt. Im Allgemeinen natürlich; besondere Umstände können zutreffen.

Wenn diese Funktion beispielsweise von einem Codegenerierungssystem, einem Testframework oder dergleichen generiert wurde, sind Blöcke zum Zweck des Namensumfangs eine sinnvolle Sache. Aber Sie würden über Code sprechen, der für den Zweck einer Maschine geschrieben wurde, nicht für einen Menschen.

Wenn ein Mensch Code schreibt, in dem er Namen innerhalb derselben Funktion wiederverwenden muss, würde ich sagen, dass diese Blöcke wahrscheinlich separate Funktionen sein müssen. Insbesondere, wenn diese Namen mit unterschiedlichen Typen und / oder Bedeutungen in diesen Blöcken verwendet werden.

Nicol Bolas
quelle
10

Es ist keine schlechte Praxis, solche Blöcke zu erstellen. So funktionieren Oszilloskope.

Normalerweise geschieht dies bei Verwendung von RAII (Resource Acquisition is Initialization) und Sie möchten steuern, wann die Destruktoren aufgerufen werden.

Wenn es lang wird, würde ich erwägen, diesen Code in seine eigene Funktion zu verschieben.

Meiner Meinung nach ist es keine gute Idee, nur Variablennamen zu recyceln. Aber ich kann sehen, dass es in Fällen mit wenig Arbeitsspeicher nützlich war

Robert Andrzejuk
quelle
Die Wiederverwendung lokaler Variablennamen hat keine Auswirkungen auf die Speichernutzung.
Kevin Cline
1
Denken Sie nicht, dass ein intelligenter Optimierer 1 Speicherplatz für die 2 Variablen verwenden könnte?
Robert Andrzejuk
3
Ja. Dies kann aber auch geschehen, wenn sie sich im selben Bereich befinden und keine Destruktoren haben.
Sebastian Redl