“무용 한 괄호”를 제거하는 그의 사랑으로 누군가가 삼촌에게 도전 할 수 있습니까?


94

유료 콘텐츠를 참조하는 것이 싫지만 이 비디오 는 내가 말하는 내용을 정확하게 보여줍니다. Robert Martin에서 정확히 12 분은 다음과 같습니다.

일부 코드

"내가 가장 좋아하는 일 중 하나는 쓸모없는 괄호를 없애는 것"이라고 말합니다.

더 많은 코드

오래 전에, 멀리 떨어진 교육에서 나는 그렇지 않은 if경우에 의해 제어되는 다른 들여 쓰기 된 줄을 추가하여 버그를 쉽게 도입 할 수 있기 때문에 이것을하지 말라고 배웠습니다 .

밥 아저씨에게 공평하게, 그는 긴 Java 메소드를 아주 작은 함수로 리팩토링하고 있습니다. 그가 변경을 마치면 (22.18) 다음과 같이 보입니다.

더 많은 코드

그것이 괄호 제거의 유효성을 검사 해야하는지 궁금합니다. 이미 모범 사례에 익숙 합니다 . 이 시점에서 Bob 아저씨에게 도전 할 수 있습니까? 밥 아저씨가이 아이디어를 변호 했습니까?


6
이 질문에 대한 답이 "아니오"또는 "예, 여기에 인용이 있기 때문에"이 주제를 주 제외로 닫으려고 투표하고 있습니다.
Blrfl

35
몇 년 동안, 그는 쓸모없는 줄 바꿈도 제거하고 "만약 ((뭔가)를 참조하십시오); 실제로 코드 줄이 것입니다 ;-)
Steve Jessop

8
@SteveJessop 내가 몇 년 앞서 있다고 들었습니다. : D 줄 바꿈이 없으면 악명 높은 버그의 위험이 없습니다. 필요에 따라 중괄호를 추가 / 제거하면 추가 오버 헤드가 발생하지만 읽을 때 훨씬 더 많이 저장됩니다.
maaartinus 2016 년

9
Bob 아저씨 는 클린 코드 (35 페이지)에서이를 수행하는 데 도움이되는 몇 가지 점 을 제시 합니다 if. 더 많은 행을 추가해야하는 경우 if블록을 한 행으로 다시 줄이는 또 다른 함수 여야합니다 (함수 호출). 이를 준수하면 중괄호 는 전혀 중요하지 않습니다 .

13
그는 그가 return (page==null) ? "" : includePage(mode,page);간결 해지기를 원한다면 그냥해야 합니다 ... 전문적으로 앱을 개발하기 시작할 때까지 중괄호 스타일이 멋지다고 생각했습니다. 차이 노이즈, 오타 버그 등 항상 존재하는 버팀대는 나중에 소개하는 데 필요한 시간과 오버 헤드를 줄입니다.
vaxquis

답변:


47

가독성은 작은 것이 아닙니다.

단일 방법을 묶는 중괄호와 관련하여 혼합 된 마음입니다. 나는 한 줄 반환 진술과 같은 것들을 개인적으로 제거하지만 그러한 괄호를 없애면 실제로 내가 일했던 마지막 장소에서 우리를 매우 열심히 물었습니다. 누군가 if필요한 괄호를 추가하지 않고 명령문 에 코드 줄을 추가했으며 C이므로 경고없이 시스템을 중단했습니다.

나는 그 작은 실패 이후에 항상 중괄호를 사용하는 것에 대해 종교적인 사람에게 도전하지 않습니다.

따라서 가독성의 이점을 볼 수 있지만 이러한 중괄호를 제거 할 때 발생할 수있는 문제를 예리하게 알고 있습니다.

나는 연구 나 다른 사람의 발표 된 의견을 찾으려고 노력하지 않을 것입니다. 모든 사람은 하나의 의견 (즉, 의견)을 갖고 있으며 문체 문제이기 때문에 하나의 의견은 다른 의견만큼이나 좋습니다. 문제를 스스로 생각하고 장단점을 평가하며 자신의 저주받은 마음을 만드십시오. 작업하는 상점에이 문제를 다루는 코딩 표준이있는 경우 해당 표준을 따르십시오.


7
들여 쓰기가 잘못되어 오도 된 나는 최근에 이것에 조금 빠져있었습니다.
Andy

12

2
@CandiedOrange : 확립 된 교리에 도전하는 사람은 Bob 아저씨입니다.
Robert Harvey

1
@RobertHarvey 나는 그것을 명확히하지 않았습니까? 예, 그는 교리에 도전하고 있습니다. 그는 나의 교리에 도전하고있다. 나는 단지 좋은 학생이 되려고 노력하고 적어도 그것을 고려합니다. 그러나 밥 아저씨는 너무 카리스마가있어서 객관성을 잃고 있는지 궁금해합니다. 그래서 나는 koolaid를 마시기 전에 해독제를 찾는 데 도움을 요청하고 있습니다.
candied_orange 2016 년

1
@ CandiedOrange : 그것은 절대 상황입니다. 맹목적으로 교리를 받아 들인 사람들은 맥락을 고려하지 않습니다. 규칙의 유용성이 오래 지속되고 실제로 장애가 된 후에도 관리 언어에서 "한 번만 반환"규칙을 사용하는 규칙입니다.
Robert Harvey

133

여기 또는 여기 또는 자전거 창고가 페인트되어있는 곳 어디에서나 버팀목없는 스타일의 판촉 또는 거부 된 여러 출판물을 찾을 수 있습니다 .

자전거 창고에서 벗어나 2014 년의 위대한 OS X / iOS SSL 버그를 기억하십니까?

if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
    goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
    goto fail;
    goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
    goto fail;

괄호가없는 블록으로 인한 "원인" https://www.imperialviolet.org/2014/02/22/applebug.html

기본 설정은 가새 스타일에 따라 달라질 수 있습니다. 내가 써야한다면

if (suiteSetup)
{
    includePage(mode, suiteSetup);
}

공간을 절약하려는 경향이 있습니다. 그러나

if (suiteSetup) {
    includePage(mode, suiteSetup);
}

하나의 "추가"라인 만 사용합니다.


나는 당신이 묻지 않았다는 것을 알고 있지만, 혼자 일하고 있다면 나는 이단자입니다. 중괄호를 제거하면 선호합니다

if (suiteSetup != null) includePage(mode, suiteSetup);

iOS SSL 스타일 버그와 동일한 시각적 문제는 없지만 Bob 아저씨보다 "필요하지 않은"줄을 더 많이 절약 includePage(mode, suiteSetup) unless suiteSetup.nil?합니다. 글쎄, 단지 의견이 많다는 것을 알고 있습니다.


13
또한를 사용하면 } else[if(...)] {추가 줄이 추가되지 않으므로 전체에 걸쳐 하나의 추가 줄만 추가됩니다.
Random832

12
iOS SSL 버그를 제기하게되어 기쁩니다. 그 이후로, 나는 그런 상황에서 중괄호를 사용하는 것을 점점 더 많이 발견했습니다.
Zach Lipton

4
"goto fail"버그와 관련하여, Uncle Bob의 코딩 스타일의 다른 측면에서도이를 방지 할 수 있었으며, 가장 중요한 것은 매우 짧은 방법에 대한 그의 강한 선호도였습니다. 그는 처음에는 79 라인 방법을 허용하지 않았으며, 방법이 더 작은 방법으로 나뉘었을 경우 (a) 복제를 발생시킨 병합 충돌과 (b) 방법에서 간단한 흐름 제어 도달 할 수없는 코드에 대한 컴파일러 경고가 생성되어 문제를 방지했음을 의미했을 것입니다.
Jules

16
"goto fail"은 단일 라인 블록으로 인한 것이 아니라, 조잡한 프로그래밍, 더 거친 코드 검토, 심지어 코드를 수동으로 단계별로 실행하지 않았기 때문입니다.
gnasher729

35
Meh, 중괄호가 부족해도 그 버그는 발생하지 않았습니다. 끔찍한 프로그래머들 (그리고 의미있는 코드 검토, 테스트가 없음). 우리 나머지 사람들의 손을 묶지 말고 책임있는 사람들을 해고하여 문제를 해결하십시오!
궤도에서 가벼움 레이스

62

Bob 아저씨는 "항상 괄호 사용"이 일반적인 지혜 였을 때 흔한 일이 아니었던 그러한 실수에 대해 많은 방어 계층을 가지고 있습니다.

  1. 한 줄 조건부 조건에 대한 개인의 선호도가 높기 때문에 여러 줄 조건이 눈에 띄고 추가 검사를받습니다.
  2. 두 번째 줄을 삽입 할 때 자동으로 넘어지는 편집기입니다.
  3. 그가 지속적으로 실행하는 완전한 단위 테스트 세트.
  4. 완전한 통합 테스트 스위트.
  5. 그의 코드가 병합되기 전에 수행 된 동료 검토.
  6. 지속적인 통합 서버에 의한 모든 테스트의 재실행.
  7. 제품 품질 부서에서 수행 한 테스트

누군가 Bob 아저씨에게 도전을 게시했다면 위의 요점에 대해 꽤 반박 할 것입니다. 이것은 일찍 잡는 가장 쉬운 실수 중 하나입니다.


16
나는 조용히 실패하는 것을 두려워하는 방식으로 충돌을 두려워하지 않았습니다. 적어도 충돌이 발생했을 때 알고 있습니다. 내가이 물건을 볼 때 내 뇌의 등이 따끔 거린다. 내가 볼 때와 같은 방식으로 따끔 거립니다 while(true);{break;}. 실제로 유효한 컨텍스트가 있다면 극복하는 데 시간이 좀 걸릴 것입니다.
candied_orange 2016 년

9
includePage()하나 이상의 진술로 잘못 작성된 매크로가 아닌 자동 검사 방법이 있습니까?
Martin York

51
@LokiAstari 예, "Java에는 매크로가 없습니다"라고합니다.
svick 2016 년

11
위의 모든 내용은 실제로 "무용 한 괄호 정책을 사용해야하는 이유"보다 "무용 한 괄호"정책과 관련된 몰락이 나를 해치지 않도록하는 방법입니다. 당신이 그것들을 필요로하는 사실 (특히 # 1)은 장점보다 더 많은 단점으로 여겨 져야합니다.
SJuan76

16
@Jules 아 그래! 직장에서 받거나 출시 한 모든 제품은 100 % 테스트 범위 (최소한)를 가지고 있으며 동료 검토 (몇 번)되며 모든 비즈니스에는 소프트웨어 QA 부서가 있습니다. 예. 모든 비즈니스에는 단일 프로그래머 대신 프로그래머 팀이 있고 그들이 원하는 모든 테스트를 수행하기에 충분한 시간을 제공하기 때문에 전문 경력에서 똑같은 것을 발견했다고 생각합니다. 예, 모든 직장을 완벽하게 설명합니다. 우리의 소프트웨어가 항상 100 % 버그가없는 것으로 확신 할 때 추가 버그를 추가하는 것에 대해 왜 걱정해야합니까?
SJuan76

31

대부분의 경우 이것은 개인적인 취향이지만 고려해야 할 사항이 있습니다.

가능한 버그

이 추가 기능에 괄호를 잊고에 의한 버그 내가 한 것과, 희귀 주장 할 수 있지만 것을 그들이 일이 가끔 (유명한 잊지하지 IOS 고토 실패 버그). 따라서 코드 스타일을 고려할 때 이것이 요인이되어야한다고 생각합니다 (일부 도구는 들여 쓰기 에 대해 경고 하므로 도구 체인에 따라 다릅니다) .

유효한 코드 ( 버그 수있는 것처럼 읽음 )

프로젝트가 그러한 버그로 고통받지 않는다고 가정하더라도 코드를 읽을 때 버그 있는 것처럼 보이는 코드 블록이 보일 있습니다.

우리는 시작합니다 :

if (foo)
    bar();

개발자는 유용한 의견을 추가합니다.

if (foo)
    // At this point we know foo is valid.
    bar();

나중에 개발자가 확장합니다.

if (foo)
    // At this point we know foo is valid.
    // This never fails but is too slow even for debug, so keep disabled.
    // assert(is_valid(foo));
    bar();

또는 중첩 블록을 추가합니다.

if (foo)
    while (i--) {
        bar(i);
        baz(i);
    }

또는 매크로를 사용합니다.

if (foo)
    SOME_MACRO();

"... 매크로가 여러 줄의 코드를 정의 할 수 있기 때문에 매크로가 여러 줄에 사용 do {...} while (0)됩니까? 스타일 가이드에 포함되어 있어야하지만 경우에 따라 더 잘 검사해야합니다!"


위의 예제는 모두 유효한 코드이지만 코드 블록의 내용이 많을수록 실수가 없도록 더 많이 읽을 필요가 있습니다.

코드 스타일에 따라 여러 줄 블록에 코드가 없어도 중괄호가 필요하다고 정의 할 수 있지만 프로덕션 코드에 이러한 종류의 주석이 추가되는 것을 보았습니다. 당신이 그것을 읽을 때, 그 줄을 마지막으로 편집 한 사람이 중괄호를 잊어 버렸다는 의심의 여지가 있습니다. 때로는 다시 확인해야 할 필요성이 의도 한대로 작동한다고 생각합니다 (특히 코드 의이 영역에서 버그를 조사 할 때) .

차음 노이즈

단일 라인에 버팀대를 사용하는 실질적인 이유 중 하나는 확산 노이즈 를 줄이는 것 입니다.

즉, 변경 :

if (foo)
    bar();

에:

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

... 조건부 행이 변경 될 때 diff에 나타나게하므로 작지만 불필요한 오버 헤드가 추가됩니다.

  • 코드 검토에서 행이 변경된 것으로 표시됩니다. diffing 도구가 단어 기반 인 경우 괄호 만 변경되었음을 쉽게 알 수 있지만 행이 변경되지 않았는지 확인하는 데 시간이 더 걸립니다.
    모든 도구가 단어 기반의 diffing을 지원하는 것은 아니며 diff (svn, git, hg 등)는 멋진 도구를 사용하더라도 전체 줄이 바뀌는 것처럼 보일 것입니다. 때로는 평범한 줄을 빠르게 살펴볼 필요가 있습니다. 변경 내용을 확인하기 위해 기반 diff.
  • 주석 도구 (예 git blame:)는 행이 변경된 것으로 표시하므로 행의 원점을 추적하여 실제 변경 을 찾을 수 있습니다.

이것들은 모두 작으며, 변경된 코드 라인을 커밋하는 코드 검토 또는 추적에 소요되는 시간에 달려 있습니다.

diff에서 여분의 라인을 변경하는 데있어 실질적인 불편은 코드의 변경으로 인해 충돌이 발생하여 병합되고 수동으로 해결 해야 할 가능성이 높습니다 .


{자체 라인 이있는 코드베이스에는 예외가 있습니다. 문제는 아닙니다.

은 diff 소음 이 스타일로 작성하는 경우 인수는 보유하지 않습니다

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

그러나 이것은 일반적인 관습이 아니기 때문에 주로 완성도에 대한 답변을 추가합니다 (프로젝트 가이 스타일을 사용해야한다고 제안하지 않음) .


8
나는 정의 플러스 인 의견 차이를 줄이는 것이 좋습니다.
Martin York

2
JSON에 열광하는 모든 사람 만 diff noise를 고려했다면! 쉼표가없는 규칙을보고 있습니다.
로마 Starkov

1
허, 나는 {자체 라인 스타일 의 diff-noise 이점을 고려하지 않았습니다 . 나는 그 스타일을 정말로 싫어하고 그 스타일이 필요한 프로젝트 작업을 싫어합니다. 어쩌면 그걸 염두에두고 그렇게 코딩하는 것이 조금 덜 실망 스럽습니다. 코드 밀도가 중요합니다. 모니터에서 모든 기능을 한 번에 볼 수 있으면 모든 것을 쉽게 파악할 수 있습니다. 가독성을 높이기 위해 (관련 문장을 그룹화하기위한) 함수 안에 별도의 코드 블록 사이에 빈 줄을 남기고 다른 장소에서 공간을 낭비하도록 강요하면 의도 된 중단이 약해집니다.
Peter Cordes 2016 년

1
@ peter-cordes는 또한 {자체 스타일 의 팬이 아니며 답변 완성을 위해 포함했습니다. 사용하는 매크로를 신뢰에 관해서는 do{}while(0), 나는이 가진 문제는 당신이 찾을 를 신뢰 거의 모든 시간. 문제는 사고가 발생하고, 코드 검토로 오류가 사라질 수 있으며, 그렇지 않은 버그가 발생할 수 있다는 것입니다.
ideasman42

2
잠재적 인 버그를 나열하는 경우 개별 라인을 주석 처리하는 기능이 또 다른 좋은 방법입니다. 누군가 맹목적으로 한 줄 if 문 본문을 주석 처리하여 발생한 버그를 추적하고있었습니다. 다음 명령문은 무조건 실행되지 않고 조건부로 실행되었습니다.
Eldritch Cheese

15

몇 년 전, 나는 C 코드를 디버깅하기 위해 들여왔다. 버그는 찾기가 어려웠지만 결국 다음과 같은 문장으로 요약되었습니다.

if (debug)
   foo (4);

그리고 그것을 쓴 사람 foo은 매크로로 정의되었다는 것이 밝혀졌습니다 . 줄의 코드가 있는 매크로입니다 . 물론이 두 줄 중 첫 번째 줄만 if. (따라서 두 번째 줄은 무조건 실행되었습니다.)

이것은 C와 그 전 처리기 (컴파일 전에 대체를 수행하는)에 절대적으로 고유 할 수 있지만, 결코 잊어 버리지 않았습니다. 그런 종류의 일이 당신에게 표시를 남깁니다. 특히 다양한 언어와 툴체인을 사용하고 다른 곳에서 그런 shenanigans가 가능하지 않다고 확신 할 수없는 경우 안전하게 재생하지 않는 이유는 무엇입니까?

이제 다른 사람과 다르게 괄호를 들여 쓰고 사용합니다. 단일 라인의 if경우 다음을 수행합니다.

if (debug) { foo (4); }

괄호를 포함하기 위해 추가 줄이 필요하지 않습니다.


6
이 경우, 그 매크로를 작성한 사람이 잘못입니다.
gnasher729

6
C 전 처리기 매크로를 올바르게 작성하는 것은 직관적이지 않지만 수행 할 수 있습니다. gnasher729가 지적했듯이 완료해야합니다. 그리고 귀하의 예는 둘 이상의 명령문을 포함하는 매크로가 해당 본문을 do { ... } while(0)루프 에 포함해야하는 이유 입니다. 이렇게하면 if()명령문 을 묶음으로써 항상 올바르게 처리 될 수있을 뿐만 아니라 명령문 끝의 세미콜론이 올바르게 삼켜집니다. 이러한 간단한 규칙을 모르는 사람은 전 처리기 매크로를 작성해서는 안됩니다. 발신 사이트에서 방어하는 것은 방어하기에 잘못된 장소입니다.
cmaster

18
@ cmaster : 사실이지만 다른 사람들이 매크로 (또는 다른 언어 기능)를 작성하는 방법은 내가 통제 할 수 없습니다. 중괄호를 사용하는 방법은 본인이 관리합니다. 나는 이것이 이것이 중괄호를 포함하는 철분 한 이유라고 말하지는 않지만 다른 사람들의 실수로부터 자신을 방어하기 위해 할 수있는 일입니다.
Wayne

@ gnasher729, 누가 다른 사람의 잘못인지 걱정합니까? 코드 검토를 수행하고 합리적인 코드 표준을 따르는 경우 팀 결함 일 수도 있습니다. 사용자에게 도달하면 버그가있는 소프트웨어를 공개하는 조직을 비난 할 것입니다.
ideasman42

1
매크로를 만든 사람은 누구나 잘못한 것입니다.
Neme

14

"밥 아저씨"는 그의 의견을 가질 수 있으며, 당신은 당신의 의견을 가질 수 있습니다. 그에게 도전 할 필요가 없습니다.

당국에 항소하려면 Chris Lattner를 선택하십시오. Swift에서 문장이 괄호를 잃어 버렸지 만 항상 중괄호가 있습니다. 토론은 없습니다. 언어의 일부입니다. 따라서 "Uncle Bob"이 중괄호 제거를 시작하면 코드 컴파일이 중지됩니다.

다른 사람의 코드를 살펴보고 "쓸모없는 버팀대를 없애는 것"은 나쁜 습관입니다. 코드를 검토해야하고 충돌이 불필요하게 발생하는 경우에만 추가 작업이 발생합니다. 어쩌면 "Uncle Bob"은 코드 리뷰가 필요없는 믿을 수 없을 정도로 좋은 프로그래머일까요? 최고의 프로그래머 한 명이 코드 검토없이 "if (p! = NULL)"을 "if (! p)"로 변경하여 최악의 장소에 숨겨져 일주일을 낭비했습니다.

이것은 대부분 무해한 스타일의 논쟁입니다. 중괄호는 중괄호를 추가하지 않고 다른 코드 줄을 삽입 할 수 있다는 이점이 있습니다. 로깅 문장 또는 주석과 같이 (설명 다음에 명령문이 오는 경우) 많은 디버거에 문제가 있다는 실질적인 단점이있는 것처럼 같은 줄에 그러나 원하는대로하십시오.


1
UB (sic!)가 자신의 의견을 사실로 제시하기 때문에 "도전"에 관한 것 같습니다.
vaxquis 2016 년

3
"원하는대로하세요"라고 말하는 것은 실제로 이것에 대해 Bob 아저씨의 의견에 동의하는 것입니다. 왜냐하면 그것이 "중요하지 않다"고 주장하기 때문입니다. 많은 언어에서 이것은 문제가되지 않습니다. 나는 이전에 항상 중괄호를 사용해야하는 문제가되는 모든 것을 생각했지만 그에 도전하는 사람을 보지 못했습니다. 자 여기 밥 아저씨가 도전하고 있으며, 리팩토링 된 아주 작은 방법으로 일하거나 그가 가득 찼기 때문에 그가 도망 가는지 궁금합니다. @PaulDraper가 그의 답변에서 언급 한 종류의 버그 때문에 정확히 무해하다고 생각하지 않았습니다.
candied_orange

다시 항상 : 구문 소음이 산만하고 가까운 중괄호에 대한 별도의 "빈"라인은 더욱 가독성을 방해, 선이 따로 분리되어서는 안 단락의 시각적 구분을 추가합니다. 이것은 당신이 언급하는 간결한 작은 블록에서 특히 중요합니다.
JDługosz 2016

9

중괄호를 제거하지 않는 이유는 다음과 같습니다.

  1. 의사 결정 피로를 줄입니다. 항상 중괄호를 사용하면 중괄호가 필요한지 여부를 결정할 필요가 없습니다.

  2. 개발 드래그 감소 : 결국 여러 개의 로직 라인을 메소드 추출 하려고 노력하더라도 로직을 추가하는 경우 중괄호로 변환하는 것은 중괄호로 변환해야하는 것은 개발 드래그의 성가신 일입니다. 따라서 괄호를 제거하고 더 많은 코드가 필요할 때 괄호를 다시 추가하는 노력이 있습니다. 작지만 성가시다.


0

젊은 동료는 우리가 중복적이고 불필요한 것으로 보이는 괄호가 실제로 그에게 도움이된다고 말했습니다. 이유를 정확히 기억하지는 못하지만 더 나은 코드를 더 빨리 작성할 수 있다면 그 자체만으로도이를 유지할 수 있습니다.

FWIW, 우리는 한 줄에 이르렀하는 등 짧은 전제 조건이하지 않는 절충안에 합의 되지 않은 나에게 산만 / 읽을. 예 :

if (!param) { throw invalid_argument (blahblah); }
if (n < 2) { return 0; }
// real code for function starts here...

또한 이러한 입문 전제 조건은 종종 신체에 대한 제어 흐름 문 (예 return:)이므로 동일한 조건하에 있고 중괄호를 쓰는 것을 잊어 버리는 두 번째 문을 추가하는 것에 대한 두려움은 무례합니다. 이 조건 하의 두 번째 진술은 어쨌든 죽은 코드이며 의미가 없습니다.

나는 독서 문제 의 유창함 이 사람의 뇌 파서가 조건 문의 일부로 중괄호를 갖도록 배선되어 있기 때문에 발생한다고 생각합니다. 이는 C ++ 문법의 정확한 표현은 아니지만 다른 언어를 먼저 배우면 부작용이 될 수 있습니다 .


1
Bob 아저씨는 더 나은 코드를 작성하지 않고 더 빨리 코드를 작성한다고 생각합니다.
djechlin 2016

2
나처럼 C ++에 유창한 사람들도 있습니다.
JDługosz 2016

1
"그가 더 나은 코드를 더 빨리 작성할 수 있다면, 그 자체만으로도이를 유지할 수 있습니다"++ 나는 같은 말을하는 Jr.
RubberDuck

... 따라서 밥 아저씨가 원하는 방식으로 그렇게하는 것이 합리적입니다.
djechlin

-1

지금 그 비디오를 보았을 때, 중괄호를 제거하면 코드를 리팩터링해야하는 위치를 더 쉽게 확인할 수 있습니다. 중괄호가 필요한 경우 코드가 약간 깨끗할 수 있습니다.

당신이 팀에있을 때 중괄호를 제거하면 언젠가 예기치 않은 동작이 발생할 것이라고 말했습니다. 나는 그들을 지키라고 말하고, 일이 잘못 될 때 많은 두통을 피할 수 있습니다.


이것은 이전의 10 가지 답변에서 언급되고 설명 된 점을 넘어서는 실질적인 내용을 제공하지 않는 것 같습니다
gnat

-3

나는 그렇지 않은 경우 if에 의해 제어되는 다른 들여 쓰기 된 줄을 추가하여 버그를 쉽게 도입 할 수 있기 때문에 이것을하지 말라고 배웠습니다.

코드가 단위 테스트를 거쳤 다면 이런 종류의 "버그"가 폭발 할 것입니다.

쓸모없고 못생긴 괄호를 피하여 코드를 청소하는 것이 제가 따르는 관행입니다.


9
물론 그 반대도 마찬가지입니다. 코드에 버그가 없으면 단위 테스트가 필요하지 않습니다. 실제로는 코드에 실수가 있고 때로는 테스트에 실수가있는 불완전한 세상에 살고 있습니다. (제 경험상 후자는 실제로 더 일반적입니다.) 따라서 테스트를 통해 버그의 위험을 확실히 줄일 수 있지만, 다시 위험을 제기 할 수있는 다른 방법을 찾는 데에는 변명의 여지가 없습니다.
ruakh

3
ruakh의 의견에 추가하려면 코드를 100 % 단위로 테스트 할 수 없습니다.
BЈовић

내 코드를 참조하십시오.) TDD를 연습하는 동안 항상 이런 종류의 버그를 매우 빨리 보여줄 수 있습니다.
Mik378

@ Mik378 그건 사실이 아닙니다. 요점은 중괄호를 사용하면 걱정할 필요가 없다는 것입니다.
GoatInTheMachine
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.