K & R과 1TBS (One True Brace Style) 스타일의 차이점은 무엇입니까?


48

들여 쓰기 스타일에 대한 Wikipedia 기사를 읽었 지만 여전히 이해하지 못합니다. K & R과 1TBS의 차이점은 무엇입니까?


나는 K & R의 스타일이 공간 고려 사항에 의해 지배되는 곳을 읽었다. 즉, 코드가 책에서 차지하는 수직 공간을 줄이는 것이다.
— ChrisF

@ChrisF 또한 화면의 수직 공간을 줄입니다. 우리가 80 col x 25 라인 터미널을 가질 때 그만한 가치가있었습니다!
— Martin Beckett

7
Apple의 "goto fail"은 1TBS를 사용하여 확실히 방지 할 수있는 심각한 버그의 좋은 예입니다. imperialviolet.org/2014/02/22/applebug.html

4
애플의 버그는 문장을 한 줄로 작성, 교정, 데드 코드 검사기 또는 들여 쓰기에 민감한 언어를 사용하여 예방할 수 있습니다.
— Cees Timmerman

1
@CeesTimmerman, .. 또는 테스트 중 ...
— thoni56

답변:


76

K & R과 진정한 중괄호 스타일 (1TBS)의 가장 큰 차이는 1TBS에, 모든 것입니다 if, else, while, 그리고 for그들이 필요하지 않은 경우에도 문을 열고 닫는 중괄호가 있습니다. 새로운 문을 쉽게 삽입하고 그룹화 할 방법을 정확하게 파악하는 것이 목적입니다.

예로서:

K & R :

int i;
for (i = 0; i < 10; i++)
  printf("Hi.");

1TBS :

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}

20

K & R은 다음과 같습니다 :

if (x) 
    a();
else {
    b();
    c();
}

즉, 중괄호는 필요한 경우에만 사용되며 제어문과 동일한 행에서 중괄호를 열고 자체 행에서 중괄호를 닫습니다.

"하나의 진정한 중괄호 스타일"(1TBS 또는 OTBS)은 단일 제어 명령문을 중괄호로 묶어 복합 명령문으로 바꿉니다.

if (x) {
    a();
} else {
    b();
    c();
}

Allman 스타일은 1TBS보다 약간 더 넓으며 오프닝 브레이스를 한 줄에 배치하여 수직 간격을 강제합니다.

if (x) 
{
    a();
}
else 
{
    b();
    c();
}

편집하다:

"데니스 리치 (Dennis Ritchie)는 훌륭한 언어를 발명했을뿐만 아니라 정말 좋은 괄호 스타일을 생각해 낸 매우 똑똑한 사람이었습니다."

어쨌든 오만하다고 주장하는 사람들에게는 약간의 도전이 있습니다 .Sourceforge, Github 등으로 가서 K & R 브레이스 스타일을 사용하여 프로젝트를 선택하십시오. 버그와 커밋에 대한 그들의 기록을 살펴 보고 그들이 사용한 브레이스 스타일로 인해 발생한 하나의 버그 를 찾으십시오 .

그렇게 많은 일을하고 싶지 않다면 간단한 통계 분석을 해보십시오. 다른 버팀대 스타일을 사용하여 프로젝트를 비교하고 브레이싱 스타일과 관련된 버그 수 (심각도 등)에서 통계적으로 유의 한 차이 인 "양식 성"을 표시 할 수 있는지 확인하십시오.

나는 몇 년 전에이 두 가지를 모두 수행했으며 브레이스 스타일에 기인 할 수있는 단일 버그를 찾을 수 없었으며 두 가지 사이의 통계적으로 중요한 상관 관계에 도달하는 것을 찾을 수 없었습니다. 평균적으로 K & R 브레이싱을 사용하는 사람들은 버그가 약간 적었지만 그 차이는 통계적으로 유의미 할 정도로 너무 작습니다.

그것이 제기 된 이후로, 나는 다중 진술 매크로로 상황에 대해 언급 할 것입니다. 여러 명령문을 포함하지만 중괄호 자체로 둘러싸 지 않는 매크로에는 버그가 있습니다. 내 임무는 그 버그를 다루는 코드를 작성 하지 않는 것입니다. 반대로, 제 임무는 그 버그를 가능한 빨리 찾아서 없애는 것입니다.

진단되지 않고 수정되지 않은 버그를 커버하기 위해 코드를 작성하는 것은 완전히 악한 일입니다. 당신이 원한다면 그 거만이라고 부르십시오. 그러나 나는 이것을 협상에 가까운 것으로 보지 않습니다. 버그는 발견하지 않고 수정해야합니다. 존재가 길수록 수정하기가 훨씬 어려워지고 비싸 질 가능성이 높습니다.


1
삐걱 거리는 소리와 소음으로 내려간 주석을 모두 삭제했습니다. 유효한 포인트가 있으면 답변으로 게시하십시오. 토론을 원하시면 대화
— ChrisF

8
1tb가}와 다른 행을 한 줄에 넣지 않습니까? 놀라운 아름다운 대칭을 유지하면서 수직 공간을 절약하는 것이 포인트입니다!
— Martin Beckett

4
@Jerry - 물론 좋은 거룩한 전쟁은 몇 분열을 ;-) 필요
— 마틴 베켓

6
실패하다; 실패하다;
— Jamie Pate

9
예, 여기에서 분석 되는 Apple SSL 버그 인 @JamiePate의 의견을 따르십시오 . 그 if뒤에 들여 쓰기 된 문장 이있는 문장이 있으므로 조건부로 모두 실행되는 것처럼 보입니다. 그러나 중괄호는 없습니다! 두 번째 문장은 실제로 그 너머에 if있으며 항상 실행될 것이므로 버그입니다.
— 콜린 D 베넷

9

일반적으로 KR 브레이스 스타일의 문제점은 코드 리팩토링입니다. 코드를 움직일 때 무언가 주위에 괄호가 없다는 것을 놓치기 쉽고, 잘못 움직이거나 (조건부로 실행되었다고 생각하는 무언가를 움직이십시오) 더 이상 작동하지 않을 때 머리를 긁거나 불행히도 코드 영역이 제대로 테스트되지 않았고 검은 모자가 악용하는 방법을 찾을 때까지 버그가 눈에 띄지 않습니다. 디버거로의 빠른 여행은 문제를 발견하면 쉽게 찾을 수 있지만 그렇지 않은 경우에는 ...


2
이것은 단지 이전 답변에서 설명되고 설명 된 반복 된 것으로 보인다
— gnat

1
다른 답변이 일상적인 코드에서 문제가 어떻게 발생하는지 정확하게 설명하지는 않습니다. OTB가 무엇인지 설명하지만 실제로 중요한 이유는 설명하지 않습니다. 의견은 그에 대한 답변을 제공하지는 않을 것입니다.
— 저스틴 스완 하트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.