중괄호없이 if 문을 사용하는 것은 나쁜 습관입니까? [닫은]


130

다음과 같은 코드를 보았습니다.

if(statement)
    do this;
else
    do this;

그러나 나는 이것이 더 읽기 쉽다고 생각합니다.

if(statement){
    do this;
}else{
    do this;
}

두 방법이 모두 작동하기 때문에 이것이 단순히 선호하는 문제입니까, 아니면 다른 방법보다 권장되는 방법입니까?



내 의견으로는 그것은 거의 나쁘지 않다. 왜냐하면 당신은 거의 절대로 일관성이없는 공백 들여 쓰기에 의존하기 시작하기 때문이다. 그들은 그런 것들에 대해 걱정해야 할 때 독자의 생각의 기차를 탈선시킵니다.
Sridhar Sarnobat가

답변:


212

첫 번째 버전의 문제점은 중괄호를 추가하지 않고 if 또는 else 절에 두 번째 명령문을 다시 추가하면 코드가 예상치 못한 재미있는 방식으로 중단된다는 것입니다.

유지 관리 측면에서는 항상 두 번째 양식을 사용하는 것이 더 현명합니다.

편집 : Ned는 의견에서 이것을 지적하지만 여기에 링크 할 가치가 있다고 생각합니다. 이것은 단지 상아탑 가상의 헛소리가 아닙니다 : https://www.imperialviolet.org/2014/02/22/applebug.html


17
그리고 유지 관리 성을 위해 항상 코딩해야합니다. 결국, 컴파일러는 어떤 형식을 사용하는지 신경 쓰지 않을 것입니다. 그러나 엉뚱한 중괄호 오류로 인해 버그를 도입하면 동료가 불쾌 할 수 있습니다.
Esteban Araya

12
또는 코드 블록에 대괄호를 사용하지 않는 언어를 사용할 수 있습니다.
Tor Valamo

10
@ lins314159-아니요, 파이썬과 같습니다. 이 점에서 나는 뻔뻔하기 때문입니다.
토르 발라 모

17
또 다른 증거 실수가 발생할 수 있습니다 : imperialviolet.org/2014/02/22/applebug.html
Ned

8
SSL 버그가 중괄호를지지하는 주장이라고 주장하는 것은 불분명합니다. 마치 개발자가 글을 쓰려는 의도는 if (…) { goto L; goto L; }아니지만 중괄호를 잊어 버렸습니다. ``if (…) {goto L; 고토 L; }`는 여전히 버그이기 때문에 보안 버그가 아닙니다 (보안상의 결과가 아닌 버그). 다른 예에서, 상황이 반대 방향으로 진행될 수 있으며 중괄호가없는 코드는 실수로 안전 할 수 있습니다. 세 번째 예에서 괄호없는 코드는 처음에는 버그가 없으며 개발자는 괄호를 추가하는 동안 오타가 발생합니다.
Pascal Cuoq

112

명령문 블록을 남기지 않는 데 따른 한 가지 문제점은 else-ambiguity입니다. 그것은 C에서 영감을 얻은 언어는 들여 쓰기를 무시하므로 이것을 분리 할 방법이 없습니다.

if(one)
    if(two)
        foo();
    else
        bar();

이것으로부터:

if(one)
    if(two)
        foo();
else
    bar();

8
이것은 최상위 답변에 언급 된 것보다 훨씬 심각한 문제입니다 (두 번째 진술 추가).

3
실제로,이 답변은 실제로이 답변을 냉담하게 읽는 데 약간의 관심을 기울였습니다. 실제로이 실수를했을 수도 있습니다.
omikes

2
다른 사람이 C가 실제로 해석하는 방식과 같은 궁금한 점이 있다면 GCC로 수행 한 테스트 에서이 코드를 첫 번째 방식으로 해석합니다. tpcg.io/NIYeqx
horta

2
"모호성"은 잘못된 용어입니다. 파서가 이것을 어떻게 볼지 모호하지 않습니다. else바인드는 가장 가까운 가장 안쪽에 탐욕스럽게합니다 if. 이 문제를 모르거나, 생각하지 않거나, 아직 커피가 부족한 사람들이 C 또는 유사한 언어를 코딩하는 경우 문제가 발생합니다. 언어 사양에 따르면 파서는 다른 작업을 수행해야한다고합니다. 그렇습니다. 문법에서 이론적으로 '필요하지 않은'것으로 표시하더라도 중괄호를 항상 포함하는 데 유리한 또 다른 주장입니다.
underscore_d

35

내 일반적인 패턴은 한 줄에 맞으면 내가 할 것입니다.

if(true) do_something();

else 절이 있거나 실행하려는 코드 true의 길이가 상당히 길면 괄호로 묶습니다.

if(true) {
    do_something_and_pass_arguments_to_it(argument1, argument2, argument3);
}

if(false) {
    do_something();
} else {
    do_something_else();
}

궁극적으로, 그것은 주관적인 스타일과 가독성 문제로 귀결됩니다. 그러나 일반적인 프로그래밍 세계는 두 가지로 나뉘어져 있습니다 (중괄호를 사용하는 언어의 경우). 예외없이 항상 사용하거나 예외적으로 항상 사용하십시오. 나는 후자 그룹의 일부입니다.


4
작성하는 것만 큼 쉽지만 if(true){ do_something(); }다른 프로그래머가 심각한 버그를 겪을 수있는 이유 를 찾아보십시오 (Apple의 "goto fail"총 ssl 코드 중단).
Craig

9
어떤 괄호도 관리자가 그의 뇌를 사용하지 못하게 할 것입니다. "한 줄에 들어가면 괄호가 없다"라는 아이디어를지지합니다. 왜냐하면, 그런 경우 에는 "after :"부분에서 아무것도 할 필요가없는 삼항 if 연산자 의 버전이기 때문 입니다. 세 개 한 벌. 그리고 왜 누군가가 삼항에 괄호를 도입 할 것 입니까?
Michal M

나는 궁극적으로 주관적이거나 스타일과 가독성에만 영향을 미친다는 것에 전혀 동의하지 않습니다. 문제를 디버깅하는 데 시간을 낭비한 사람은 블록 구분 기호가 누락되어 (없음을 알리지 않았기 때문에) 불필요 한 경우 코딩 스타일을 사용해야했기 때문에 많은 사람들이 읽은 것으로 나타났습니다. 이러한 코딩 스타일로 인해 끔찍한 버그가 발생할 수 있습니다. 이것은 매우 객관적이고 실용적인 문제라고 생각합니다. 물론 스타일을 구분하는 구분 기호를 사용하면 잊어 버릴 수는 있지만 적어도 근육 기억은 우리를 훨씬 덜 가능하게합니다.
underscore_d

10

내가 사용하는 IDE의 코드 포맷터를 사용하고 있습니다. 다를 수 있지만 기본 설정 / 옵션에서 설정할 수 있습니다.

난이게 좋아:

if (statement)
{
    // comment to denote in words the case
    do this;
    // keep this block simple, if more than 10-15 lines needed, I add a function for it
}
else
{
    do this;
}

5
이것은 전적으로 주관적인 스타일 문제이므로 개인적으로 중괄호 전용 줄의 중복성을 좋아하지 않습니다. 하지만 이봐
Matchu

14
이 스타일을 지원합니다. 대부분의 사람들은 왼쪽에서 오른쪽으로 코드를 읽으며 화면의 왼쪽 가장자리에 눈을 고정시킵니다. 코드를 시각적으로 논리적 단계 블록으로 분리하고 추출하는 데 도움이됩니다.
mloskot

6
나는 항상이 스타일을 선호했습니다. 해당 닫는 괄호를 찾기가 훨씬 쉽습니다. 그래서 많은 공간이 필요합니까? 더 작은 글꼴을 사용하십시오.
timday

4
중괄호가 별도의 줄에있을 때는 항상 코드를 통해 "스캔"하는 것이 더 쉽다는 것을 알게되었습니다. 그것은 모든 것에 적용됩니다. 클래스, 메소드, if 및 while 문 등 같은 줄에 첫 번째 괄호를 갖는 것을 결코 좋아하지 않았습니다 ...
Svish

2
공백은 특히 코드 폴딩 가능 IDE가있는 경우 저렴합니다.
Moo

10

내가 따르는 "규칙"은 다음과 같습니다.

"if"문이 무언가를하기 위해 테스트하는 경우 (IE 호출 함수, 변수 구성 등) 중괄호를 사용하십시오.

if($test)
{
    doSomething();
}

어떤 조건에서 어떤 함수가 호출되는지, 프로그램의 흐름이 어디로 가고 있는지 명확히해야하기 때문입니다. 프로그래머가 정확히 어떤 함수가 호출되는지와이 조건에서 어떤 변수가 설정되는지 이해하게하는 것은 프로그램이하는 일을 정확하게 이해하는 데 중요합니다.

루프 또는 함수 내에서 IE 흐름 제어를 수행하기 위해 "if"문이 테스트중인 경우 한 줄을 사용하십시오.

if($test) continue;
if($test) break;
if($test) return;

이 경우 프로그래머에게 중요한 것은 코드를 실행하지 않으려는 예외적 인 경우가 무엇인지 신속하게 발견하는 것입니다. 실행 블록이 아니라 $ test에 모두 포함되어 있습니다.


8

첫 순간부터 중괄호를 사용하면 이것을 디버깅하지 않아도됩니다.

if (statement)
     do this;
else
     do this;
     do that;

1
그것은 받아 들여진 이론적 근거로 보이지만 (여기서 악마의 옹호자 역할을 함) 하나의 구문을 강조하면서 하나의 추가 구문 강조 규칙도 이것을 해결하지 않습니까?
Ken

2
그래서 당신이 칠 때 들여 쓰기를 수정하는 IDE가있을 것입니다 ;:)
Sam Harwell

6

모든 if 문에 간단한 것까지 중괄호를 사용하십시오. 또는 삼항 연산자를 사용하도록 간단한 if 문을 다시 작성하십시오.

if (someFlag) {
 someVar= 'someVal1';
} else {
 someVar= 'someVal2';
}

다음과 같이 훨씬 멋지게 보입니다.

someVar= someFlag ? 'someVal1' : 'someVal2';

그러나 if / else 블록으로 갈 필요가없는 것이 확실하다면 삼항 연산자 만 사용하십시오!



2

내 경험상 첫 번째 형식의 유일한 (매우) 약간의 장점은 코드 가독성이며, 두 번째 형식은 "잡음"을 추가합니다.

그러나 최신 IDE와 코드 자동 생성 (또는 자동 완성)을 사용하면 두 번째 양식을 사용하는 것이 좋습니다. 중괄호를 입력하는 데 추가 시간을 소비하지 않으며 가장 빈번한 버그를 피할 수 있습니다.

충분한 에너지를 소비하는 버그가 있으며 사람들은 큰 시간 낭비를 위해 문을 열지 않습니다.

코드를 작성할 때 기억해야 할 가장 중요한 규칙 중 하나는 일관성입니다. 누가 작성했는지에 관계없이 모든 코드 줄은 동일한 방식으로 작성되어야합니다. 엄격한 것은 버그가 "발생"하는 것을 방지합니다;)

이것은 변수, 메소드, 파일의 이름을 명확하고 명확하게 지정하거나 올바르게 들여 쓰기와 동일합니다 ...

학생들이이 사실을 받아 들일 때, 자신의 소스 코드와의 싸움을 중단하고 코딩을 정말 흥미롭고 자극적이며 창의적인 활동으로보기 시작합니다. 그들은 신경이 아닌 그들의 마음에 도전합니다!


2

그것은 선호의 문제입니다. 나는 개인적으로 두 스타일을 모두 사용합니다. 더 이상 진술을 추가 할 필요가 없다고 확신하면 첫 번째 스타일을 사용하지만 가능하면 두 번째 스타일을 사용합니다. 더 이상 첫 번째 스타일에 문장을 추가 할 수 없으므로 일부 사람들은이 스타일을 사용하지 않는 것이 좋습니다. 그러나 두 번째 방법은 추가 코드 줄을 필요로하며 사용자 (또는 프로젝트)가 이러한 종류의 코딩 스타일을 사용하는 경우 첫 번째 방법은 간단한 if 문에 매우 선호됩니다.

if(statement)
{
    do this;
}
else
{
    do this;
}

그러나이 문제에 대한 가장 좋은 해결책은 Python이라고 생각합니다. 공백 기반 블록 구조를 사용하면 if 문을 만드는 두 가지 방법이 없습니다. 하나만 있습니다.

if statement:
    do this
else:
    do this

여기에는 중괄호를 전혀 사용할 수없는 "문제"가 있지만, 첫 번째 스타일보다 더 이상 선이 아니며 더 많은 문장을 추가 할 수 있다는 이점이 있습니다.


나는 스스로 파이썬이 if-else 문을 처리하는 방식이 매우 추악하다고 생각하지만 다시는 파이썬 프로그래머가 아닙니다. (아직)
helpermethod

1

나는 항상 코드를 표준으로 만들고 가능한 한 가깝게 보이려고 노력했다. 이를 통해 다른 사람이 업데이트를 담당 할 때 쉽게 읽을 수 있습니다. 첫 번째 예제를 수행하고 중간에 줄을 추가하면 실패합니다.

작동하지 않습니다 :

if (statement)이 작업을 수행하십시오. 이; 그렇지 않으면 이것을하십시오;


1

개인적으로 나는 첫 번째 스타일을 사용하여 예외를 던지거나 메소드에서 조기에 반환합니다. 함수의 시작 부분에서 인수 확인과 같이,이 경우에는 할 일이 두 개 이상 없으며 다른 일이 없습니다.

예:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

그렇지 않으면 두 번째 스타일을 사용합니다.


1

내 개인적인 취향은 다음과 같이 공백과 괄호를 혼합하여 사용합니다.

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

나는 이것이 깨끗해 보이고 내 코드를 매우 쉽게 읽고 가장 중요하게 디버그 할 수 있다고 생각합니다.


0

코드에 명시하고 중괄호를 사용하는 것이 낫다는 사실에 대부분의 답변에 동의합니다. 개인적으로 저는 일련의 코딩 표준을 채택하고 팀의 모든 사람들이 표준을 알고 준수 할 수 있도록 보장하고자합니다. 내가 일하는 곳 에서는 .NET 프로젝트를 위해 IDesign.net 에서 발행 한 코딩 표준을 사용 합니다.


0

나는 중괄호를 선호합니다. 그러나 때로는 삼항 연산자가 도움이됩니다.

대신에 :

int x = 0;
if (condition) {
    x = 30;
} else {
    x = 10;
}

하나는 간단하게해야합니다. int x = condition ? 30 : 20;

또한 사례를 상상해보십시오.

if (condition)
    x = 30;
else if (condition1)
    x = 10;
else if (condition2)
    x = 20;

중괄호를 넣으면 훨씬 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.