2011-12-12 5 views
5

Kiedy zacząłem się rozwijać, poszedłem do tutoriali, które zawsze używały {} (nawiasy klamrowe) do zamykania klocków. Jednakże, gdy zacząłem przeglądać kod innych ludzi (na przykład klasy GitHub lub po prostu więcej kodu niż to, co pokazałby podstawowy samouczek), jednak widziałem również instrukcje blokowe, które nie są na przykład zamknięte w {};Bloki - nawiasy klamrowe/bez nawiasów klamrowych?

if($var < 15) 
    $string = 'Hello, Jimmy!'; 
elseif($var >= 15) 
    $string = 'Hello, Anne!'; 

jest taka sama jak

if($var < 15) { 
    $string = 'Hello, Jimmy!'; 
} elseif($var >= 15) { 
    $string = 'Hello, Anne!'; 
} 

nigdy nie używałem bloki nie załączone w {} jednak użyłem je dzisiaj i zaczynam widzieć efektywności robi tak (to wygląda dużo czystsze też, jak będę często moi funkcje usiane {} z pętli warunkowych itp

co pytam jest;

a) czy istnieją ograniczenia dotyczące bloków bez nawiasów klamrowych (; Zauważyłem, że IDE cofnął się z wcięcia po tym, jak wszedłem do pojedynczej linii i powróciłem po warunkowej if()?

b) czy są jakieś najlepsze praktyki, które można uzyskać, gdy nie jest używany {}?

żadnych odpowiedzi, w szczególności te inc. tło/dokumenty dotyczące konwencji użycia klamrowych klocków dla bloków a nie używanie ich byłoby bardzo docenione, ponieważ bardzo chciałbym zrozumieć użycie nawiasów klamrowych :)!

+1

Jest to kwestia preferencji. Naprawdę nie lubię ich pomijać, inni robią. Jeśli jesteś konsekwentny, prawdopodobnie jesteś w porządku. –

+0

Z tym poważnym błędem w SSL, powiedziałbym, że to pytanie jest BARDZO trafne. Zauważ, że * ZAWSZE * używanie nawiasów klamrowych zapewniłoby, że problem nie wystąpił. https://www.imperialviolet.org/2014/02/22/applebug.html – Alan

Odpowiedz

4

Można pominąć {} jeden pojedynczy wiersz:

if(something) 
    do something else 

jednak nie można pominąć go i to nie poddawać się tak:

if(something) 
    do one thing 
    do another 
    do some more 

Powyższy przykład miałby tylko 1 elementu warunkowego ("zrób jedno"). Reszta po prostu działałaby bezwarunkowo.

I tak widziałem tę niechlujną metodę wcześniej bez {}, sam wolę używać {}, aby oddzielić logikę i łatwiej ją odczytać.

Tak trzymać się za pomocą {} w kodzie.

+1

Świetna, wyczerpująca odpowiedź! Będę trzymać się ich używania :). Przyjmę, kiedy zegar się opuści. – Avicinnian

8

Najlepszą praktyką jest zawsze z nich korzystać. Jest zbyt łatwo, aby inny programista pojawił się i dodał linię kodu lub usunął linię kodu i zupełnie nieumyślnie złamał warunkowe.

0

Należy ich używać tylko wtedy, gdy po nawiasie klamrowym występuje więcej niż jeden wiersz kodu.

if($var) return true; 

samo jak

if($var) { 
    return true; 
} 

Jednakże, jeśli masz więcej niż jedną linię ty musi ująć je w nawiasach klamrowych.

if($var) { 
$var += 1; 
$var2 = $var; 
return $var2 
} 

Osobiście przestałem używać ich, gdy jeden wiersz kodu następuje dlatego, że mają rację, to wygląda czystsze zwłaszcza jeśli jej wszystko na jedną linię jak najwyższym oświadczeniu. Również twój kod będzie łatwiejszy w zarządzaniu, jeśli zmniejszysz liczbę stwierdzeń else if i po prostu użyjesz return, aby zatrzymać tę funkcję, jeśli if ulegnie awarii i po prostu przejdzie dalej do następnej wartości if. To może stać się naprawdę niechlujnie szybkie z wieloma stwierdzeniami else if` i nie korzystasz z przełącznika. Poza osobistymi preferencjami, jeśli jest to tylko jeden wiersz kodu, tracisz nawiasy klamrowe.

AlienWebguy ma rację, jeśli chodzi o rozwój zawodowy, użyj ich w takim przypadku.

0

Nawiasy klamrowe są opcjonalne, jeśli rachunek mają zostać wykonane po warunkowej lub pętli jest tylko jedna linia:

//This outputs "hello" 
$test = 1; 
if($test == 1) 
    echo "hello"; 

//This outputs "howdy" 
$test = 1; 
if($test == 2) 
    echo "hello"; 
    echo "howdy"; 

Niezależnie od tego, czy nie otaczają oświadczenia jednoliniowy z szelkami to kwestia osobistych preferencji i również może być podyktowane dokumentem stylu kodowania, jeśli pracujesz nad wspólnym projektem. Osobiście nigdy nie używam ich dla pojedynczych instrukcji i zezwalam na wcięcie mojego kodu, aby pokazać, jak kod jest zorganizowany, ale jeśli widzisz mój drugi przykład powyżej, to jest przypadek, w którym widziałem wcześniej, gdzie pojawiają się błędy. Koder tworzy warunkowe z pojedyncza linia do wykonania na podstawie tego warunku. Następnie wchodzi inny koder i dodaje drugą linię, ale zapomina dodać nawiasy klamrowe. Z tej perspektywy można powiedzieć, aby zawsze z nich korzystać. To zależy w dużej mierze od twoich indywidualnych okoliczności.

1

Wszystko zależy od stylu, do którego przywykłeś. http://en.wikipedia.org/wiki/Indent_style

if (some_error) 
    something(); //Will be executed only when some_error==true 
somethingelse(); //Will always be executed. 

Jeśli nie używać szelek tylko kolejna linia jest częścią if.

if (some_error) err1 = "bad1"; errorno=3; 

Oczywiście w powyższym przykładzie wartość errno zawsze będzie równała 3, niezależnie od tego, czy some_error jest prawdziwe, czy nie.

To samo jest z pętli

for (i = 0; i < 10; i++) 
    doSomething (i); 

tak więc znakami szelki gdzie zaczyna i gdzie się kończy. Niewykonanie ich oznacza, że ​​tylko kolejna linia będzie podlegała działaniu instrukcji if, for, while, ....

Można również użyć zamków do oznaczenia bloku kodu. Kiedy koduję w C++ i zawsze zaznaczam początek i koniec połączenia GL za pomocą nawiasów klamrowych.

glBegin(GL_TRIANGLES); // Drawing Using Triangles 
{ 
    glVertex3f(0.0f, 1.0f, 0.0f); // Top 
    glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left 
    glVertex3f(1.0f,-1.0f, 0.0f); // Bottom Right 
} 
glEnd(); 

W ten sposób łatwiej jest odczytać i wykryć brakujące połączenia GLEnd.