문제

일환으로 코드의 기준에서 문서를 썼다 잠시 후,나는 적용"당신은 항상 사용 루프 교정기 및/또는 조건 코드 블럭도(특히)는 경우 그들은 단 하나의됩니다."라고 말했습니다.

예제:

// this is wrong
if (foo) 
    //bar
else 
    //baz
while (stuff)
    //things

// This is right.
if (foo) {
    // bar
} else {
    // baz
}
while (things) {
    // stuff
}

지 않는 경우 괄호는 단일-라인,그리고 그런 다음 누군가 의견,그것을 밖으로 당신이 문제입니다.지 않는 경우 괄호는 단일 선 들여쓰기를 표시하지 않는 같은 다른 사람의 컴퓨터에서...당신이 문제입니다.

그래서 질문:은 거기에 좋은 이유가 될 것이라는 착각하거나 부당한 표준?가 있었던 몇몇 토론에 그것은,그러나 아무도 제공할 수 있는 나에게 더 나은 counterargument 보다는"그 느낌이 추".

도움이 되었습니까?

해결책

나는 반품 또는 루프를 계속하기 위해 평가하는 IF 문에 대한 작은 예외를 제외하고는 이것을 한 점으로 시행한다.

그래서 이것은 내 표준에 따라 정확합니다.

if(true) continue;

이와 같이

if(true) return;

그러나 규칙은 그것이 반환 또는 계속되며, 모두 같은 줄에 있다는 것입니다. 그렇지 않으면, 모든 것을위한 교정기.

추론은 표준적인 방법을 가지고 있고 언급 한 논평 문제를 피하는 것입니다.

다른 팁

내가 제공 할 수있는 가장 좋은 카운터 인수는 공간에서 찍은 추가 선이 한 번에 볼 수있는 코드의 양을 줄이고 한 번에 볼 수있는 코드의 양이 얼마나 쉬운 지에 대한 큰 요소라는 것입니다. 오류를 발견하는 것입니다. 나는 당신이 버팀대를 포함시킨 이유에 동의하지만, 수년간의 C ++에 실수를했을 때 한 번만 생각할 수 있으며, 그곳은 교정기를 건너 뛰는 충분한 이유가없는 곳에있었습니다. 그래도. 불행히도 나는 그 여분의 코드 라인을 보는 것이 실제로 도움이되었는지 여부를 말할 수 없었습니다.

나는 동일한 들여 쓰기 수준에서 매칭 버팀대의 대칭을 좋아하기 때문에 아마도 더 편향되어있을 것입니다 (및 포함 된 진술의 한 블록으로 묵시적 그룹화) - 브레이스를 추가하는 것을 의미합니다. 모두 시간은 프로젝트에 많은 라인을 추가합니다.

나는이 규칙을 과잉으로 본다. 드라코 니안 표준은 좋은 프로그래머를 만들지 않고 슬로브가 혼란 스러울 가능성을 줄입니다.

당신이 제공하는 예제는 유효하지만 교정기를 강제하는 것보다 더 나은 솔루션을 가지고 있습니다.

당신이 단일 라인을 굽지 않고 누군가가 그것을 댓글을 달면, 당신은 곤경에 처해 있습니다.

두 가지 관행은 이것을 더 잘 해결하고 하나를 선택하십시오.

1) 댓글을 달아라 if, while, 1 라이너가있는 1 라이너 이전. 즉, 치료

if(foo)
    bar();

다른 멀티 라인 문과 마찬가지로 (예 : 여러 줄이있는 할당 또는 다중 라인 함수 호출) :

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

2) 접두사 // a ;:

if(foo)
;//    bar();

단일 라인을 굽지 않으면 다른 사람의 기계에 똑같이 표시되지 않으면 곤경에 처해 있습니다.

아니, 당신은 그렇지 않습니다. 코드는 동일하게 작동하지만 읽기가 더 어렵습니다. 당신의 들여 쓰기를 수정하십시오. 탭이나 공백을 선택하고 고집하십시오. 들여 쓰기를 위해 탭과 공간을 혼합하지 마십시오. 많은 텍스트 편집기가 자동으로이를 수정합니다.

파이썬 코드를 작성하십시오. 그것은 적어도 일부 나쁜 압입 습관을 고칠 것입니다.

또한 구조와 같은 구조 } else { 나에게 넥타이 전투기의 Nethack 버전처럼 보입니다.

이것이 잘못되거나 불합리한 표준이 될 이유가 있습니까? 그것에 대한 토론이 있었지만 아무도 "못생긴 느낌"보다 나에게 더 나은 반론을 제공 할 수는 없습니다.

중복 버팀대 (및 괄호)는 시각적 혼란입니다. 시각적 혼란은 코드를 읽기 어렵게 만듭니다. 더 어려운 코드는 읽기가 더 쉬울수록 버그를 더 쉽게 숨길 수 있습니다.

int x = 0;
while(x < 10);
{
    printf("Count: %d\n", ++x);
}

강제 버팀대는 위 코드에서 버그를 찾는 데 도움이되지 않습니다.

추신 : 저는 "모든 규칙이 왜"학교 또는 Dalai Lama가 말한 것처럼, "규칙을 알 수 있도록 규칙을 알고"의 가입자입니다.

나는 아직이는 사람은 좋은하지 않을 이유 항상 사용 중괄호를 사용합니다.

까지 혜택을 초과하"느낌 추"이유로 들었어요.

코딩 표준이 존재하는 코드는 쉽게 읽을 줄이고 오류가 있습니다.

이것은 하나의 표준는 진정으로 지급합니다.

오류를 줄이고 코드를 더 읽기 쉽게 만드는 코딩 표준에 대해 논쟁하기가 어렵다는 것을 알게되었습니다. 처음에는 일부 사람들에게는 못 생겼을 수도 있지만, 구현하는 것은 완벽하게 유효한 규칙이라고 생각합니다.

나는 교정기가 들여 쓰기에 따라 일치해야한다는 땅에 서 있습니다.

// This is right.
if (foo) 
{
    // bar
}
else 
{
    // baz
}

while (things) 
{
    // stuff
}

두 가지 예가, 일치하는 닫는 괄호를 찾는 것은 어려울 수 있지만, 들여 쓰기가 잘못된 경우, 논리를 더 쉽게 삽입 할 수 있기 때문에 읽을 수 없기 때문에 읽을 수 없을 것입니다. 큰 차이가 아닙니다.

계약이 잘못 되더라도 IF 문은 다음 줄에 있는지 여부에 관계없이 다음 명령을 실행합니다. 동일한 라인에 두 명령을 두지 않는 유일한 이유는 디버거 지원 때문입니다.

내가 보는 가장 큰 장점은 조건부와 루프에 더 많은 진술을 추가하는 것이 더 쉽고, 처음에는 브레이스를 만들기 위해 많은 추가 키 스트로크가 필요하지 않다는 것입니다.

내 개인적인 규칙은 그것이 매우 짧은 'if'라면 모든 것을 한 줄에 두는 것입니다.

if(!something) doSomethingElse();

일반적으로 나는 이와 같은 if가 연속적으로있을 때만 이것을 사용합니다.

if(something == a) doSomething(a);
if(something == b) doSomething(b);
if(something == b) doSomething(c);

그 상황은 자주 발생하지 않기 때문에 그렇지 않으면 항상 버팀대를 사용합니다.

현재, 나는이 표준에 따라 생활하는 팀과 함께 일하고 있으며, 나는 그것에 저항하는 동안 균일 성을 준수합니다.

나는 예외 나 템플릿 또는 매크로의 사용을 금지하는 팀에 반대하는 것과 같은 이유로 반대합니다. 언어를 사용하기로 선택한 경우 전체 언어를 사용하십시오. 교정기가 C와 C ++ 및 Java에서 선택 사항 인 경우, 컨벤션으로이를 의무화하는 것은 언어 자체에 대한 두려움을 보여줍니다.

여기서 다른 답변에 묘사 된 위험을 이해하고 균일성에 대한 갈망을 이해하지만 동정심이 아닙니다. 언어 하위 설정 엄격한 금지 기술적 인 이유, 템플릿을 수용하지 않는 일부 환경에 대한 유일한 컴파일러 또는 예외의 광범위한 사용을 배제하는 C 코드와의 상호 작용과 같은.

내 하루의 대부분은 주니어 프로그래머가 제출 한 변경 사항을 검토하는 것으로 구성되며, 발생하는 일반적인 문제는 브레이스 배치 또는 잘못된 장소에서 와인되는 진술과 관련이 없습니다. 위험은 과장되었습니다. 오히려 컴파일러가 행복하게 받아들이는 것에 대한 위반을 찾는 것보다 더 많은 물질 문제에 초점을 맞추는 데 시간을 보내고 싶습니다.

코딩 표준을 따라 할 수있는 유일한 방법은 프로그래머 그룹이 규칙 수를 최소로 유지하는 것입니다.

비용과 비용과의 균형을 유지합니다 (모든 추가 규칙은 프로그래머를 혼란스럽게하고 혼란스럽게하며 특정 임계 값 후에는 프로그래머가 규칙을 따를 가능성이 실제로 줄어 듭니다).

따라서 코딩 표준을 만들기 위해 :

  • 대안보다 낫다는 명확한 증거로 모든 규칙을 정당화 할 수 있는지 확인하십시오.

  • 규칙에 대한 대안을 살펴보십시오 - 실제로 필요합니까? 모든 프로그래머가 공백 (빈 줄 및 계약)을 사용하는 경우, IF 문은 읽기가 매우 쉽고 초보자 프로그래머조차도 독립형 진술에 대해 "IF"내부의 진술을 착각 할 수있는 방법은 없습니다. if- 스코핑과 관련하여 많은 버그를 얻는 경우 근본 원인은 아마도 코드를 불필요하게 읽기 어렵게 만드는 Whitepsace/Indentation 스타일이 좋지 않을 것입니다.

  • 코드 품질에 대한 측정 가능한 효과로 규칙을 우선 순위로 설정하십시오. 규칙을 시행하여 얼마나 많은 버그를 피할 수 있습니까 (예 : "항상 null을 확인하십시오", "항상"Assert로 매개 변수를 검증하십시오 ","항상 단위 테스트 작성 "대"필요하지 않은 경우 항상 버팀대를 추가하십시오 "). . 이전 규칙은 연간 수천 개의 버그를 절약 할 것입니다. 브레이스 규칙은 당신을 구할 수 있습니다. 아마도.

  • 가장 효과적인 규칙을 유지하고 Chaff를 버립니다. Chaff는 최소한 규칙을 무시함으로써 발생할 수있는 버그보다 더 많은 비용을 구현하는 데 더 많은 비용이 드는 규칙입니다. 그러나 아마도 약 30 개 이상의 주요 규칙이 있다면 프로그래머는 많은 규칙을 무시하고 좋은 의도는 먼지가 될 것입니다.

  • 읽지 않고 임의의 코드를 언급 한 프로그래머를 발사하십시오 :-)

PS 브레이싱에 대한 나의 입장은 다음과 같습니다. "if"문 또는 그 내용이 하나의 줄인 경우 브레이스를 생략 할 수 있습니다. 즉, 한 줄 댓글과 한 줄의 코드 라인이 포함 된 경우 내용은 두 줄을 사용하므로 중괄호가 필요합니다. IF 조건이 두 줄에 걸쳐있는 경우 (내용이 한 줄인 경우에도) 브레이스가 필요합니다. 이것은 실수가 실제로 이루어지지 않는 사소하고 간단하며 쉽게 읽을 수있는 사례에서만 버팀대를 생략한다는 것을 의미합니다. (성명서가 비어있을 때, 나는 버팀대를 사용하지 않지만, 나는 항상 그것이 비어 있고 의도적으로 그렇게 말한다는 의견을 명확하게 설명합니다. 그러나 그것은 다른 주제에 대해 경계를 보이고 있습니다. 전화가 울리는 대신 비워지는 범위는 코드를 완료하는 것을 잊었습니다)

많은 언어는 그러한 "추악함"을 다루기 위해 이와 같은 하나의 라이너 (특히 Perl을 생각하고 있음)에 대한 구문을 가지고 있습니다. 그래서 :

if (foo)     
//bar
else     
//baz

3 배 연산자를 사용하여 3 배로 작성할 수 있습니다.

foo ? bar : baz

그리고

while (something is true)
{
blah 
}

다음과 같이 쓸 수 있습니다.

blah while(something is true)

그러나이 "설탕"이없는 언어로 나는 확실히 버팀대를 포함 할 것입니다. 당신이 말했듯이, 그것은 불필요한 버그가 들어 오는 것을 막고 프로그래머의 의도를 더 명확하게 만듭니다.

나는 그것이 불합리하다고 말하지는 않지만 15 년 이상의 C와 같은 언어로 코딩하면서 브레이스를 생략하는 데 단일 문제가 없었습니다. 지점을 언급하는 것은 이론적으로 실제 문제처럼 들린다 - 나는 실제로 그것이 실제로 일어나는 일을 본 적이 없다.

의 또 다른 장점은 항상 사용하여 교정기는 그것이트 및 이와 유사한 자동화된 작업을 더 쉽습니다.

예를 들어:나는 알 functionB 일반적으로 호출한 후에 즉시 functionA, 와 유사한 패턴을 인수,그래서 내가 원하는 형식을 중복되는 코드로 새로운 combined_function.Regex 이를 쉽게 해결할 수 있습 refactoring 없는 경우에는 충분한 강력한 리팩터링 도구(^\s+functionA.*?;\n\s+functionB.*?; 다)하지만,괄호 없이 간단한 regex 접근은 실패할 수 있습니다:

if (x)
  functionA(x);
else
  functionA(y);
functionB();

가 될 것입

if (x)
  functionA(x);
else
  combined_function(y);

더 복잡한 정규표현식에서 작동이 특정한 경우,그러나 나는 그것을 발견 매우 편리한 사용할 수 있는 regex 기반한,one-off Perl 스크립트,이와 유사한 자동화된 코드를 유지보수,그래서 내가 선호하는 코드 스타일을 만들지 않는 불필요하게 복잡합니다.

나는 당신의 주장을 사지 않습니다. 개인적으로, 나는 "우연히"라는 사람이 누구도 if. 나는 그렇게 말하는 것을 이해할 것입니다 중첩 if 진술에는 매달려있는 것을 피하기 위해 교정기가 있어야하지만, 내가 알 수 있듯이, IMO, 잘못 배치 된 두려움 때문에 스타일을 시행하고 있습니다.

다음은 내가 지나가는 기록이없는 규칙입니다. 나는 그것이 정확성을 희생하지 않고 가독성을 제공한다고 생각합니다. 그것은 짧은 형태가 긴 형태보다 더 읽기 쉬운 몇 가지 경우에 있다는 믿음에 근거합니다.

  • 항상 버팀대를 사용하십시오 어느 블록의 블록 if/else if/else 진술에는 하나 이상의 줄이 있습니다. 주석 수는 조건부의 어느 곳에서나 주석을 의미한다는 것은 조건부 get 괄호의 모든 섹션을 의미합니다.
  • 선택적으로 버팀대를 사용합니다 모두 진술의 블록은 정확히 한 줄입니다.
  • 조건부 명세서를 조건과 같은 줄에 두지 마십시오. IF 문의 이후의 선은 항상 조건부로 실행됩니다.
  • 조건부 명세서 자체가 필요한 조치를 수행하는 경우 양식은 다음과 같습니다.

    for (init; term; totalCount++)
    {
        // Intentionally left blank
    }
    

다음을 말할 수있을 때 이것을 장황한 방식으로 표준화 할 필요가 없습니다.

가독성을 희생하여 교정기를 떠나지 마십시오. 의심스러운 경우 버팀대를 사용하도록 선택하십시오.

교정기의 중요한 것은 그들이 프로그래머의 의도를 매우 분명히 표현한다는 것입니다. 당신은 들여 쓰기의 의도를 유추 할 필요가 없습니다.

즉, 나는 단일 라인 반환을 좋아하고 Gus가 계속 제안합니다. 의도는 분명하며 깨끗하고 읽기가 더 쉽습니다.

이 모든 것을 읽을 시간이 있다면 추가 교정기를 추가 할 시간이 있습니다.

유지 보수 가능성을 위해 단일 라인 조건부에 버팀대를 추가하는 것을 선호하지만 교정기없이 수행하는 것이 더 깨끗해 보이는 방식을 알 수 있습니다. 그것은 나를 괴롭히지 않지만, 어떤 사람들은 여분의 시각적 소음으로 꺼질 수 있습니다.

나는 더 나은 반론을 제공 할 수 없다. 죄송합니다! ;)

이와 같은 경우, IDE의 자동 면류를위한 구성 템플릿을 찾는 것이 좋습니다. 그런 다음 사용자가 Alt-Shift-F (또는 Keystroke가 선택한 내용이 무엇이든)에 부딪 칠 때마다 교정기가 자동으로 추가됩니다. 그런 다음 모든 사람에게 다음과 같이 말합니다. "가서 글꼴 색칠, PMD 설정 등을 변경하십시오. 그러나 계약 또는 자동 브레이스 규칙을 변경하지 마십시오."

이것은 일반적으로 소비되는 산소의 가치가없는 것에 대해 논쟁하지 않기 위해 우리가 사용할 수있는 도구를 활용합니다.

에 따라언어, 단일 줄 지정된 조건 문 또는 루프 명령문에 대한 교정기가있는 것은 필수가 아닙니다. 사실, 나는 더 적은 줄의 코드를 갖도록 제거 할 것입니다.

C ++ :

Version 1:

class InvalidOperation{};

//...
Divide(10, 0);
//...
Divide(int a, in b)
{
   if(b == 0 ) throw InvalidOperation();
   return a/b;
}

Version 2:

class InvalidOperation{};

//...
Divide(10, 0);
//...
Divide(int a, in b)
{
   if(b == 0 )
   { 
      throw InvalidOperation();
   }
   return a/b;
}

씨#:

Version 1:

foreach(string s in myList)
   Console.WriteLine(s);

버전 2 :

foreach(string s in myList)
{
   Console.WriteLine(s);
}

관점에 따라 버전 1 또는 버전 2가 더 읽을 수 있습니다. 대답은 오히려입니다 주걱.

우와. 아무도 알고 있습니다 다른 매달려있는 문제? 이것은 본질적으로입니다 그만큼 항상 버팀대를 사용하는 이유.

간단히 말해서, 당신은 특히 중첩 될 때 다른 진술로 불쾌한 모호한 논리를 가질 수 있습니다. 다른 컴파일러는 자신의 방식으로 모호성을 해결합니다. 당신이 무엇을하고 있는지 모르는 경우 교정기를 떠나는 것은 큰 문제가 될 수 있습니다.

미학과 가독성은 그것을 할 일이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top