Czy używasz kręconych szelek do dodatkowego lunetowania? [zamknięte]

Mam na myśli inne niż używanie go, gdy jest wymagane dla funkcji, klas, if, while, switch, try-catch.

Nie wiedziałem, że można to zrobić w ten sposób dopóki nie zobaczyłem tego pytania .

W powyższym linku Eli wspomniał, że "używają go do składania kodu w logicznych sekcjach, które nie mieszczą się w funkcji, klasie, pętli itp. to zwykle jest złożone."

Jakie są inne zastosowania poza wymienionymi?

Czy warto używać curly szelki do ograniczenia zakresu zmiennych i rozszerzenia zakresu tylko w razie potrzeby (praca na zasadzie "need-to-access")? A może to głupie?

Co powiesz na używanie zakresów tak, aby można było używać tych samych nazw zmiennych w różnych zakresach, ale w tym samym większym zakresie? A może lepiej jest ponownie użyć tej samej zmiennej (jeśli chcesz użyć tej samej nazwy zmiennej) i zaoszczędzić na dealokacji i alokacji (myślę, że niektóre Kompilatory mogą na tym zoptymalizować?)? A może lepiej użyć innego nazwy zmiennych w ogóle?

Author: Community, 2008-10-30

13 answers

Robię, Jeśli używam zasobu, który chcę uwolnić w określonym czasie np.:

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...
}
 48
Author: Adam Pierce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 01:35:23

Nie używałbym do tego celu kręconych aparatów ortodontycznych z kilku powodów.

  1. Jeśli dana funkcja jest na tyle duża, że trzeba wykonać różne triki zakresowe, być może rozbić funkcję na mniejsze podfunkcje.

  2. Wprowadzenie nawiasów do zakresów w celu ponownego użycia nazw zmiennych spowoduje jedynie zamieszanie i problemy w kodzie.

Tylko moje 2 centy, ale widziałem wiele tego typu rzeczy w innych najlepszych materiałów.

 39
Author: agartzke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 18:02:16

Najczęstszym "niestandardowym" użyciem scopingu, którego używam regularnie, jest wykorzystanie scoped mutex.

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
}

Ma to wiele zalet, ale najważniejsze jest to, że blokada będzie zawsze czyszczona, nawet jeśli w chronionym kodzie pojawi się wyjątek.

 16
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 13:25:24

C++:

Czasami trzeba wprowadzić dodatkowy poziom nawiasów zakresu, aby ponownie użyć nazw zmiennych, gdy ma to sens:

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

Powyższy kod nie jest kompilowany. Musisz to zrobić:

switch (x) {
    case 0:
        {
            int i = 0;
            foo(i);
        }
        break;
    case 1:
        {
            int i = 1;
            bar(i);
        }
        break;
}
 15
Author: Greg Rogers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-27 22:13:26

Najczęstszym zastosowaniem, jak mówili inni, jest upewnienie się, że destruktory działają, kiedy chcesz. Jest również przydatny do uczynienia kodu specyficznego dla platformy nieco jaśniejszym:

#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
    }

Kod zbudowany dla Windows nie widzi "jeśli", tylko klamry. Jest to znacznie jaśniejsze niż:

#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
 11
Author: Graeme Perrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 16:05:33

Może być dobrodziejstwem dla generatorów kodu. Załóżmy, że masz wbudowany kompilator SQL (ESQL); może on chcieć przekonwertować polecenie SQL na blok kodu, który wymaga zmiennych lokalnych. Używając bloku, może on ponownie używać stałych nazw zmiennych w kółko, zamiast tworzyć wszystkie zmienne z osobnymi nazwami. Przyznaję, to nie jest zbyt trudne, ale jest trudniejsze niż to konieczne.

 6
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 01:36:04

Jak powiedzieli inni, jest to dość powszechne w C++ ze względu na wszechpotężny RAII (resource acquisition is initialization) idiom/pattern.

Dla programistów Javy (a może C#, Nie wiem) będzie to pojęcie obce, bo obiekty oparte na stercie i GC zabijają RAII. IMHO, umiejÄ ™ tnoĹ " Ä ‡ umieszczania obiektĂłw na stosie jest najwiÄ ™ kszÄ ... przewagÄ ... C++ nad Javä ... i sprawia, Ĺźe dobrze napisany kod C++ jest znacznie czystszy niĹź dobrze napisany kod Javy.

 6
Author: Drew Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 01:56:53

Używam go tylko wtedy, gdy muszę coś wypuścić za pomocą RAII, a nawet wtedy, gdy powinno to zostać wydane tak wcześnie, jak to tylko możliwe (np. zwolnienie blokady).

 5
Author: Jasper Bekkers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 01:36:54

Programowanie w Javie dość często chciałem ograniczyć zakres metod, ale nigdy nie przyszło mi do głowy użycie etykiety. Ponieważ używam wielkich liter moich etykiet, gdy używam ich jako celu przerwy, używanie mieszanych liter oznaczonych blokiem, jak zasugerowałeś, jest właśnie tym, czego chciałem przy tych okazjach.

Często bloki kodu są zbyt krótkie, aby rozdzielić się na małą metodę, a często kod w metodzie frameworku (jak startup () lub shutdown ()) i w rzeczywistości lepiej jest zachować koduj razem w jednej metodzie.

Osobiście nienawidzę zwykłych pływających / zwisających szelek (choć to dlatego, że jesteśmy sklepem w stylu strict banner), i nienawidzę markera komentarzy:

// 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

Rozważaliśmy użycie "if (true) {" , ponieważ specyfikacja Javy wyraźnie mówi, że będą one zoptymalizowane w kompilacji (podobnie jak cała zawartość if (false) - jest to funkcja debugowania), ale nie podobało mi się to w kilku miejscach, w których próbowałem.

Więc myślę, że twój pomysł jest dobry, a nie na wszystko głupie. Zawsze myślałem, że tylko ja chcę to zrobić.

 3
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-21 03:51:42

Tak, używam tej techniki z powodu RAII. Używam również tej techniki w plain C , ponieważ zbliża zmienne do siebie. Oczywiście, powinienem myśleć o tym, aby jeszcze bardziej przerwać funkcje.

Jedną z rzeczy, które są prawdopodobnie kontrowersyjne stylistycznie, jest umieszczenie klamry otwierającej na linijce deklaracji lub umieszczenie na niej komentarza. Chcę zmniejszyć ilość zmarnowanej przestrzeni pionowej. Jest to oparte na Google C++ Style Guide rekomendacja..

/// 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);
  }
}
 1
Author: piyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-01 04:38:06

Zgadzam się z agartzke. Jeśli uważasz, że potrzebujesz podzielić większe logiczne bloki kodu dla czytelności, powinieneś rozważyć refaktoryzację, aby oczyścić zajęte i zaśmiecone elementy.

 0
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 01:51:37

Ma swoje miejsce, ale nie sądzę, że robienie tego tak, aby $foo mogła być jedną zmienną tutaj i inną zmienną Tam , w ramach tej samej funkcji lub innego (logicznego, a nie leksykalnego) zakresu jest dobrym pomysłem. Chociaż kompilator może to doskonale zrozumieć, wydaje się zbyt prawdopodobne, aby utrudnić życie ludziom próbującym odczytać kod.

 0
Author: Dave Sherohman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 02:38:17

Firma, w której pracuję, ma politykę analizy statycznej, aby trzymać deklaracje zmiennych lokalnych blisko początku funkcji. Wiele razy, użycie jest wiele linii po pierwszej linii funkcji, więc nie mogę zobaczyć deklaracji i pierwszego odniesienia w tym samym czasie na ekranie. To, co robię, aby "obejść" Politykę, to trzymać deklarację w pobliżu odniesienia, ale zapewnić dodatkowy zakres za pomocą klamer kręconych. Zwiększa jednak wcięcia, a niektórzy mogą twierdzić, że sprawia, że kod brzydszy.

 0
Author: blizpasta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 17:27:42