중괄호가 자체 줄에 표시되어야합니까? [닫은]


273

중괄호가 자체 줄에 있어야합니까? 당신이 그것에 대해 어떻게 생각하십니까?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

아니면

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

또는

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

건설하십시오! 이유를 설명하고 경험을 공유하고 사실과 참고 자료로 뒷받침하십시오.


104
"== true"는 중괄호 배치 선택보다 더 산만합니다.
Dan Dyer

11
@ Dan : 나는 조건식을 설명하는 것이 항상 명확하게 도움이된다고 생각합니다.
Wizard79

4
이것이 중요한 이유는 IDE / 편집기가 중괄호 인식을 지원하지 않는 경우입니다.
leeand00

4
@ leeand00 : 우리 중 일부는 여전히 연구 / 주석을 달기 위해 복잡하고 익숙하지 않은 코드를 인쇄 합니다. 좋은 예쁘고 좋은 프린터는 대부분의 문제를 완화시킵니다.
Shog9

2
슬프게도 질문은 끝났습니다. 들여 쓰기 기반 구문 사용 시간이 지난 후 다른 중괄호 구조로 전환했습니다 (이상한 경우). 블록의 마지막 줄에서 첫 번째이지만 닫는 괄호처럼. (코드 라인 이후)
cnd

답변:


88

내가 학생이었을 때 같은 줄에 중괄호를 사용하여 줄이 적었고 코드는 더 적은 페이지에 인쇄되었습니다. 한 줄에 인쇄 된 단일 괄호 문자를 보는 것은 성가신 일입니다. (환경, 종이 낭비)

그러나 큰 응용 프로그램을 코딩 할 때 중괄호 만있는 일부 행을 허용하면 '그룹화'느낌을 고려하여 저렴합니다.

어떤 스타일을 선택하든 상관없이 자신의 두뇌가 관련 코드 조각 에서 여러 스타일을 처리하는 오버 헤드가되지 않도록 일관성을 유지 하십시오 . 다른 시나리오 (위와 같은)에서 다른 스타일을 사용하는 것이 좋다고 말하면 높은 수준에서 컨텍스트를 전환하는 것이 더 쉽습니다.


6
반면에 새 줄의 괄호는 ANSI 표준이며 K & R은 아닙니다. 그러나 표준에 대한 장점 은 다른 많은 것들이 있다는 것입니다 ( 백과 사전 uncyclopedia.wikia.com/wiki/AAAAAAAAA ! 참조 ).
Quandary

"줄 수가 적습니다"테라 바이트의 공간과 많은 픽셀이 있습니다. 왜 더 많은 회선을 사용해야합니까?
12431234123412341234123

1
@ 12431234123412341234123 : 일부 사람들이 코드 검토를 위해 코드를 인쇄하기 때문에 그가 의미한다고 생각합니다. 그리고 절대적으로 필요하지 않은 각각의 줄 바꿈은 종이 낭비이거나 1km²의 포레스트 낭비입니다. 그러나 인쇄하지 않으면 (확실하지 않습니다) ANSI는 K & R보다 훨씬 낫습니다. 또한 인쇄하려는 사람은 자동화 된 코드 포맷터를 사용해야합니다. 따라서 코딩 스타일이 아닌 툴링 문제입니다.
Quandary

247

세번째 방법은 절대로하지 말아야합니다.

중괄호를 훑어 보면 처음으로 몇 번의 키 입력을 줄일 수 있지만 다음에 오는 코더는 블록이 없음을 알지 않고 else 절에 무언가를 추가합니다.

다른 사람을 위해 코드를 작성하십시오.


113
그 작은 지혜가 어디서 유래했는지 알고 싶습니다. 그것을 귀찮게하지 않는 사람들을 위해 코드를 작성하는 것은 당신이 얻을 수있는만큼 무의미하기 때문에 ...
Shog9

69
두 번째 프로그래머는 무언가를 추가 할 때 자신의 중괄호를 추가 할 수 있습니다. 그는 바보가 아니며 간단한 규칙에 중괄호를 생략하도록 권장하는 코딩 규칙에서보아야 할 것입니다.
Ken Bloom

25
선택적 버팀대는 선택 사항이 아닙니다. C에서 만들어지고 그 후손들에게 전달 된 더 나쁜 디자인 결정은 거의 없습니다. C #만큼 최근에 언어로 살아가는 것이 저를 화나게합니다.
Adam Crossland

28
당신이 얼마나 똑똑하거나 한 줄 생략 된 curlies에 대한 코딩 표준이 얼마나 심오한지는 중요하지 않습니다. 문제 나 버그를 해결하려는 경우 curl이 생략 된 것을 놓칠 수 있습니다. 그리고 총 2 초의 작업 시간 동안, 명시 적으로 표현하기가 너무 나쁩니 까?
Jordan

11
3 번 스타일을 모두 놓치면 한 가지 장점이 있습니다. 한 번에 더 많은 코드를 화면에 표시합니다.
Loren Pechtel

203

오랫동안 나는 그들이 올바른 선택을함으로써 얻을 수있는 이익이 그에 대한 논쟁 비용 보다 훨씬 훨씬 먼 만큼 가치가 같거나 매우 비슷 하다고 주장 했다.

일치하는 것이 중요 하지만,. 그래서 동전을 뒤집어 코드 작성을 시작하겠습니다.

프로그래머가 이전과 같이 변화에 저항하는 것을 보았습니다. 극복 해! 나는 경력에서 여러 번 전환했습니다. C #에서는 PowerShell과 다른 스타일도 사용합니다.

몇 년 전에 저는 입력을 요청한 다음 결정을 내리고 모든 코드 기반에서이를 시행하기로 결정한 팀 (~ 20 명의 개발자)과 함께 일했습니다. 우리는 1 주일을 결정할 것이다.

많은 신음 소리와 눈 굴림. "나는 더 나아지기 때문에 내 방식이 마음에 듭니다".

우리가 질문의 세부 사항을 연구하면서 누군가가 같은 문제를 해결하는 방법을 물었습니다.

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

매개 변수 목록이 끝나는 위치가 즉시 명확하지 않으며 본문이 시작됩니다. 다음과 비교하십시오 :

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

우리는 전 세계 사람들이이 문제를 어떻게 처리했는지에 대해 약간의 독서를했으며, 개방형 괄호 뒤에 빈 줄을 추가하는 패턴을 발견했습니다.

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

시각적 인 휴식을 취하려면 중괄호를 사용하십시오. 그러면 시각적 휴식도 일관되게됩니다.

편집 : K & R 사용시 '추가 공백 라인'솔루션에 대한 두 가지 대안 :

1 / 함수 본문과 다르게 함수 인수를 들여 쓰기

2 / 첫 번째 인수를 함수 이름과 같은 행에 놓고 새 행의 추가 인수를 첫 번째 인수에 맞 춥니 다.

예 :

1/

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/편집하다

나는 여전히 다른 고려 사항보다 일관성이 더 중요하다고 주장하지만, 우리가 확립 된 선례 가 없다면 괄호로 넘어가는 길입니다.


33
참고로, 나는 합리적인 사람처럼 들릴지 모르지만 실제로는 너트입니다. 간단한 단일 행 블록의 경우 'if (foo) bar ()'를 모두 한 줄로 만들어서 중괄호 나 줄 바꿈을 사용하지 않습니다. 문제가되지 않도록 코드를 간단하게 만들려고 노력합니다.
Jay Bazuzi

38
정확히 이것을 게시하기 위해 여기에 왔습니다. 같은 줄에 여는 괄호를 유지하는 많은 사람들이 줄을 따라갑니다 (특히 클래스와 메소드의 시작 부분). 그렇지 않으면 클래스 / 메소드 헤더를 본문에서 분리하기가 어렵 기 때문입니다. 어쨌든 여분의 줄을 사용하려는 경우 괄호를 넣고 들여 쓰기가 더 쉽다는 이점을 얻을 수 있습니다.
Yevgeniy Brikman

27
빈 줄을 보지 못했습니다. MyFunction () 매개 변수가 다른 줄에 닿을 때 이중 들여 쓰기에 더 익숙합니다.
Armand

34
매개 변수를 여러 줄로 나누는 것은 미친 짓입니다.
Fosco

10
"function parameter"인수는 빨간 청어입니다. 분명히이 주장은 이중 의도 된 것이어야한다. 다음 코드와 구별하기 위해 아무런 문제가 없습니다.
David Ongaro

99

기본 규칙은 다음과 같습니다.

  1. 프로젝트의 기존 코딩 표준을 따르십시오.
  2. 코딩 표준이없고 다른 사람이 소유 한 기존 코드베이스를 편집하는 경우, 원하는 코드의 양과 상관없이 기존 코드의 스타일과 일치해야합니다.
  3. 그린 필드 프로젝트를 진행중인 경우 다른 팀원과 논의하고 공식 또는 비공식적 인 코딩 표준에 대한 합의에 도달하십시오.
  4. 단독 개발자로서 그린 필드 프로젝트를 수행하는 경우 자신의 생각을 구성한 후, 무자비하게 일관성을 유지하십시오.

외부 제약이없는 경우에도 기존 (일반적으로 사용되는) 코딩 표준 또는 스타일 지침을 찾아이를 따르는 것이 가장 좋습니다 (IMO). 자신만의 스타일을 굴리면 몇 년 후에 후회하게 될 가능성이 큽니다.

마지막으로, 기존 스타일 체커와 코드 포맷터를 사용하여 구현 / 구현할 수있는 스타일이 수동으로 "강제"되어야하는 것보다 낫습니다.


10
이 답변에는 더 많은 투표가 필요합니다.
AShelly

1
일관성 이 핵심입니다
MediaVince

70

첫 번째 방법의 이점은 더 수직적으로 작기 때문에 화면에 더 많은 코드를 넣을 수 있기 때문에 선호합니다. 두 번째 방법을 선호하는 유일한 주장은 여는 및 닫는 괄호를 더 쉽게 페어링 할 수 있다는 것입니다. 그러나 대부분의 IDE에는 키보드 단축키가 있으며 여는 괄호를 닫는 대신 엉뚱한 문장입니다. 대괄호를 사용하면 동일한 들여 쓰기 수준에서 닫는 대괄호를 "블록의 시작"식 (있는 경우)에 연결할 수 있으므로 블록의 시작 위치를 쉽게 결정할 수 있습니다.

앞의 for / while / if 구문이 이미 시각적으로 블록의 시작을 나타내는 경우 대괄호로만 전체 줄을 낭비 할 이유가 없습니다.

즉, 블록의 끝과 들여 쓰기 구조를 시각적으로 나타내는 데 무언가가 필요하기 때문에 닫는 괄호는 자체 줄에 있어야한다고 생각합니다.


12
아니요 ... 코드의 선명도에 추가되지 않는 것을 수행하여 화면에 맞는 코드의 양을 줄이는 이유는 무엇입니까?
EpsilonVector

6
코딩을 시작했을 때 나는 각각의 괄호를 그 자체로 좋아했습니다. 이제 첫 번째 방법을 선호합니다
NimChimpsky

57
증기 시대 초기 (Weinberg, "Psychology of Computer Programming")로 거슬러 올라가는 거대한 연구가 있는데,이 코드는 볼 수있는 코드의 양이 할 수있는 것보다 많으면 프로그래머의 이해력이 극적으로 떨어 졌다는 것을 보여줍니다 한 번에 볼 수 있습니다 (예 : 한 화면, 프린터 페이지). 이 현상은 수직 공간을 귀중한 자원으로 보는 데 강하게 주장하며, 낭비하지 않아야하므로 첫 번째 방법이 선호됩니다.
John R. Strohm

10
LOL @ "전체 라인 낭비". 세상에! 하지 그!! = P
Nick Spreitzer

6
@Julio 대학에서는 방법 1을 강력하게 선호했고 방법 2를 읽을 수 없었습니다. 표준이 방법 2 인 C #을 사용하는 회사에서 근무한 후에도 그 방법이 마음에 들었습니다. 이제 읽거나 사용할 수 있습니다. 어느 쪽도 나를 귀찮게하지 않습니다. 서로에 대해 강한 반대 반응을 보이는 사람들은 일반적으로 익숙하지 않은 것에 지나치게 반응합니다.
KChaloux

46

나는 선호한다

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

위에

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

you.postAnswer();한눈에 쉽게 읽고 찾을 수 있기 때문 입니다. 두 번째 방법으로, 그것은 위의 선과 혼합되어 you.hasAnswer()내 눈에 더 집중하여 읽을 수있게합니다.


7
프로그램이 화면 높이를 초과 할 때까지 마찬가지입니다. ;)
weberc2

13
@ weberc2 프로그램이 화면 높이를 초과하면 두 줄이 크게 변하지 않을 것이라고 생각합니다.
Mageek

13
10 년 전에는 스크린 공간에 대해 동의했을 것입니다. 오늘은 1920 * 1200 화면을 사용합니다. 그것은 뇌가 한 번에 처리 할 수있는 것보다 많은 코드에 적합합니다. 첫 번째 방법을 사용하면 읽을 필요없이 다른 스코프 열기 / 닫기를 볼 수 있습니다.
LightStriker

3
이 방법을 선호하는 이유를 결코 알 수 없었지만 정확히이 방법입니다.
Declan McKenna

2
@Mageek 이것은 뒤늦은 것이지만 2 줄이 아니며 모든 범위에 대해 2 줄입니다. O (1)이 아니라 O (N)입니다. 나는 실제로 그것에 대해 강하게 느끼지 않습니다. 긴 매개 변수 목록을 읽을 수있는 스타일을 선택하는 것이 더 중요합니다.
weberc2

38

첫 번째 방법을 선호합니다. 괄호는 완전히 별도의 라인 가치가 없습니다.

문제는 중괄호가 중요하지 않다는 것입니다. 그것들은 단지 구문 쓰레기입니다 . 이것은 코드가 무엇인지, 코드의 목적과 구현 방식을 이해하는 데 절대적으로 필요하지 않습니다. 화면 공간이 부족하여 운영자를 시각적으로 그룹화 할 수없는 구식 C 유사 언어에 대한 찬사 일뿐입니다.

중괄호가없는 언어 (Python, Haskell, Ruby)가 있습니다. 이것은 중괄호가 쓰레기임을 확인하기 만하며 가능할 때마다 줄을 가질 자격이 없어야합니다.

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
하스켈이나 루비에 대해서는 잘 모르지만 파이썬은 공백에 민감하므로 블록을 나타 내기 위해 중괄호 나 다른 구분 기호가 필요하지 않습니다. 버팀대는 단순한 구문 소음이 아닙니다. 그들은 실제 목적에 봉사합니다.
Robert Harvey

14
@Robert, C에서는 공백과 중괄호를 모두 사용해야합니다 . 파이썬에서는 공백 만해야합니다. 어떤게 더 좋아?
P Shved

5
@Pavel, C에서 whitepace를 수행 할 필요가 없습니다.
Ken Bloom

7
공백이없는 @KenBloom C 프로그램은 읽을 수 없습니다. 그래서 당신은 어쨌든 그들을해야합니다.
P Shved

6
중괄호가 좋은 아이디어인지 아닌지에 관계없이, 언어를 사용하지 않는 언어가 존재한다고해서 그 반대 또는 반대 주장처럼 보이지는 않습니다. 단지 언어 설계가 좋지 않거나 언어가없는 것이 아니라 언어가없는 것이 가능하다는 것을 제안합니다.
Jason

37

파이썬을 사용하고 인수를 완전히 회피하십시오.


17
+1SyntaxError: not a chance
세스

6
이것은 방대한 대다수의 프로젝트에 대한 옵션이 아닙니다. 또한 그룹화에 대한 들여 쓰기에는 많은 문제가 있습니다.
Bryan Oakley

@ 브라이언, 나는 이것이 실용적이지 않다는 것을 알고 있습니다. 나는 단지 의견보다 더 강력해야한다고 생각했습니다. 그리고 탭과 공백을 섞지 않았기 때문에 들여 쓰기로 인한 문제에 결코 부딪치지 않았습니다.
마크 랜섬

Go를 사용하여 인수를 완전히 회피하십시오 (정적 타이핑, 속도 및 컴파일러와 함께!) :)
weberc2

4
그런 다음 스페이스 바를 한 번 이상 누르고 컴파일러 / 통역사가 당신을 비웃는 것을 지켜보십시오. 대부분의 중괄호 언어에서는 발생하지 않습니다.
Pharap

27

중괄호의 위치는

메타 데이터

프로그래머가 IDE에서 구성 할 수 있습니다. 이런 식으로 모든 코드의 성가신 중괄호는 저자와 상관없이 동일하게 보입니다.


7
전적으로 동의합니다. 데이터가 아니라 프레젠테이션입니다.
Petruza

문제는 모든 사람이 자신의 것을 설정하게하면 커밋이 완료 될 때 상황이 매우 빠르게 지저분해진다는 것입니다.
Andy

1
@Andy : 바로 이것이 요점입니다. IDE는 모양이 바뀌지 만 IDE에서만 나타납니다! 실제 소스는 건드리지 않습니다. 버전 제어의 경우 중괄호 설정이 일반적인 상황에 맞게 변환되도록 후크를 추가하여 모든 사람이 동일한 방식으로 코드를 체크 아웃 할 수 있습니다.
klaar

@klaar 내가 사용한 모든 최신 IDE는 탭을 공백으로 변경하고 중괄호를 자체 줄 또는 "개시"줄 끝으로 이동합니다. 이 경우 소스에 영향을 미치지 않는다고 생각하는 이유가 확실하지 않으므로 이것이 나의 의견의 이유입니다. 일반적으로 개발자 설정에 따라 IDE에 의해 변경됩니다. 커밋 중에 괄호가 자신의 라인으로 이동함에 따라 소음이 많은 변경 사항이 표시되어 누군가가 실제로 변경 한 내용이 숨겨집니다.
Andy

@Andy : 설명 된 노이즈 문제를 피하기 위해 공백과 중괄호와 관련된 불일치를 균일 한 표준 uppon 커밋으로 변환하는 후크를 사용할 수 있습니까? 어느 쪽이든, 올바른 버전 관리 시스템 공백이나 기타 무의미한 것과 같은 사소한 것을 초월 해야합니다 .
klaar

19

따라 다릅니다.

Javascript 또는 jQuery로 코딩하는 경우 첫 번째 양식을 사용합니다.

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

그러나 C #으로 코딩하는 경우 두 번째 형식을 사용합니다. 왜냐하면 C #에서 정식 방법이기 때문입니다.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

귀하의 예를 작성할 수 있습니다

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

C #에서.


1
block-statement는 진술이므로 많은 언어로 작성 될 수 있습니다. 첨가! :-)
Tamara Wijsman

2
"프레임 워크 설계 지침"에 따르면, "정규적인 방법"은 동일한 버팀대에 첫 번째 형태로 오프닝 브레이스를 배치하는 것입니다. 그냥 말하십시오 ...
Uwe Honekamp

3
@ Uwe : 아마도. 그러나 Microsoft는 모든 MSDN C # 예제에 대해 "정렬 괄호"접근 방식을 채택했으며 Visual Studio에 구워졌습니다.
Robert Harvey

@ Uwe : 그것은 Cwalina의 책이며 그보다 훨씬 많은 이름을 지니고 있습니다. MSDN의 FDG는 그것에 대해 아무 말도하지 않습니다. 또한 프레임 워크 디자인 가이드 라인이 C # 코딩 실습 에 대해 언급 한 이유가 무엇인지 궁금 합니다.
R. Martinho Fernandes

3
사실 자바 스크립트에서 같은 줄에 중괄호를 붙여야합니다. 중괄호가 자체 줄에 있으면 오류가 발생할 수 있습니다. 예를 들어, encosia.com/…을
Joseph Hansen

18

이 예제에서 실수를보기가 더 어렵 기 때문에 첫 번째를 선호합니다.

if (value > maximum);
{
    dosomething();
}

이 예에서보다

if (value > maximum); {
    dosomething();
}

이것으로 ; {끝나는 줄보다 나에게 더 잘못 보이 ;므로 눈치 채실 것입니다.


11
당신은 좋은 주장을하지만 개인적으로 이것은 5 년 동안 한 번만 나에게 일어난 일입니다. 왜 실행되지 않았는지 알 수 없었고 SO에 게시했으며 누군가 세미콜론을 빠르게 지적했습니다. 그러나 1 줄을 사용하지 않기 위해 압축 될 때마다 읽기가 더 어렵습니다.
JD Isaacks

6
"; {"는 일종의 윙크하는 심술 face은 얼굴이거나 수염을 가진 사람처럼 보입니다.
glenatron의

+1 훌륭한 예 : 매우 간과되는 실수로 쉽게 간과했습니다. 이것을 보여주는 레이아웃에서도 자극적이라고 생각했습니다.
therobyouknow

10
물론 괜찮은 IDE는 빈 제어문을 표시하고 괜찮은 컴파일러는 경고를 발행합니다.
Dunk

@Dunk 당신의 주장에 대한 유일한 결함은 (내가 강력하게 동의하는) 요즘 많은 사람들이 해석하는 언어 (JavaScript, PHP 등)를 사용하고 있다는 것입니다. 라떼.
Craig

15

나는 1의 약간의 변형을 선호한다

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

왜?

  • 나는 항상 자신의 줄에 중괄호를 넣으면 가독성이 떨어집니다. 화면에 특정 양의 소스 코드 만 넣을 수 있습니다. 대괄호 스타일 2)는 많은 중첩 루프와 조건부로 고통스럽게 긴 알고리즘을 만듭니다.

  • 그러나 나는 시각적으로 함께 하고 else새로운 라인에서 시작 하고 싶습니다 . 앞에 괄호가 있으면 무엇에 속하는 항목을 찾는 것이 훨씬 더 어렵습니다.ifelseelse

  • 3) 자격을 상실합니다. 괄호를 생략하고 잊어 버린 경우 발생할 수있는 나쁜 일을 모두 알고 있습니다.


1
나는 내가 일하는 곳에서 이것을 보았습니다. 흥미 롭군.
Almo

1
필자는 else필요할 때 줄 위에 주석을 달거나 if-block과 else-block 사이에 빈 줄을 두어 물건이 덜 보이게 보이도록하기 때문에이 스타일을 더 좋아합니다 . 대괄호 스타일 # 2는 동작을 조건에서 분리하는 것 외에는 아무것도하지 않습니다. 그렇게 말하면, 내가 가장 좋아하는 것은 확실히 파이썬의 대괄호 스타일이 아닙니다. :)
sayap

4
화면의 코드 라인 수를 최대화하는 것이 중요하다면 개행을 완전히 제거하십시오. 한 화면에 많은 줄을 얻을 수 있습니다. 나는 읽는 동안 잠깐 멈추고 생각하게하는 것을 선호하지 않는다. 더 읽기 쉬운 내 정의. 중괄호로 내 마음은 그들을 무시합니다. 괄호없이 내 마음은 제어 블록을 일시 정지하고 정렬해야합니다. 긴 일시 정지가 아닌 일시 정지.
덩크

1
그렇습니다. 그리고 만약 서로 함께 속해 있다면, {와}도 마찬가지이며}는 별도의 줄에 있으므로 {도 역시 별도의 줄에 있어야합니다. "내 화면에는 특정 양의 소스 코드 만 넣을 수 있습니다"그리고 이것이 바로 3) "자격을 상실"한다고 말하는 것이 전혀 옵션이 아닙니다. 3 년 동안 일한 후 3) 새로운 코드 줄을 추가 할 때 대괄호를 잊어 버린 적이 없으며 누구도 알지 못합니다. 사람들에게 코드를 조정해야한다면 누가 제대로 읽을 수 없습니까? 일부 코드 리더에서 이해할 수없는 특정 언어 기능 사용을 중지 하시겠습니까?
카이저 루디

10

나는 어떤 책의 저자들이 다음과 같은 형식의 코드를 원한다는 것을 읽었습니다.

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

그러나 게시자의 공간 제약으로 인해 다음을 사용해야했습니다.

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

이제는 그것이 더 이상 사실인지 알지 못하지만 (더 이상 찾을 수 없기 때문에) 후자의 스타일은 책에서 매우 널리 퍼져 있습니다.

개인 수준에서는 다음과 같이 별도의 줄에 괄호를 선호합니다.

a) 새로운 범위를 나타냅니다.
b) 불일치가 발생했을 때 쉽게 발견 할 수 있습니다 (이것은 오류를 강조하는 IDE에서는 문제가되지 않지만).


... 두 번째 옵션은 또한 두 지점을 모두 용이하게합니다 (들여 쓰기만으로 중괄호 / 들여 쓰기 콤보의 목적을 수행함). :)
weberc2

10

아, 진정한 중괄호 스타일 .

그것은 예언자 (Richard "나의 길 또는 고속도로"Stallman)까지도 거룩한 길을 위해 모든 것을 갖추고 있습니다.

그 사람은 많은 것들에 대해 너무 잘못했지만 GNU는 중괄호와 관련하여 자리에 있습니다.


[업데이트] 나는 빛을 보았고 이제는 Allman을 숭배합니다


9
나는 lisp 코드를 모델링하는 것 이외의 GNU 스타일의 요점을 보지 못합니다. 약간의 이익을 위해 많은 작업처럼 보입니다.
Robert Harvey

GNU 스타일을 사용하는 사람은 아무도 없습니다. 1TBS.
Jé Queue

물론 lisp 스타일을 제외하고는 블록 당 두 가지 들여 쓰기 수준보다 더 나쁘게 할 수는 없습니다.
ergosys

4
버팀대 스타일 링크의 경우 +1 그것은 당신의 스타일이 무엇이든, 많은 훌륭한 사람들이 당신과 동의하지 않음을 보여줍니다.
Florian F

@RobertHarvey 추가 작업이 없다면 코드를 작성하거나 올바르게 구성하는 데 올바른 도구를 사용하지 않는 것입니다. 이점은 훨씬 더 읽기 쉬운 코드이며 대괄호의 모든 오류가 매우 빠르다는 것을 알 수 있으며 서브 블록을 무시하면서 코드 만 쉽게 읽을 수 있습니다.
12431234123412341234123

9

두 번째 예는 가독성이 매우 큽니다. 다른 방법으로 블록을 차단하는지 볼 수는 없습니다 = (


1
연구 결과에 따르면 코드베이스가 화면 높이를 초과하면 소형 코드를 쉽게 읽을 수 있습니다.
weberc2

5
@ weberc2, 연구 논문에 DOI를 제공 할 수 있습니까?
Grzegorz Adam Kowalski

9

간단한 대답 : 디버깅하기가 더 쉬운 것은 무엇입니까?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

어떤 경우 먼저 문제를 진단 했습니까?

개인 취향에 신경 쓰지 않고 (화이트 스미스와 알을 포함한 다른 많은 스타일이 있습니다) 코드를 읽고 디버깅 하는 능력을 방해하지 않는 한 많이 신경 쓰지 않습니다. 하는 .

"폐기물 공간"인수에 관해서는, 나는 그것을 사지 않습니다. 어쨌든 프로그램을 더 명확하게하기 위해 논리 그룹 사이에 빈 줄을 추가하는 경향이 있습니다 ...


1
그것들은 주로 짧은 코드 블록이기 때문에 디버그하기 쉽습니다. 들여 쓰기는 일관성이있어 실제 코드 블록을 쉽게 시각화 할 수 있습니다.
Htbaa

@ Htbaa : 실제로 :) 왜 귀찮게합니까?
Matthieu M.

@MatthieuM. 첫 번째 블록은 함수 서명, for 문 및 if 문 사이의 줄 바꿈 (두 번째 블록)이 관련이 없다고 생각하지만 분명히 관련이 없기 때문에 나에게 더 의미가 있습니다. 빈 줄은 관련이없는 코드 비트를 분리하는 것입니다. 다른 코드 줄에 가까운 코드는 실제로 관련되어 있음을 의미합니다. 이것은 물론 'imo'이지만, 당신의 요점이 무엇인지 궁금합니다. 편집 : 또한 적절한 IDE는 괄호가 누락되어 코드를 해석 할 때 오류가 발생합니다.
klaar

7

누구도 알지 못하지만 이것이 중괄호 가 조건부 와 같은 줄 에 속하는 이유 입니다 (매우 긴 조건부를 제외하고는 가장 중요한 경우입니다).

C에서 이것은 유효한 구문입니다.

while (true);
{
    숯불 c;
    getchar (); // 입력 대기
}

빨리! 이 코드는 무엇을합니까? "입력을 요청하는 무한 루프"라고 대답하면 틀린 것입니다! 심지어 입력에 도달하지도 않습니다. 에 잡히게됩니다 while(true). 끝에 세미콜론이 있습니다. 이 패턴은 실제로는 더 일반적입니다. C는 블록의 시작 부분에 변수를 선언해야하므로 새로운 변수가 시작되었습니다.

한 줄의 코드는 생각입니다. 중괄호는 조건부 또는 루프를 포함하는 생각의 일부입니다. 따라서 그들은 같은 줄 에 속합니다 .


이것은 지금까지 내가 본 K & R 스타일에 대한 최고의 주장이며, 나머지는 코드 폴딩을 지원하는 오늘날의 IDE 시스템에서 웃을 수 있습니다. 이것은 ;블록 끝 을 지원하는 C 스타일 언어에만 적용 됩니다. 이것이 IMHO가 구식이며 Go 언어가이를 증명하는이 블록 엔딩 시스템을 멸시하는 이유이기도합니다. 이 시나리오에서는 아니지만이 문제를 여러 번 보았습니다. 일반적으로 진술에 무언가를 추가하고 잊어 버리는 곳에서 발생합니다.
제레미

5

나는 첫 번째 방법을 좋아한다. 더 깔끔한 IMO처럼 보이며 더 컴팩트합니다.

편집 : 아, 세 번째. 나는 그것이 더 작거나 더 적기 때문에 가능한 한 그 것을 가장 좋아합니다.


5

당신은 그것을 쓸 수 있습니다 :

you.hasAnswer() ? you.postAnswer() : you.doSomething();

질문에 대답하기 위해; 나는 자신의 줄에 중괄호를 선호했지만 브라우저에서 자동 세미콜론 삽입으로 인한 버그를 생각하지 않기 위해 자바 스크립트에 이집트 스타일을 사용하기 시작했습니다. 그리고 일식으로 Java를 코딩 할 때 기본 괄호 스타일과 싸우거나 구성하는 데 관심이 없었 으므로이 경우에도 이집트와 함께갔습니다. 이제 나는 둘 다 괜찮습니다.


그런 식으로 사용하는, postAnswer()그리고 doSomething()종종 그렇지 않은 삼항 연산자에 대한 값을 반환해야한다 : 그들은 매우 잘 무효 (값)을 반환 할 수 없습니다. 또한 (적어도 c #에서) 결과는 ?:일부 변수에 할당되어야합니다
ASh

4

여기에있는 거의 모든 대답은 "무엇을하든 한두 가지를 고수한다"는 몇 가지 변형을 말합니다.

그래서 나는 그것에 대해 잠시 생각했고, 그것이 중요하지 않다는 것을 인정해야했습니다. 누구든지 다음을 따르기가 어렵다고 정직하게 말할 수 있습니까?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

나는 다른 사람에 대해 확신하지 못하지만 스타일 사이에서 정신적으로 앞뒤로 전환하는 데 전혀 문제가 없습니다. 코드가 무엇을하는지 알아내는 데 약간의 시간이 걸렸지 만 C-like 구문을 무작위로 입력 한 결과입니다. :)

겸손하지 않은 의견으로는 여는 중괄호는 코드 가독성과 거의 관련이 없습니다. 위에 나열된 몇 가지 코너 사례가 있는데 하나의 스타일 또는 다른 스타일이 차이를 만들지 만 대부분 빈 줄을 신중하게 사용하면 정리할 수 있습니다.

FWIW, 직장에서의 코딩 스타일은 약간 더 구조화 된 형태 1과 수정 된 형태 3을 사용합니다. (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

빈 줄이 더 강한 시각적 분리를 제공하기 때문에 형식 2를 강력하게 선호하는 사람들이 형식 1의이 버전을 더 잘 찾을 수 있을지 궁금합니다.


4
예제에서 알 수 있듯이 들여 쓰기는 읽을 수있는 코드의 중괄호보다 훨씬 중요합니다. 실제로 일부 언어는 들여 쓰기 를 명령문을 중첩 시키는 유일한 방법으로 만듭니다!

1
글쎄, 나는 당신이 일관성이없는 예제를 읽기 어렵다고 생각합니다. 정말 어렵지는 않지만 일관된 경우보다 어렵습니다.
Almo

나는 Almo에 동의합니다. "정말 어려운가요?"의 경우는 아닙니다. 힘들지 않더라도 "확실히 어렵다"의 경우이다. 그렇다면 왜 더 힘들게 만들까요? 사람들이 제공하는 "장난감"예제에서 차이는 거의 없습니다. 내 경험에 따르면 다른 사람으로부터 불쾌한 코드를 상속 받고 방법 1을 사용하면 논리를 따를 수 있도록 방법 2로 전환해야하는 경우가 종종 있습니다. 자주 필요하다는 사실 때문에; 어떤 방법이 더 좋고 이해하기 쉬운 지 질문에 자동으로 응답합니다.
Dunk

@ 덩크 : 관련이없는 세부 사항을 서로 바꿔서 눈에 띄게 개선되는 코드를 만들 수는 없습니다.
jkerian 2013

@ jkerian- 분명히 프로젝트 나 회사를 떠난 다른 사람들로부터 많은 코드를 상속받지 못했습니다. 나는 수년간의 경험을 가진 사람이라면 그 상황에 빠지지 않을 수 없습니다. 그러나 다시, 모든 사람의 작업 상황이 다릅니다. 또한 "공식적인"코드 검토를 수행해야하는 경우 형식화에 큰 차이가 있습니다. 코드를 자연스럽게 읽을 수있는 것이 매우 중요합니다. 물론 나는 중괄호와 일치하도록 일시 중지하고 생각할 수 있지만 프로세스 속도가 느려집니다. 한 가지 방법은 일시 중지 할 필요가없고 다른 방법은 일시 중지 할 필요가 없습니다. 그렇기 때문에 다른 선택이 권장되는 이유를 알 수 없습니다.
Dunk

4

이것이 아직 제기되지 않은 것에 놀랐습니다. 블록을 더 쉽게 선택할 수 있기 때문에 두 번째 방법을 선호합니다.

중괄호가 같은 열과 자체 행에서 시작하고 끝나는 경우 여백 또는 열 0의 커서를 사용하여 선택할 수 있습니다. 일반적으로 마우스를 선택하거나 키보드를 선택하면 키를 적게 사용하는 더 넓은 영역에 해당합니다.

나는 원래 조건부와 같은 줄에서 중괄호로 작업했지만 스위치를 전환했을 때 작업 속도가 빨라졌습니다. 물론 밤낮은 아니지만 조건부 옆의 괄호로 약간 작업하는 속도가 느려집니다.


저와 같은 오래된 타이머는 3 개의 키 스트로크를 사용하여 빌어 먹을 버팀대가 어디에 있든 블록을 선택합니다.
ergosys

2

나는 개인적으로 두 번째 방법을 좋아합니다.

그러나 내가 보여줄 방법은 최고의 직업 안전을 가져 오기 때문에 내 의견으로는 최고입니다! 내 대학의 한 학생이 숙제를 도와달라고 요청했는데 이것이 그의 코드 모양입니다. 전체 프로그램은 하나의 단일 블록처럼 보였습니다. 흥미로운 점은 그가 만든 프로그램의 버그 중 95 %가 일치하지 않는 괄호에서 나왔다는 것입니다. 다른 5 %는 버팀대가 일치하면 분명했습니다.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
나쁜, 나쁜, 나는 끔찍한, 끔찍한 예를 의미합니다. 문제는 중괄호가 아닙니다! 미친 들여 쓰기입니다!
R. Martinho Fernandes

@Martinho Fernandes 나는 중괄호와 들여 쓰기가 함께 진행될 것이라고 생각했습니다 ...
AndrejaKo

2
반드시 ... 위의 내용을 적절히 들여 쓰고 중괄호 스타일을 임의로 바꾸면 이해할 수 있습니다.
jkerian

사실, 이것에 대해 생각하면이 질문에 대한 제 자신의 대답에 동기가됩니다.
jkerian

"그가 만든 프로그램의 버그 중 95 %가 일치하지 않는 중괄호에서 나왔습니다"-해석되지 않은 언어로만 컴파일되지 않았습니다.
Mawg

2

개인적으로 선호하는 것은 첫 번째 방법입니다. 아마도 그것이 처음 PHP를 배운 방식이기 때문일 것입니다.

한 줄짜리 if문장에 대해서는

if (you.hasAnswer()) you.postAnswer();

그것이 아니라면 you.postAnswer();같은 많은 이상하지만 뭔가, you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);내가 아마 첫 번째 유형으로 되돌릴 수 있습니다 :

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

나는 줄 바꿈을 사용하지 않으며 else진술 이있는 경우이 방법을 사용하지 않을 것 입니다.

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

이론적 인 가능성이지만 내가 사용한 적이 없습니다. 이것은로 설정해야합니다

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

그들은해서는 안됩니다. 나를위한 첫 번째 방법.

사용하지 않는 줄 (마지막 닫는 중괄호 이외의 중괄호 만있는) 때문에 두 번째 줄을 보면 코드의 연속성을 깨뜨린 것처럼 느껴집니다. 빈 줄에 특별한주의를 기울여야하기 때문에 빨리 읽을 수는 없습니다. 일반적으로 코드 목적이나 이와 비슷한 것을 의미하지만 "이 줄은 중괄호에 속합니다"(의미 만 반복합니다) 들여 쓰기).

어쨌든 텍스트를 쓸 때와 마찬가지로 단락 앞에 빈 줄이 있으면 단락 시작 부분에 들여 쓰기를 추가하는 것이 불필요합니다 (단락 변경의 이중 부호). 제대로 들여 쓰기.

또한 이미 언급했듯이 화면에 더 많은 코드를 넣을 수 있습니다. 그렇지 않으면 약간 비생산적입니다.


2

플랫폼 / 언어 / 컨벤션에 따라 다릅니다.

자바에서 :

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

C #에서

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

C에서 :

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Java 사람들이 C # 코드에서 스타일을 사용하거나 그 반대의 경우가 싫습니다.


3
C 스타일은 항상 나를 괴롭 혔습니다. 일관성을 유지하십시오!
Christian Mann

1

내가 말할 수있는 것은 여러분이 방법 # 3의 팬이라면 지구상의 모든 IDE 코드 포맷터에 의해 박해를받을 것입니다.


1

첫 번째 방법은 더 작고 화면에 더 많은 코드를 허용하기 때문에 간단하게 사용합니다. 나는 중괄호를 페어링하는 데 아무런 문제가 없었습니다.if 조건을 추가하기 전에 명령문 하고 대부분의 환경에서는 일치하는 중괄호로 이동할 수 있습니다).

당신이 경우 않았다 시각적으로 중괄호를 페어링해야합니다, 그럼 내가 두 번째 방법을 선호 할 것입니다. 그러나 한 번에 더 적은 코드를 허용하므로 더 많이 스크롤해야합니다. 그리고 적어도 저에게는 중괄호를 깔끔하게 정렬하는 것보다 코드를 읽는 데 더 큰 영향을 미칩니다. 나는 스크롤이 싫어. 그런 다음 다시 한 번 스크롤해야 할 경우if 명령문 명령문이 너무 커서 리팩토링이 필요합니다.

그러나; 가장 중요한 것은 일관성입니다. 둘 중 하나를 사용하십시오 – 둘 다 사용하지 마십시오!


0

12시에 프로그래밍을 처음 배울 때는 Microsoft 코딩 자습서가 그와 같이 괄호를 다음 줄에 추가했습니다. 나는 또한 그 당시 4-space TABS를 들여 쓰기했다.

몇 년 후, 나는 Java와 JavaScript를 배웠고 같은 라인 코드를 더 많이 보았 기 때문에 바뀌었다. 나는 또한 2 칸 간격으로 들여 쓰기 시작했습니다.


5
+1, -1 편집자가 탭 길이를 임의의 길이로 조정할 수 있으므로 왜 탭을 들여 쓰지 않겠습니까? 그렇지 않으면 8시에 진정한 들여 쓰기를 좋아하는 코드를 저주하는 많은 사람들이 있습니다.
Jé Queue

0

괄호를 정렬 상태로 유지하지만 공간을 낭비하지 않는 네 번째 옵션이 있습니다.

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

유일한 문제는 대부분의 IDE 자동 포매터가 이것에 질식한다는 것입니다.


9
...이 문제에 질식하는 대부분의 프로그래머와 마찬가지로.
Jé Queue

4
끔찍한 것 같습니다. 맨 위에 줄을 삽입하거나 맨 위 줄을 제거하려면 추가 노력을 기울여야합니다. 줄을 삭제하고 계속 진행할 수 없으며 중괄호를 다시 삽입해야합니다.
Bryan Oakley

롤이 대단해! :) 첫 번째 스타일보다 낫습니다!
nawfal

분명히 이름도 있습니다. Horstman SyyleWikipedia에 언급되어 있습니다. 나는 이와 같은 코드베이스로 작업했지만 실제로 사용하는 것은 나쁘지 않습니다.
AShelly

-1

프로젝트 관리자가 해당 프로젝트를 작업하는 모든 프로그래머가 코딩하는 동안 따라야하는 일부 코딩 제약 조건 또는 표준이 설정되어있는 프로젝트에서 작업하지 않는 한이 모든 것은 여러분에게 달려 있습니다.

개인적으로 첫 번째 방법을 선호합니다.

또한 세 번째 방법으로 보여주고 싶은 것을 얻지 못했습니까?

그렇게 잘못되지 않습니까? 예를 들어 상황을 다음과 같이 고려하십시오.

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

누군가가 몇 가지 더 문을 추가하고자하는 경우 이제 어떤 경우 블록에 합니까?

이 경우 세 번째 방법을 사용하면 컴파일러에서 구문 오류가 발생합니다.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
누군가가 와서 행하면 더 나빠질 것입니다 : if (you.hasAnswer ()) you.postAnswer (); 그렇지 않으면 you.doSomething (); you.doSomethingElse (); -미묘한 버그에 대한 레시피입니다. 눈이 쉽게 미끄러질 수 있고 컴파일러도 도움이되지 않습니다
FinnNk

@FinnNk : 정확히!
Chankey Pathak

2
누군가가 다른 진술을 추가하고 싶다면 중괄호 안에 넣을 수 있습니다. 그의 소금 가치가있는 프로그래머라면 실제로 그것을 이해할 수 있어야합니다.
Robert Harvey

그의 세 번째 방법이 잘못되었다고 말하고 싶었습니다.
Chankey Pathak

3
@Robert Harvey, 나는 매우 숙련 된 코더가 기존 코드를 수정할 때 중괄호를 추가하지 못하는 것을 보았습니다. 문제는 들여 쓰기가 중괄호보다 의미에 대한 더 강한 단서라는 것입니다 (특히 여러 중괄호 스타일이 있기 때문에) 들여 쓰기가 예상대로 보이는 경우 누락 된 중괄호를 간과하기 쉽습니다.
AShelly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.