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.