Frage

Ich meine andere, als es zu verwenden, wenn für Funktionen erforderlich, Klassen, wenn, während, Schalter, try-catch.

wusste ich nicht, dass es wie getan werden könnte, bis ich das SO sah in Frage .

In dem obigen Link, erwähnt Eli, dass „Sie es verwenden, ihren Code in logischen Abschnitten zu falten, die in eine Funktion nicht fallen, Klasse, Schleife, etc., die in der Regel gefaltet werden würden.“

Welche anderen Anwendungen gibt es neben den erwähnten?

Ist es eine gute Idee, geschweifte Klammern zu verwenden, um den Umfang Ihrer Variablen und erweitern den Umfang nur zu begrenzen, wenn erforderlich (arbeitet an einem „need-to-access“ -Basis)? Oder ist es wirklich dumm?

Wie wäre es mit Tive nur so, dass Sie die gleichen Variablennamen in verschiedenen Bereichen verwendet werden können, aber in der gleichen größeren Umfang? Oder ist es eine bessere Praxis die gleiche Variable wieder zu verwenden (wenn Sie die gleichen Variablennamen verwenden möchten), und speichern Sie auf Aufheben der Zuordnung und Zuweisung (ich glaube, einige Compiler auf diese optimieren können?)? Oder ist es besser ganz andere Variablennamen zu benutzen?

War es hilfreich?

Lösung

ich tun, wenn ich eine Ressource bin mit dem ich zu einem bestimmten Zeitpunkt zB befreien wollen:

void myfunction()
{
  {
  // Open serial port
     SerialPort port("COM1", 9600);
     port.doTransfer(data);
  } // Serial port gets closed here.

  for(int i = 0; i < data.size(); i++)
     doProcessData(data[i]);
  etc...
}

Andere Tipps

Ich würde nicht geschweiften Klammern zu diesem Zweck für ein paar Gründe verwenden.

  1. Wenn Ihre bestimmte Funktion groß genug ist, dass man verschiedene Scoping Tricks tun muß, vielleicht die Funktion in kleinere Teilfunktionen brechen.

  2. Die Einführung Klammern für Scoping-Variablennamen wiederverwenden wird nur zu Verwirrung und Ärger in Code führen.

Just my 2 cents, aber ich habe in anderen Best-Practice-Materialien eine Menge dieser Art von Dingen zu sehen.

Die häufigste "non-standard" Verwendung von Scoping, die ich regelmäßig verwenden ist ein scoped Mutex zu nutzen.

void MyClass::Somefun()
{
    //do some stuff
    {
        // example imlementation that has a mutex passed into a lock object:
        scopedMutex lockObject(m_mutex); 

        // protected code here

    } // mutex is unlocked here
    // more code here
}

Das hat viele Vorteile, aber das wichtigste ist, dass die Sperre wird immer gereinigt werden, auch wenn eine Ausnahme in dem geschützten Code ausgelöst wird.

C ++ :

Manchmal braucht man eine zusätzliche Stütze Höhe und des Umfangs einzuführen Variablennamen wieder zu verwenden, wenn es Sinn, dies zu tun macht:

switch (x) {
    case 0:
        int i = 0;
        foo(i);
        break;
    case 1:
        int i = 1;
        bar(i);
        break;
}

Der obige Code nicht kompiliert. Sie müssen es machen:

switch (x) {
    case 0:
        {
            int i = 0;
            foo(i);
        }
        break;
    case 1:
        {
            int i = 1;
            bar(i);
        }
        break;
}

Die häufigste Verwendung, wie andere gesagt haben, ist, um sicherzustellen, dass Destruktoren ausgeführt, wenn Sie sie zu wollen. Es ist auch praktisch für die Herstellung von plattformspezifischen Code ein wenig klarer:

#if defined( UNIX )
    if( some unix-specific condition )
#endif
    {
        // This code should always run on Windows but 
        // only if the above condition holds on unix
    }

-Code für Windows integriert nicht die, wenn nur die Klammern sehen. Das ist viel klarer als:

#if defined( UNIX )
    if( some unix-specific condition ) {
#endif
        // This code should always run on Windows but 
        // only if the above condition holds on unix
#if defined( UNIX )
    }
#endif

Es kann ein Segen für die Code-Generatoren sein. Angenommen, Sie haben eine eingebettete SQL (ESQL) Compiler; es könnte will eine SQL-Anweisung in einen Block von Code konvertieren, die lokalen Variablen benötigt. Durch die Verwendung eines Blockes kann es feste Variablennamen immer und immer wieder verwenden, anstatt alle Variablen mit separaten Namen zu erstellen. Zugegeben, das ist nicht zu hart, aber es ist schwieriger als nötig.

Wie andere gesagt haben, ist dies ziemlich häufig in C ++ aufgrund der allmächtigen RAII (Ressourcenerfassung ist Initialisierung) Idiom / Muster.

Für Java-Programmierer (und vielleicht auch C #, ich weiß es nicht), wird dies ein Fremdwort sein, da Heap-basierten Objekte und GC RAII töten. IMHO, ist in der Lage zu setzen Objekte auf dem Stapel der größte einzelne Vorteil von C ++ über Java und macht gut geschriebene C ++ Code viel sauberer als gut geschriebenen Java-Code.

Ich kann es nur benutzen, wenn ich etwas mit den Mitteln der RAH und auch nur dann freigeben müssen, wenn es so früh freigegeben werden soll, wie ich kann möglicherweise (eine Sperre zum Beispiel der Freigabe).

Programmierung in Java habe ich ziemlich oft wollte Umfang innerhalb eines Verfahrens begrenzen, aber es kam nie zu mir ein Etikett zu verwenden. Da ich meine Etiketten groß geschrieben, wenn sie als Ziel eines Bruchs unter Verwendung eines gemischten Fall markierten Block mit, wie Sie vorgeschlagen haben, ist genau das, was ich bei diesen Gelegenheiten gewünscht habe.

Oft sind die Code-Blöcke sind zu kurz in eine kleine Methode auszubrechen, und oft der Code in einem Framework-Methode (wie Start () oder shutdown ()) und es ist eigentlich besser den Code zusammen in einem Verfahren zu halten.

Ich persönlich hasse die Ebene floating / baumelnden Klammern (obwohl das ist, weil wir ein strenger Banner Stil Einzug Shop sind), und ich hasse das Kommentarzeichen:

// yuk!
some code
{
scoped code
}
more code

// also yuk!
some code
/* do xyz */ {
    scoped code
    }
some more code

// this I like
some code
DoXyz: {
    scoped code
    }
some more code

Wir betrachteten mit „if (true) {“, weil die Java Spezifikation sagt speziell diese in Kompilation wegoptimiert wird (ebenso wie der gesamte Inhalt einer if (false) - es ist eine Debug-Funktion), aber ich hasste es, dass in ich die wenigen Plätze hat es versucht.

So denke ich, Ihre Idee gut ist, überhaupt nicht dumm. Ich dachte immer, ich war der einzige, der dies tun wollte.

Ja, ich verwende diese Technik wegen RAII. Ich benutze auch diese Technik im Klar C , da es die Variablen bringt näher zusammen. Natürlich sollte ich die Funktionen über Zerschlagung noch mehr zu denken.

Eine Sache, die ich tun, dass wahrscheinlich stilistisch umstritten ist die geschweifte Klammer auf der Linie der Erklärung setzen oder einen Kommentar legen Recht darauf. ich die Menge der verschwendeten vertikalen Raum verringern wollen. Dies basiert auf dem Google C ++ Style Guide Empfehlung. .

/// c++ code
/// references to boost::test
BOOST_TEST_CASE( curly_brace )
{
  // init
  MyClass instance_to_test( "initial", TestCase::STUFF ); {
    instance_to_test.permutate(42u);
    instance_to_test.rotate_left_face();
    instance_to_test.top_gun();
  }
  { // test check
    const uint8_t kEXP_FAP_BOOST = 240u;
    BOOST_CHECK_EQUAL( instance_to_test.get_fap_boost(), kEXP_FAP_BOOST);
  }
}

Ich bin mit agartzke. Wenn Sie das Gefühl, dass Sie zu segmentieren größere logische Codeblöcke zur besseren Lesbarkeit müssen, sollten Sie Refactoring betrachten beschäftigt und unübersichtlich Mitglieder aufzuräumen.

Es hat seinen Platz, aber ich glaube nicht, dass es so, dass $ foo tun eine Variable sein kann hier und eine andere Variable es , innerhalb der gleichen Funktion oder andere (logisch, anstatt lexikalischer) Umfang ist eine gute Idee. Auch wenn die Compiler, dass vollkommen verstehen können, es zu wahrscheinlich scheint das Leben erschweren, die Menschen, den Code zu lesen versuchen.

Das Unternehmen an arbeite ich hat eine statische Analyse Politik lokale Variablendeklarationen am Anfang einer Funktion zu halten. Viele Male, ist die Verwendung viele Zeilen nach der ersten Zeile einer Funktion, so kann ich die Erklärung nicht sehen und die erste Referenz zugleich auf dem Bildschirm. Was ich tue, um ‚circumvent‘ die Politik ist es, die Erklärung in der Nähe der Referenz zu halten, aber zusätzliche Möglichkeiten bieten von geschweiften Klammern. Es erhöht die Einbuchtung aber, und einige mögen argumentieren, dass es den Code hässliche macht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top