Przypadki przełączników Java: z nawiasami klamrowymi czy bez?

85

Rozważ następujące dwa fragmenty z nawiasami klamrowymi:

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

Bez szelek:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

Wiem, że we fragmencie z nawiasami klamrowymi nowy zakres jest tworzony przez ujęcie każdego przypadku w nawiasy. Jeśli jednak w każdym przypadku nie jest potrzebny nowy zakres (tj. Nazwy zmiennych nie są ponownie używane), czy istnieje jakikolwiek spadek wydajności w przypadku używania nawiasów klamrowych z wielkością liter?

cdmckay
źródło

Odpowiedzi:

99

czy jest jakaś obniżka wydajności za używanie szelek w przypadku?

Żaden.

Nawiasy klamrowe mają pomóc kompilatorowi w ustaleniu zakresu zmiennej, warunku, deklaracji funkcji itp. Nie wpływa to na wydajność środowiska uruchomieniowego po skompilowaniu kodu do pliku wykonywalnego.

MrValdez
źródło
21

Brak spadku wydajności z punktu widzenia wykonania.

Niewielki spadek wydajności z punktu widzenia kompilacji, ponieważ jest więcej do przeanalizowania, ale jeśli ktoś byłby tym zainteresowany, musiałby napisać cały kod w jednej linii :-)

A teraz część opinii w naszym poście ... Zawsze umieszczam {i}, ponieważ istnieje kara za łatwość konserwacji, ponieważ prawdopodobnie będziesz musiał je umieścić w późniejszym terminie i może to być uciążliwe umieszczanie ich później ... ale to jest 103% osobistych preferencji.

TofuBeer
źródło
Jestem trochę zaciekawiony, bo sam nie widzę odpowiedzi ... @TofuBeer, kiedy MUSISZ dodać szelki? Ponadto całkowicie zgadzam się z kwestią konserwacji, po prostu nie widzę problemu z konserwacją ATM. EDYCJA: nieważne. Właśnie przeczytałem resztę odpowiedzi poniżej.
nyaray
W niektórych przypadkach robisz w C ++, więc jeśli pracujesz w obu językach, nie jest to zły nawyk.
TofuBeer
13

Jak wiemy, szelki do obudów przełączników nie są konieczne. Stosowanie przypadków z nawiasami klamrowymi może powodować niejasności co do zakresu sprawy.

Nawias otwierający jest zwykle powiązany z czymś znaczącym, jak początek funkcji lub początek pętli, początek deklaracji klasy lub początek inicjalizacji tablicy itp. Wiemy, że przypadek wyrywa się z bloku przełącznika, gdy napotyka przerwę komunikat. Tak więc użycie nawiasów klamrowych wydaje się sugerować ignorantowi czytelnikowi inny zakres przypadku. Dlatego lepiej unikać nawiasów klamrowych ze względu na lepszą czytelność programowania.

tj. kiedy mam coś takiego,

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

Zostanie wydrukowany komunikat „Hello from 1”. Ale użycie nawiasu klamrowego może sugerować ignorantowi czytelnikowi, że przypadek kończy się na '}', już wiedząc, co ogólnie oznaczają nawiasy klamrowe w przypadku pętli, metod itp.

Tak jak w przypadku instrukcji skoku do etykiety w „C”, kontrolka po prostu przesuwa się do wielkości liter i kontynuuje wykonywanie. Tak więc, mając to na uwadze, ZŁĄ praktyką jest używanie nawiasów klamrowych podczas pisania przypadków dla przełącznika.

Technicznie rzecz biorąc, możesz otoczyć dowolny blok swojego kodu dodatkową parą nawiasów klamrowych, jeśli jest używany z prawidłową składnią. Używanie nawiasów klamrowych w przełączniku wygląda tak źle, przynajmniej dla mnie, ponieważ wydaje się, że daje inne wrażenie, jak powiedziałem powyżej.

Moja sugestia: po prostu unikaj używania otaczających szelek w przypadku przełączników.

Real Red.
źródło
5
Nie zgadzam się z tym. Używanie nawiasów klamrowych ORAZ pisanie kodu poza nawiasami byłoby bardzo złą formą, tak, ale to nie dyskredytuje używania nawiasów klamrowych samo w sobie.
Max Roncace,
12

Z szelkami.

Jest tak wiele rzeczy, które mogą się nie udać w instrukcjach switch, staram się ich unikać, gdzie tylko mogę, tj

  1. Zapominając o przerwach, a tym samym o awariach skrzynek
  2. Zapominając o domyślnym przypadku, a tym samym nie wychwytując stanu bez pokrycia
  3. Przypadkowe ponowne użycie zmiennych między opisami przypadków lub, co gorsza, wpływanie na zmienną, która JEST dzielącą zmienną między opisami przypadków.

Korzystanie z nawiasów klamrowych jest jednym ze sposobów zapobiegania celowemu i przypadkowemu współużytkowaniu zmiennych między instrukcjami case

jklp
źródło
8
Uwzględnienie punktów 1 i 2 było mylące w przypadku tego pytania (dla mnie); Twoja ostatnia linia powinna wyraźnie powiedzieć, że nawiasy klamrowe rozwiązują tylko 3 - myślałem, że masz na myśli, że klamry wykluczają konieczność przerw, a potem spróbowałem.
ataulm
Punkt 3 nie ma nawet sensu. Nie można ponownie używać zmiennych, chyba że zostały zadeklarowane w zakresie nadrzędnym instrukcji switch. Oznacza to, że jeśli zadeklarujesz zmienną w ramach przypadku, nie można jej użyć w innej instrukcji case. Jeśli zadeklarujesz zmienną powyżej instrukcji switch (w zakresie nadrzędnym), nie ma znaczenia, czy użyjesz nawiasów klamrowych, czy nie, instrukcje case będą miały dostęp do zmiennej.
dsingleton
Właśnie (ponownie) odkryłem, że zmienne zadeklarowane w przypadku 1 mogą nadal znajdować się w zakresie w przypadku 2. Np .: ...case 1: int a = 10; break; case 2: int a = 11; break; ...nie kompiluje się. (testowane z Oracle JDK 8)
anuragw
5

To pytanie prawdopodobnie zostanie zamknięte jako „kłótliwe” (BRACE WAR!), Ale co do cholery. Właściwie to lubię szelki po przypadkach. Dla mnie to sprawia, że ​​brzydka składnia przełącznika wygląda bardziej jak reszta konstrukcji języka. (Nie ma kary za użycie nawiasów klamrowych w tym „przypadku”)

Andy White
źródło
Myślę, że to rodzaj obiektywnego pytania ... Wycofuję argumentację
Andy White
Wolę to bez szelek ... Uważam, że szelki dodają dużo niepotrzebnego hałasu.
cdmckay
Tak, chciałbym, żeby było bardziej tak: sprawa (FOO) {x = x + 1} sprawa (BAR) {y = y + 1}
Andy White
Rozsądne białe spacje == ładne. Niepotrzebne szelki == do dupy.
Shog9,
3
białe znaki == połączenie tabulatorów i spacji == do dupy (pomyślałem, że wrzuciłem do miksu komentarz tabulatora zamiast spacji)
Andy White
5

Mówisz, że nawiasy klamrowe można pominąć, ponieważ nazwy zmiennych nie są ponownie używane. Ponownie wykorzystując nazwy zmiennych, zakładam, że masz na myśli zadeklarowanie nowej zmiennej tego samego typu.

Nawiasy klamrowe są w rzeczywistości najbardziej przydatne, aby zapewnić, że caseprzez pomyłkę nie użyjesz ponownie tej samej zmiennej w różnych . Dziś nie deklarują żadnych zmiennych, ale jutro ktoś je doda i bez nawiasów klamrowych kod jest podatny na błędy.

Nędzna zmienna
źródło
3

Nie użyłbym szelek do obudów przełączników.

  • Instrukcja switch wygląda dość barokowo już bez szelek.

  • Obudowy przełączników powinny być bardzo krótkie. Kiedy musisz zadeklarować zmienne, jest to znak, że robisz to źle.

Teraz zajmiemy się utrzymaniem starego kodu C, który obsługuje przełączniki z ponad 500 liniami ...

starblue
źródło
1

Nigdy wcześniej o tym nie myślałem. Nigdy nie potrzebowałem nawiasów klamrowych w klauzuli case, więc tak naprawdę nie rozumiem, dlaczego ich potrzebujesz. Osobiście nie opowiadam się za ideą „Łatwiej będzie w utrzymaniu”, to po prostu bzdura, będzie łatwiej utrzymać, jeśli kod ma sens i jest udokumentowany.

Bez nawiasów klamrowych ... mniej składni znaczy więcej

Gareth Davis
źródło
{i} sprawiają, że rzeczy również się wyróżniają, co ułatwia czytanie (IMO).
TofuBeer
tak. Zamierzałem podzielić się historią metody, którą kiedyś musiałem zmodyfikować (dodanie jednej linii kodu zajęło mi około 4 godzin), ale kod był szalony (około 10 stron długości i 4 strony po wydrukowaniu), więc tak nie jest typowy przypadek. Ale gdyby używał {}, dodanie go zajęłoby minutę.
TofuBeer
Myślę, że chodzi o to, że jeśli pierwotny programista podjął wysiłek umieszczenia bloków {}, aby kod był bardziej czytelny, mogliby faktycznie przejmować się tym, że piszą instrukcję przełączania 10 stron i zmieniają kod na trochę mniej szalone
Gareth Davis
swtich byłby marzeniem ... zostałby zagnieżdżony, gdyby / elses ... napisany w kodzie C ++ przez programistów COBOL ... Niedługo potem zrezygnowałem.
TofuBeer