중괄호를 생략하는 것이 왜 나쁜 습관으로 간주됩니까? [닫은]


177

왜 이런 식으로 코드를 작성하는 것이 나쁜 습관이라고 말합니까?

if (foo)
    Bar();

//or

for(int i = 0 i < count; i++)
    Bar(i);

중괄호를 생략하는 가장 큰 주장은 때로는 두 배가 될 수 있다는 것입니다. 예를 들어 다음은 C #에서 레이블의 광선 효과를 페인트하는 코드입니다.

using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
{
    for (int x = 0; x <= GlowAmount; x++)
    {
        for (int y = 0; y <= GlowAmount; y++)
        {
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));
        }
     }
 }
 //versus
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
    for (int x = 0; x <= GlowAmount; x++)
        for (int y = 0; y <= GlowAmount; y++)
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));

또한 usings백만 번 들여 쓰기하지 않고도 체인 연결의 추가 이점을 얻을 수 있습니다 .

using (Graphics g = Graphics.FromImage(bmp))
{
    using (Brush brush = new SolidBrush(backgroundColor))
    {
        using (Pen pen = new Pen(Color.FromArgb(penColor)))
        {
            //do lots of work
        }
    }
 }
//versus
using (Graphics g = Graphics.FromImage(bmp))
using (Brush brush = new SolidBrush(backgroundColor))
using (Pen pen = new Pen(Color.FromArgb(penColor)))
{
    //do lots of work
}

중괄호에 대한 가장 일반적인 주장은 유지 보수 프로그래밍과 원래 if 문과 의도 된 결과 사이에 코드를 삽입하여 발생하는 문제를 중심으로합니다.

if (foo)
    Bar();
    Biz();

질문 :

  1. 언어가 제공하는보다 간결한 구문을 사용하고 싶습니까? 이 언어를 디자인하는 사람들은 영리합니다. 항상 사용하기에 좋지 않은 기능을 사용한다고 상상할 수 없습니다.
  2. 가장 낮은 공통 분모를 이해하고 처리하는 데 아무런 문제가 없도록 코드를 작성해야합니까?
  3. 내가 놓친 또 다른 주장이 있습니까?

6
동의합니다. 생략하십시오. 기간.
Andrei Rînea

67
2010 년에 몇 개의 라인이 어떻게 운영되고 있는지에 대한 사람들은 누구입니까? 모니터는 넓고 저렴하며 고해상도입니다! 내 모니터는 2048 X 1152이며 두 개가 있습니다! 찾기 어려운 미세한 오류를 쉽게 도입 할 수있을 때 2 개의 수직선을 저장하는 것이 가독성이 더 중요합니다.

51
모니터는 넓고 저렴하지만 키가 크고 싸지 는 않습니다 . 수직 공간은 수평 공간보다 부족합니다.
Adam Says-복원 Monica Monica

32
@AdamRuth 옆으로 돌립니다 :)
Zachary Yates

16
따라서 2014 년 2 월 LOL에서 발견 된 SSL 버그로 Apple과 같은 문제가 발생하지 않습니다.
learnvst

답변:


183

실제로, 내가 정말로 물린 유일한 시간은 내가 디버깅 할 때 였고 bar ()를 주석 처리했습니다.

if(foo)
  // bar();
doSomethingElse();

그 외에는 다음을 사용하는 경향이 있습니다.

if(foo) bar();

위의 경우를 처리합니다.

편집 질문을 분명히 해 주셔서 감사합니다. 최저 공통 분모에 코드를 작성해서는 안됩니다.


31
물론 거칠지 만 유지 보수 담당자에게 가장 큰 문제는 두 번째 줄을 추가하고 그것이 실제로 보이는 것처럼 보이지만 조건 문의 일부가 아님을 깨닫지 못한다는 것입니다.
danieltalsky

23
나는 항상 아래의 루프 바디를 찾기 때문에 하나의 라이너 스타일을 좋아하지 않습니다.
Nosredna 2016 년

18
한 줄짜리 스타일이 도움이되는 것보다 더 자극적이라고 생각합니다 (특히 깊은 중첩에서)는 문장을 쉽게 읽을 수 있고 혼란을 초래할 수 있기 때문입니다. 그러나 입력 유효성 검사 (예 : 초기 반환) 또는 루프 제어 (예 : 파일 시스템 워크에서 관련없는 파일 이름 무시)와 같은 단일 명령문 if를 거의 독점적으로 사용합니다. 빈 줄은 기본 코드에서 파일을 설정하는 데 도움이됩니다.
Alan Plum

1
한 줄 스타일은 테스트 범위에서 bar ()를 숨 깁니다. foo가 항상 false 인 경우에도 적용됩니다.
보 후밀 얀다

1
"소스에 중괄호가 포함되어 있으면 디버깅하는 동안 시간을 ​​낭비하지 않았을 것"이라고 말하는 또 다른 방법입니다. -중괄호를 추가하는 것은 간단하며 다음 사람에게 함정을 남기지 않습니다. 이에 대한 유일한 논거는 "가독성"인데, 이는 생략 할 경우 암묵적으로 발생하는 경우를 고려할 때 상당히 열악합니다.
Andrew Theken

156

읽는 속도 ...

이미 언급 한 것 말고는. 이 시점에서 나는 중괄호와 공백이있는 if 문을 구문 분석하도록 이미 조건화되었습니다. 그래서 나는 읽었습니다.

if (condition)
{
    DoSomething();
}

DoSomethingElse();

내가 읽는 것보다 약간 빠릅니다.

if (condition) DoSomething();

DoSomethingElse();

다음과 같은 경우 조금 느리게 읽습니다.

if (condition) DoSomething();
DoSomethingElse();

나는 이것을 이전보다 상당히 느리게 읽었습니다.

if (condition) 
    DoSomething();
DoSomethingElse();

나는 도움이 될 수는 없지만 다시 사례를 읽고 저자가 의도했는지 궁금해합니다.

if (condition)
{
    DoSomething();
    DoSomethingElse();
}

일반적으로 이미 다루었지만 아래 내용 을 읽을 때 저자가 의도 한 내용을 확인하기 위해 잠시 동안 살펴볼 것입니다. 원래 저자를 찾아서 확인하기도합니다.

if (condition) 
    DoSomething();
    DoSomethingElse();

29
문제는 4 번째 샘플에서 if 문 뒤에 빈 줄을 넣어 DoSomethingElse ()에서 분리 할 때 빈 줄을 넣을 때 해결됩니다. 또 다른 것은 2 또는 3 그룹으로 줄을 넣으면 가독성을 높이는 데 도움이된다는 것입니다. 코드를 훨씬 빠르게 스캔하면됩니다.
Piotr Owsiak

6
어쩌면 파이썬에 익숙하기 때문에 if 문과 같은 줄에 첫 번째 중괄호를 넣으면 더 빨리 읽을 수 있습니다.
Ponkadoodle

16
브레이스리스 스타일의 문제점은 블록이 더 중요한 것보다 괄호를 가지고 있는지에 대한 귀중한 집중력을 낭비하게 만듭니다. 이것만으로도 가능한 가장 간단한 규칙을 사용할 수있는 충분한 이유가 있습니다.
네이트 CK

2
중괄호는 본질적으로 명시 적입니다. 고마워요.
TheOptimusPrimus

2
마지막 경우에, 원래의 저자를 찾아 그를 때리십시오 ...;)
Per Lundberg

55

작은 것이면 다음과 같이 작성하십시오.

if(foo()) bar();

두 줄로 나눌 수있을 정도로 긴 경우 중괄호를 사용하십시오.


그래, 나도 그래 다른 줄을 추가하면 중괄호를 추가해야하며 bar ()가 실제로 if의 일부임을 알면 명확하게 주석 처리하면 나쁜 일이 발생합니다.
jalf December

10
그래도 디버거 친화적이지 않습니다. "막대"부분에 중단 점을 어떻게 설정합니까?
Nemanja Trifunovic 2014

9
@Nemanja : 커서를 bar ()에 두십시오. F9를 누르십시오. VS2005와 VS2008 모두 별도의 "문"인 경우 줄 내 중단 점을 처리합니다.
GalacticCowboy

4
GalanticCowboy : 아는 것보다 더 많은 환경이 있습니다. :-)

20
물론, 문맥이 C #이기 때문에, 그것은 대부분의 사용자를 포함해야합니다 ...
GalacticCowboy

47

또한 실제로 필요할 때만 중괄호를 사용하는 것이 더 좋다고 생각했습니다. 그러나 더 이상, 주된 이유는, 코드가 많을 때 더 읽기 쉽고 일관된 브레이싱 스타일이있을 때 코드를 더 빨리 파싱 할 수 있다는 것입니다.

if에 두 번째 문장을 추가하는 것 외에도 항상 중괄호를 사용하는 또 다른 좋은 이유는 다음과 같은 일이 발생할 수 있습니다.

if(a)
   if(b)
     c();
else
   d();

else 절이 실제로 "if (b)"의 절이라는 것을 알고 계셨습니까? 당신은 아마했을 것입니다,하지만 당신은이 문제에 익숙한 사람을 믿습니까?

따라서 일관성을 유지하고 다른 사람 (항상 바보 인 다른 사람)이 코드를 변경할 때 예기치 않은 일이 발생할 수있는 일을 알지 못 하기 때문에 소스 코드를 더 읽기 쉽고 빠르게 파싱하기 때문에 항상 중괄호를 넣습니다. 당신의 두뇌. 위임이 이루어 지거나 스위치와 같은 if 절이 확장되지 않을 것 같은 가장 간단한 if 문에 대해서만 중괄호를 생략합니다.


12
이것은 중괄호를 사용하는 두 가지 경우 중 하나입니다. 그렇지 않으면 아닙니다.
Andrei Rînea 2012

3
이것은 처음에는 메타 크 인 것처럼 (a && b) ...로 작성되어야합니다.
alexander.biskop

8
@ alexander.biskop : else 블록에 !a || !b( !a) 또는 a && !b괄호를 추가 하지 않고 ( ) 와 다른 의미 ( ) 를 부여하기 때문에 확실하지 않습니다 .
벤 Voigt

1
@ 벤 보이 그 : 사실! 반년 후 두 번의 공감 후 누군가가 내가 한 진술이 잘못되었다는 것을 알고있다 ... 세부 의견에 대한 의도가 지적하는 것과 다른 것이었기 때문에 세부 사항에 충분히주의를 기울이지 않았다고 생각한다 if 절의 기술적으로 올바른 변환. 내포 된 인라인 if 문은 일반적으로 가독성 (및 특히 제어 흐름의 추적 성)을 현저히 떨어 뜨리므로 하나의 문장으로 결합해야합니다 (또는 완전히 피해야 함). 건배
alexander.biskop

3
@ alexander.biskop : 동시에 간단한 조건을 가진 중첩 된 if를 사용하면 디버깅이 더 쉬워집니다.
벤 Voigt


35

줄이 싸다. 프로세서 성능이 저렴합니다. 개발자 시간은 매우 비쌉니다.

일반적으로 절대적으로 리소스 / 속도 중요한 응용 프로그램을 개발하지 않는 한 항상 코드 작성 측면에서 실수를합니다.

(a) 다른 개발자가 내가하고있는 일을 쉽게 수행 할 수 있습니다.

(b) 필요할 수있는 코드의 특정 부분에 의견을 말하십시오.

(c) 무언가 잘못되면 쉽게 디버깅

(d) 향후에 필요할 경우 쉽게 수정할 수 있습니다 (예 : 코드 추가 / 제거)

코드의 속도 또는 학문적 우아함은 비즈니스 관점에서 이러한 요소에 부차적입니다. 이것은 내가 어색하거나 못생긴 코드를 작성하기로 설정 한 것은 아니지만 이것이 나의 우선 순위입니다.

대부분의 경우 중괄호를 생략하면 (b), (c) 및 (d)가 더 어려워집니다 (그러나 불가능하지는 않습니다). 중괄호를 사용하거나 사용하지 않아도 (a)에 영향을 미치지 않습니다.


9
(a)에 대한 마지막 진술은 여기에 다른 포스터를 포함하여 많은 개발자들이 논쟁 할 것이라는 의견입니다.
Kelly S. French

34

나는 중괄호가 제공하는 선명도를 선호합니다. 당신은 무엇을 의미하는지 정확히 알고 있으며 누군가가 방금 그들을 막아 냈는지 추측 할 필요가 없습니다 (버그를 도입했습니다). 내가 그들을 생략하는 유일한 경우는 if와 action을 같은 줄에 넣을 때입니다. 나도 그렇게 자주하지 않습니다. 나는 수년간의 K & R C 유사 프로그래밍에서 중괄호로 줄을 끝내는 것이 IDE가 그것을 강제하지 않으면 극복하기 위해 노력해야하는 연습이지만, 실제로 중괄호를 자체 줄에 넣음으로써 도입 된 공백을 선호합니다. 나를.

if (condition) action();  // ok by me

if (condition) // normal/standard for me
{
   action();
}

23

나는 그것이 당신이 작업하는 프로젝트와 개인적인 취향에 대한 지침의 문제라고 생각합니다.

나는 보통 다음과 같은 경우를 제외하고 필요하지 않을 때 생략합니다.

if (something)
    just one statement; // i find this ugly
else
{
    // many
    // lines
    // of code
}

나는 선호한다

if (something)
{
    just one statement; // looks better:)
}
else
{
    // many
    // lines
    // of code
}

15

이것이 당신을 물 수있는 인스턴스 중 하나는 옛날 C / C ++ 매크로로 돌아 왔습니다. 나는 이것이 C # 질문이라는 것을 알고 있지만, 표준이 처음 만들어진 이유없이 코딩 표준이 종종 이어집니다.

매크로를 만들 때주의하지 않으면 {}를 사용하지 않는 if 문에 문제가 발생할 수 있습니다.

#define BADLY_MADE_MACRO(x) function1(x); function2(x);

if (myCondition) BADLY_MADE_MACRO(myValue)

자, 내가 틀리지 말아라. 나는 C / C ++ 에서이 문제를 피하기 위해 항상 {}을해야한다고 말하지는 않지만, 이것 때문에 매우 이상한 버그를 다루어야했다.


2
모든 코드 만 그렇게 선언했다면 ... 한숨
Nathan Strong

15

나는 같은 방식으로 생각합니다.

언젠가 (왜 당신의 삶을 영원히 바꾸는 "하루"가 항상 있는가?) 우리는 누군가가 검색 / 바꾸기 변경과 결합 된 괄호를 넣지 않았다는 것을 알아 내기 위해 생산 코드를 디버깅하지 않고 24-36 시간 동안 계속 보낸다. .

이런 식이었습니다.

 if( debugEnabled ) 
      println( "About to save 1 day of work to some very important place.");
 saveDayData();

뒤에 온 것은

 if( debugEnabled ) 
 //     println( "About to save 1 day of work to some very important place.");
 saveDayData();

시스템에서 매일 500MB의 로그를 생성하는 것으로 나타 났으며 중지하라는 요청을 받았습니다. 디버그 플래그가 충분하지 않아서 println을 검색하고 교체했습니다.

여전히 앱이 프로덕션 환경으로 전환되었을 때 디버그 플래그가 해제되었고 중요한 "saveDayData"가 호출되지 않았습니다.

편집하다

이제 중괄호를 사용하지 않는 유일한 장소는 if / try 구문입니다.

if( object != null ) try { 
     object.close();
} catch( .....

그렇게하는 슈퍼 스타 개발자를 본 후.


3
이해가 안 돼요 디버깅을 제어하는 ​​변수 (debugEnabled)가 있으며 여전히 주석을 사용하여 디버깅을 비활성화 하시겠습니까 ??? 왜 debugEnabled를 false로 설정하지 않았습니까?
Igor Popov

이것은 정확히 시나리오는 아니지만 좋은 지적입니다. 바보 같은 것들 (debug를 false로 설정하지 않는 것과 같이)은 "명백한"버그보다 찾기 어려운 미묘하고 바보 같은 버그를 만듭니다. 이 경우에는 중괄호를 사용하지 않아도 도움이되지 않습니다.
OscarRyz

1
@igor 모든 로깅 행이 아니라 한 행의 로깅 만 제거하려고했기 때문에 어떻습니까?
gman

14

무딘하기 위해 나는 그것을 다음과 같이 본다 :

좋은 프로그래머는 방어 적으로 프로그램하지만 나쁜 프로그래머는 그렇지 않습니다.

위의 몇 가지 예와 중괄호를 잊는 것과 관련된 버그에 대한 비슷한 경험이 있기 때문에 항상 괄호를 치울 수있는 어려운 방법을 배웠습니다.

다른 어떤 것도 안전보다 개인 스타일을 선택하고 있으며 이는 분명히 나쁜 프로그래밍입니다.

Joel은 심지어 잘못된 코드를 잘못 보이게 만들기 에서 이것을 언급했습니다.

괄호가 누락되어 버그가 생기면 누락 된 괄호가 다른 버그가 발생할 가능성이 있다는 것을 알기 때문에 괄호가 잘못 표시되는 것을 알게됩니다.


열린 중괄호가 자체적으로 행에 배치되면 일치하지 않는 중괄호 쌍과 같이 두 개 이상의 행이 중괄호 쌍없이 들여 쓰기 된 모든 위치가 잘못 표시됩니다. if명령문이 블록을 제어하는 경우 이러한 사용법에는 빈 줄 이 필요하지만 if명령문이 블록이 아닌 단일 조치를 제어하는 경우 블록이 필요 하지 않습니다.
supercat

14

나는 매우 행복하다 :

foreach (Foo f in foos)
  foreach (Bar b in bars)
    if (f.Equals(b))
      return true;

return false;

개인적으로 나는 왜 그런지 모르겠다

foreach (Foo f in foos)
{
  foreach (Bar b in bars)
  {
    if (f.Equals(b))
    {
      return true;
    }
  }
}

return false;

더 읽을 수 있습니다.

예, 줄은 비어 있지만 크기와 크기가 절반 일 때 왜 페이지와 코드 페이지를 스크롤해야합니까?

가독성이나 유지 관리성에 차이가 있다면, 중괄호를 넣으십시오 ...하지만이 경우에는 아무런 이유가 없습니다.

또한, 나는 항상 중첩 된 곳에 중괄호를 넣을 것입니다.

if (condition1)
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();

vs

if (condition1)
  if (condition2)
    doSomething();
else (condition2)
  doSomethingElse();

매우 혼란 스럽기 때문에 항상 다음과 같이 씁니다.

if (condition1)
{
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();
}

가능할 때마다 삼항 연산자를 사용하지만 결코 중첩 하지 않습니다 .


단지 :)이 거의 내 코드에서 일어나고있는 알 내가 주위를 살펴볼 것이다 생각, 보라와 보라 ...이 : 거기에서 이미
Noctis

10

"만약 누군가가 코드를 작성하도록 돈을 지불 할만큼 똑똑하다면, 코드의 흐름을보기 위해 들여 쓰기에만 의존하지 않을만큼 똑똑해야합니다."

그러나 ... 실수를 할 수 있으며 이것은 특히 다른 사람의 코드를 볼 때 디버깅하는 데 어려움이 있습니다.


10

내 철학은 코드를 더 읽기 쉽게 만든다면 왜 그렇지 않습니까?

분명히 간결하고 지나치게 변수 이름이 명확한 매체를 찾는 것처럼 어딘가에 선을 그려야합니다. 그러나 대괄호는 실제로 오류를 피하고 코드의 가독성을 향상시킵니다.

사람들은 코더가 될만큼 똑똑한 사람들이 대괄호가없는 버그를 피할만큼 똑똑 할 것이라고 주장 할 수 있습니다. 그러나 철자 오류만큼 단순한 문제에 빠진 적이 없다고 정직하게 말할 수 있습니까? 큰 프로젝트를 볼 때 이와 같은 Minutia는 압도적 일 수 있습니다.


7
물론 이것은 매우 주관적입니다. 언젠가는 그대로두면 가독성이 향상됩니다.
Brian Knoblauch

사실, 괄호를 남기지 않으면 다른 사람들이 언급 한 것처럼 한 줄을 유지합니다. 나는 여러 번 물 렸지만 대괄호가없는 멀티 라인 문. 당신이 그것을 찾아 알고 있지만, 여전히 당신을 얻을 수 있습니다.
James McMahon

10

항상 예외가 있지만 양식 중 하나에있을 때만 중괄호를 생략하는 것에 대해 논쟁합니다.

if(x == y)
   for(/* loop */)
   {
      //200 lines
   }

//rampion's example:
for(/* loop */)
{
   for(/* loop */)
      for(/* loop */)
      {
         //several lines
      }
}

그렇지 않으면 문제가 없습니다.


4
나쁜 예입니다. 이 두 가지 경우 모두 200 줄 for 루프를 자체 방법으로 또는 바람직하게는 여러 방법으로 고려합니다.
Adam Jaskiewicz 오전

2
사실이지만 그렇게됩니다. 또한 블록이 리더의 화면보다 길 때 마다이 문제가 발생합니다. 또한 코드 리더의 화면 높이를 제어 할 수 없습니다. 그들은 양쪽에 몇 줄만 보일 수 있습니다.
rampion

2
그렇습니다. 그렇다고해서 일어날 필요 는 없습니다 .
Adam Jaskiewicz

3
@AdamJaskiewicz 맞아. 그렇습니다. 우리는 어떻게해야하는지 아니라 어떻게되는지 생각 해야합니다 . 우리가 무엇에 자신을 제한 할 수 있다면 해야 우리 일이 버그에 대해 걱정할 필요가 없습니다 것입니다.
Beska

10

나는 종종 맨 아래 코드 (여러 명령문을 사용하여)를 사용하지만 그 외에는 항상 중괄호를 넣습니다. 코드가 더 명확 해집니다. 문장이 블록의 일부라는 것 (그리고 아마도 if 등의 일부)이라는 단순한 들여 쓰기가 아니라는 것은 명백하다.

나는 보았다

if (...)
    foo();
    bar();

버그 나에게 물린 (또는 오히려 "나와 동료"-실제로 버그를 소개하지 않았다) 한 번 . 이것은 당시의 코딩 표준이 모든 곳에서 중괄호 사용을 권장한다는 사실에도 불구하고있었습니다. 보고 싶은 것을 알기 때문에 놀랍게도 오랜 시간이 걸렸습니다. (이것은 약 10 년 전입니다. 아마도 더 빨리 찾을 수있을 것입니다.)

물론 "줄 끝에 괄호"를 사용하면 추가 줄이 줄어든다. 그러나 나는 개인적으로 그 스타일을 싫어한다. (나는 직장에서 그것을 사용하고 예상보다 덜 불쾌한 것을 발견했지만 여전히 약간 불쾌합니다.)


나는 항상 일관성이 실제 스타일보다 중요하다고 주장합니다. 왜 우리는 사용의 경우에만 예외를 만들어야합니까?
Bob

@ 밥 : 좋은 지적, 나는 가끔 할 뿐이다. 나는 합리적인 이유가, 내가 여기에 :) 사실 실제 이유가 척하지 것처럼 - 그 같은 using이 (만 using이)를 중첩는 매우 분명하다, 당신은 여전히 끝낼 블록. 나는 즉시 위험을 볼 수 없습니다.
Jon Skeet

물론 위험 이 없다고 말하는 것은 아닙니다 .
Jon Skeet

1
이 버그에 대한 최상의 솔루션 : Python을 사용하십시오. (물론
키딩

10

한 줄 블록에서 중괄호를 건너 뛸 때 잠재적 인 버그가 발생할 가능성이 컴퓨터 프로그래밍 분야의 동료들에게 큰 충격을주지 않는다는 것에 깊은 인상을 받았습니다.

나는 그것이 똑똑하지 않다는 것을 의미한다고 생각합니다. 이 문제를 여러 번 실수했습니다. 나는 이것에 관한 다른 사람들의 실수를 디버깅했다. 이 때문에 버그가있는 소프트웨어가 제공되는 것을 보았습니다 (VS2002를 실행하는 컴퓨터에 대한 RDP 및 시계 창 글꼴이 불안정합니다).

코딩 스타일을 변경하여 피할 수 있었던 모든 실수를 살펴보면 목록이 매우 깁니다. 이 각각의 경우에 접근 방식을 변경하지 않았다면 아마도 프로그래머로 만들지 않았을 것입니다. 다시, 나는 똑똑하지 않다고 생각한다. 보상하기 위해, 나는 오랫동안 한 줄 블록에 중괄호를 꾸준히 사용했습니다.

즉, 오늘날 모세가 그것을 우리에게 가져 왔을 때보 다 오늘날에는 "한 줄 블록에 버팀대를 사용해야한다"라는 규칙이 덜 관련이 있도록하는 몇 가지 사항이 바뀌 었습니다.

  • 일부 유명한 언어는 프로그래머가하는 것처럼 컴퓨터가 들여 쓰기를 읽음으로써 문제를 해결합니다 (예 : Python).

  • 편집자가 자동으로 서식 을 지정하므로 들여 쓰기로 오인 될 가능성이 크게 줄어 듭니다.

  • TDD 는 한 줄 블록으로 혼란스러워서 버그를 도입하면 버그를 빨리 발견 할 가능성이 훨씬 높다는 것을 의미합니다.

  • 리팩토링과 언어 표현 은 내 블록이 훨씬 짧고 한 줄 블록이 이전보다 훨씬 자주 발생한다는 것을 의미합니다. 가설 적으로, ExtractMethod를 무자비하게 적용하면 전체 프로그램에서 단일 행 블록 가질 수 있습니다 . (어떻게 생겼는지 궁금 하신가요?)

사실, 무자비하게 리팩토링하고 한 줄 블록에서 중괄호를 생략하면 뚜렷한 이점이 있습니다. 중괄호를 볼 때 머리에 "복잡함을 조심하십시오!"라는 작은 경보가 울릴 수 있습니다. 이것이 표준이라면 상상해보십시오.

if (condition) Foo();   // normal, everyday code

if (condition) 
{
    // something non-trivial hapening; pay attention!
    Foo();
    Bar();
}

코딩 규칙을 "단일 블록에는 중괄호가 없을 수 있습니다"또는 "조건과 같은 줄에 블록을 넣을 수 있고 80 자 이내로 입력 할 수있는 경우" 괄호 생략 ". 우리는 볼 수 있습니다.


전 Java 프로그래머 인 저는 자동화 된 형식이 문제에 대한 진정한 해답이라는 것에 완전히 동의해야합니다. 자동으로 들여 쓰기 만하면 애매 모호함을 피하는 데 도움이됩니다. 물론 파이썬으로 전환 했으므로 처음에는 코드를 올바르게 형식 지정하는 데 익숙해졌습니다.
Alan Plum

중괄호에 대해서도 마찬가지입니다. 복잡성에 관한 것입니다. 이상적으로는 하나의 라인 블록 만 갖습니다. 그것이 내가 가독성이라고 부르는 것입니다. 불필요한 괄호가 아닙니다.
Igor Popov

9

세 가지 규칙 중 :

if(addCurleyBraces()) bugFreeSofware.hooray();

과:

if(addCurleyBraces())
    bugFreeSofware.hooray();

및 (열기와 닫는 중괄호를 사용하여 들여 쓰기 스타일을 나타냅니다) :

if(addCurleyBraces()) {
    bugFreeSofware.hooray();
}

나는 마지막 것을 선호합니다 :

  • 모든 if 문이 균일 한 방식으로 작성되면 더 쉽게 읽을 수 있습니다.
  • 소프트웨어를 조금 더 강력하고 버그없이 만들 수 있습니다. 그러나 모든 최신 IDE 및 고급 텍스트 편집기에는 멋진 자동 들여 쓰기 기능이있어 주석 형식을 엉망으로 만들거나 팀 표준에 위배되지 않는 한 모든 사람이 사용해야한다고 생각합니다 (많은 경우 사용자 정의 형식 지정 체계를 만들 수 있음) 팀과 공유하십시오). 여기서 요점은 들여 쓰기가 올바르게 수행되면 버그 도입 위험이 약간 줄어 듭니다.
  • 부울 식과 문을 실행하여 다른 줄에있는 것을 선호합니다. 디버깅 목적으로 행을 표시하고 싶습니다. 명령문을 표시하고 단계를 수행 할 수있는 IDE를 사용하더라도 대화 형 작업이며 디버깅을 시작한 위치를 잊어 버릴 수 있습니다. 적어도 몇 가지 코드를 단계별로 실행하는 데 약간의 시간이 더 걸립니다. 시간 (디버깅 중에 매번 수동으로 위치를 표시해야하기 때문에).

8

중괄호 사용에 대한 주요 주장은 추가 줄을 사용하고 추가 들여 쓰기가 필요하다는 것입니다.

줄은 (거의) 무료이므로 코드의 줄 수를 최소화하는 것이 목표가되어서는 안됩니다.

들여 쓰기는 중괄호 사용법과 무관합니다. 계단식 '사용'예에서 여전히 중괄호를 생략하더라도 들여 쓰기해야한다고 생각합니다.


8

단정하고 간결한 코드를 작성하는 데는 강한 신자이지만 항상 중괄호를 사용합니다. 그것들은 특정 코드 줄이 존재하는 범위를 신속하게 볼 수있는 편리한 방법이라는 것을 알았습니다. 모호함이 없으며, 그것은 분명히 당신 앞에서 명시됩니다.

어떤 사람들은 그것이 선호되는 경우라고 말할 수도 있지만, 내부적으로 일관성이 있다면 프로그램의 논리적 흐름을 따르기가 훨씬 쉽다는 것을 알았습니다.

if(x < y)
    x = y;
else
    y = x;

그리고 이와 같은 또 다른 것;

if(x < y)
{
    x = y;
    x++;
}
else
{
    y = x;
    y++;
}

나는 단지 하나의 일반적인 스타일을 고르고 그것을 선호합니다 :)


7

주요 문제 중 하나는 제어문과 분리하여 1 라이너 및 1 라이너가 아닌 영역이있는 경우입니다 for.if 가지고있는 것)과 그 끝이 분리 된 상태입니다.

예를 들면 다음과 같습니다.

for (...)
{
  for (...)
    for (...) 
    {
      // a couple pages of code
    }
  // which for block is ending here?  A good text editor will tell you, 
  // but it's not obvious when you're reading the code
}

4
어쨌든 for 루프에 몇 페이지의 코드가있는 이유는 무엇입니까?
Adam Jaskiewicz 오전

b / c 나는 둔감 한 clod이고, 함수 호출의 "비용"을 없애는 것에 집착하고있다. :)
rampion

4
두 페이지의 코드는 일반적으로 별도의 기능에 있어야합니다.
Jonathan Leffler 2018

1
실례합니다. 저는 그런 응고의 역할을하고있었습니다. 그러나 작은 뷰포트를 통해 볼 때 짧은 지역에서도 동일한 문제가 발생할 수 있다고 생각합니다. 그리고 그것은 코더가 통제 할 수없는 것입니다.
rampion

7

예전에는 "중괄호는 필수입니다!"를 강력하게지지했지만, 단위 테스트를 채택한 이후로 단위 테스트를 통해 다음과 같은 시나리오에서 중괄호가없는 문장을 보호 할 수 있습니다.

if (foo)
    snafu();
    bar();

좋은 단위 테스트를 통해 가독성을 향상시키기 위해 간단한 문장에 대해 중괄호를 자신있게 생략 할 수 있습니다 (예, 주관적 일 수 있음).

또는 위와 같은 경우 다음과 같이 인라인 할 수 있습니다.

if (foo) snafu();

이렇게하면 조건에 bar ()를 추가해야하는 개발자는 중괄호가 부족하다는 것을 인식하고 추가하는 것이 더 적합 할 것입니다.


2
당신은 "필요하지 않다"고 말한 다음 그것을 사용하는 이유를 밝혔습니다 : 가독성!
tvanfosson 2016

4
나는 그것을 찾기 위해 단위 테스트에 의존하지 않을 것입니다. 어쩌면 단위 테스트 번호!
Kristen

2
@Kristen-단위 테스트의 아이디어는 방법의 동작을 주장하는 것입니다. 위에서 설명한 것처럼 동작이 변경되면 단위 테스트가 실패합니다. 나는 그 문제를 보지 못했다.
Liggy

그러나 왜 UT에 가기 전에 수정해야 할 눈에 띄게 눈에 띄도록 단위 테스트를 사용해야합니까?
앤드류

7

개인적인 판단을 사용하십시오.

if (foo)
  bar();

그 자체로는 괜찮습니다. 모론이 나중에 이와 같은 것을 넣는 것에 대해 정말로 걱정하지 않는 한 :

if (foo)
  bar();
  baz();

모르 론에 대해 걱정하지 않는다면 괜찮습니다. (기본 코드 구문을 제대로 얻을 수 없다면 이것이 가장 적은 문제입니다)>

그에 비해 훨씬 더 읽기 쉽습니다.

나머지 시간 :

if (foo) {
  bar();
  baz();
}

내가 기억할 수있는 한 내가 가장 좋아하는 것입니다. 또한 :

if (foo) {
  bar();
  baz();
} else {
  qux();
}

나를 위해 작동합니다.

수직 공간 자체는 그다지 관련성이 없으며 가독성이 좋습니다. 한 줄의 여는 중괄호는 눈이 다음 줄로 넘어갈 때까지 구문 요소에 대한 대화를 중지합니다. 내가 좋아하는 것이 아닙니다.


내가 첫 번째 스타일을 선호하는 유일한 시간은 무언가가 잘못되었을 때 즉시 돌아 오거나 오류를 던져야 할 때입니다. 처럼 if (parameter == null) return null;.
nawfal

7

자, 이것은 죽음에 대한 답변이 된 오래된 질문입니다. 추가 할 것이 있습니다.

먼저 브레이스를 사용하십시오. 그것들은 가독성에만 도움을 줄 수 있으며 어셈블리를 작성하지 않는 한 가독성 (자신과 다른 사람들을위한)은 우선 순위 목록에서 매우 높아야합니다. 읽을 수없는 코드는 항상 버그로 이어집니다. 중괄호로 인해 코드가 너무 많은 공간을 차지하게되면 메서드가 너무 길 것입니다. 올바르게 수행하는 경우 대부분 또는 모든 방법이 한 화면 높이에 맞아야하며 찾기 (F3)는 친구입니다.

이제 내 추가 사항 : 이것에 문제가 있습니다.

if (foo) bar();

bar ()가 실행되는 경우에만 발생하는 중단 점을 설정하십시오. 코드의 후반부에 커서를 두어 C # 에서이 작업을 수행 할 수는 있지만 명확하지 않으며 약간의 고통입니다. C ++에서는 전혀 할 수 없었습니다. C ++ 코드를 다루는 가장 선임 개발자 중 한 명이 이런 이유로 'if'문을 두 줄로 나눌 것을 주장합니다. 그리고 나는 그에게 동의합니다.

이렇게하십시오 :

if (foo)
{
    bar(); //It is easy to put a breakpoint here, and that is useful.
}

2
바를 마우스 오른쪽 버튼으로 클릭하고 중단 점 삽입 ...을 선택하십시오. 도구를 아십시오.
Bob

표시기 막대를 마우스 오른쪽 단추로 클릭해도 아무 것도 수행되지 않습니다. 텍스트를 마우스 오른쪽 버튼으로 클릭 하시겠습니까? 어쨌든 "if"문이 true이고 "bar ()"가 자체 행에있을 때 중단 점 만 맞추려면 커서를 해당 행의 아무 곳에 나 놓고 F9를 누르거나 지표 마진. 그러나 모든 코드가 한 줄에있는 경우 커서를 "bar ()"에 놓거나 F9를 누르기 전에 정확히 마우스 오른쪽 버튼을 클릭해야하며 표시기 여백을 클릭해도 작동하지 않습니다 ( ' 만약'). "단단한"것은 아니지만 코드가 두 줄에있을 때는 집중력이 덜 필요합니다.
stone

오, 하하 "bar ()"를 마우스 오른쪽 버튼으로 클릭하십시오. 당신은 텍스트를 의미했습니다. 알았어 물론, 아니면 F9를 누르십시오 ...
stone

>> 당신이 ") 바 ("에 커서를 위치 또는 오른쪽 F9 키를 누르기 전에 정확히이 클릭해야, (나는 커서가 정확히이 전 중 하나 F9 또는 오른쪽 클릭을 눌러 위치를 의미)

7

중괄호가있는 코드가 많은 공간을 차지하지 않도록하기 위해 코드 완성 책에서 권장하는 기술을 사용합니다 .

if (...) {
    foo();
    bar();
}
else {
    ...
}

나는 그것이 다운 모뎀 된 이유를 알지 못합니다. 매번 사용하는 모든 브래킷 쌍에 대해 한 줄을 저장합니다
Eric

2
이것은 K & R 스타일로 더 널리 알려져 있습니다. Kernighan and Ritchie의 C 프로그래밍 언어 : en.wikipedia.org/wiki/The_C_Programming_Language_(book) . 그리고 그것은 당신을 무너 뜨리지 않아야합니다.
jmucchiello

감사! 나는 그것이 개인적인 취향이라고 생각했다. 나는이 구문을 스스로 성가 시게 찾았지만 Code Complete를 읽은 후에 그것을 채택하여 실제로 그것을 즐겼습니다.
Nathan Prather

나는 "왜 아무도 아직 이것을 제안하지 않았는가?" 닫는 괄호는 닫는 블록, 즉 "if"또는 "while"등의 의미가없는 "{"가 아닌 블록과 맞 춥니 다. +1.
nickf 2016 년

열린 중괄호가 항상 자체적으로 행에 배치 if되는 경우 하나의 들여 쓰기 된 행이 뒤에 오는 중괄호는 시각적으로 중괄호없이 단일 명령문을 제어하는 ​​것으로 시각적으로 인식 될 수 있습니다. 따라서 열린 중괄호 스타일은 if명령문이 의미 적으로 단일 조치 인 것을 제어 하는 상황에서 공백을 절약 합니다 (단일 단계 만 포함하는 일련의 단계와 구별됨). 예를 들어, if (someCondition)/`throw new SomeException (...)`.
supercat

6

코드가 있다고 가정 해 봅시다.

if (foo)
    bar();

그런 다음 다른 누군가가 와서 추가합니다.

if (foo)
    snafu();
    bar();

작성된 방식에 따라 bar (); 이제 무조건 실행됩니다. 중괄호를 포함하면 이러한 종류의 실수를 방지 할 수 있습니다. 코드는 그러한 실수를 어렵게 만들거나 불가능하게하는 방식으로 작성되어야합니다. 코드 검토를 수행하고 누락 된 괄호, 특히 여러 줄에 걸쳐있는 것을 발견하면 결함이 발생합니다. 그것이 정당화되는 경우, 그러한 오류를 일으킬 가능성이 다시 최소화되도록 한 줄로 유지하십시오.


그 점은 이미 질문에서 이루어졌습니다.
Mike Scott

사실은 아닙니다. 예, 그는 이런 종류의 버그의 가능성에 대해 언급했지만 모범 사례의 일부로 코드를 버그 방지하고 오류 가능성을 제거하는 것에 대해 이야기했습니다.
Elie

실제로 버그 증명 코드와 같은 것이 있습니까?
Bob

아니요,하지만 더 어렵게 만들 수 있습니다. Jason Cohen의 "Peer Code Review의 가장 중요한 비밀"(여기 페이지 쪽의 링크 참조)을 읽으면 왜 그런지 더 잘 알 수 있습니다.
Elie

이 마이크 스캇은 누구이며 왜 경찰에 대답합니까? 사람들이 명백한 것을 진술해야한다는 것이 항상 저를 깨뜨립니다. 따라서 Mike가 사용자가이 문제에 대해 게시 한 추가 설명에 대해 계속 언급하지 않은 이유는 무엇입니까? 모든 답변이 질문에 관한 것은 아닙니까?
bruceatk

6

줄을 줄이는 것은 중괄호를 떨어 뜨리는 데 실제로 좋은 주장이 아닙니다. 분석법이 너무 큰 경우 아마도 더 작은 조각으로 리팩토링하거나 재구성해야합니다. 그렇게하면 단순히 중괄호를 쓰는 것보다 가독성이 향상됩니다.


5

첫 번째 예와 같이 필요할 때 항상 생략합니다. 글을 읽고 이해할 수있는 깨끗하고 간결한 코드는 스크롤하여 한 줄씩 읽어야하는 코드보다 유지 관리, 디버그 및 이해가 더 쉽습니다. 나는 대부분의 프로그래머가 이것에 동의 할 것이라고 생각한다.

여러 중첩, if / else 절 등을 시작하면 쉽게 벗어날 수 있지만 대부분의 프로그래머는 선을 그릴 위치를 알 수 있어야합니다.

나는 그것이 if ( foo == 0 )vs에 대한 논쟁과 같은 것을 본다 if ( 0 == foo ). 후자는 새로운 프로그래머 (그리고 때로는 재향 군인의 경우)의 버그를 예방할 수 있지만 코드를 유지 관리 할 때 전자 프로그래머가 더 빨리 읽고 이해하는 것이 더 쉽습니다.


4

대부분의 경우 회사 또는 FOSS 프로젝트에 관계없이 코딩 표준으로 세분화됩니다.

궁극적으로 다른 사람이 코드를 작성해야하고 각 개발자가 작업중인 코드 섹션의 특정 스타일을 파악해야하는 시간이 많이 걸립니다.

또한 누군가가 하루에 두 번 이상 Python과 Cish 언어 사이를 가고 있다고 상상해보십시오 ... Python 들여 쓰기는 언어의 블록 의미론의 일부이며 인용 한 것과 같은 실수를하는 것은 매우 쉽습니다.


파이썬에 대한 의견은 +1입니다. 언어를 지속적으로 전환 할 때 "어리석은"사람이 될 수있는 것에 항상 놀랐습니다.
Kena

3

더 안전한 측면에서 오류가 발생할 수 있습니다-잠재적으로 수정할 필요가없는 버그가 하나 더 있습니다.

모든 블록이 곱슬으로 싸여 있으면 개인적으로 더 안전하다고 느낍니다. 한 줄짜리조차도 쉽게 실수를 방지하는 간단한 표기법입니다. 블록 본문을 블록 외부의 다음 명령문과 혼동하지 않는 것으로 블록의 내용을 명확하게 볼 수 있다는 점에서 코드를 더 읽기 쉽게 만듭니다.

하나의 라이너가있는 경우 일반적으로 다음과 같이 형식을 지정합니다.

if( some_condition ) { do_some_operation; }

줄이 너무 번거로운 경우 다음을 사용하십시오.

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