유지 보수 현명한, 중괄호없이 '다른 동안'안전하다고 간주됩니까?


26

else while현명 "안전한"유지 보수로 간주 중괄호 개입하지 않고?

if-else아래와 같이 중괄호없이 코드 작성 ...

if (blah)
    foo();
else
    bar();

... 중괄호가 없으면 코드의 의미를 실수로 쉽게 변경하기 때문에 위험이 따릅니다.

그러나 아래도 위험합니까?

if (blah)
{
    ...
}
else while (!bloop())
{
    bar();
}

아니면 else while중괄호없이 "안전한"것으로 간주됩니까?


20
나에게 else whileicky 보인다. 사용할 것 else { while (condition) { ... } }입니다.
Joachim Sauer

7
나는 그것이 정답을 얻기에는 너무 주관적이라고 생각합니다 ... 나는 루프를 기대하지 않기 때문에 그것을하지 않을 것이고, 가독성을 어렵게 만들 것으로 기대하지 않는다고 생각합니다.
johannes

7
나는 물건에 대한 방법추출합니다
gnat

12
솔직히, 그것은 나에게 소름 끼치게합니다. if한 번만 평가되지만 while루프를 나타내므로 둘 다 연결 if하면 루프의 일부
라는 의심 할 여지

4
그리고 무엇에 만약 else당신이하고 싶지 절 while 더 많은 일을 할? 중괄호 만 사용하십시오.
Carlos Campderrós 2014

답변:


57

이 코드를 생각 나게합니다.

if ( ... ) try {
..
} catch (Exception e) {
..
} else {
...
}

괄호를 잊어 버리고 들여 쓰기를 늘리지 않고 두 가지 유형의 블록을 결합 할 때마다 이해하고 유지하기가 매우 어려운 코드를 작성합니다.


18
좋은 예입니다. 그것을 쓰는 것이 끔찍한 방법입니다.
Leo

4
와우,이 대답은 엄청나게 설득력이 있습니다!
Mehrdad

최신 IDE를 쉽게 설정하여 괄호 삽입 및 들여 쓰기 수정 등 저장시 코드를 자동으로 포맷 할 수 있습니다. 그래서 이것은 반 논쟁입니다. 적절하게 들여 쓰기하면 중괄호가 있든 없든 가독성에 문제가되지 않습니다.
Hans-Peter Störr

55

아마도 내가 사용하여 내 무역 (웨이 백) 배운 때문이다 잭슨 법인 구조 다이어그램 방법을,하지만 난 유일한한다는 견해에 가입 올바른 애프터 비지지 용어 if또는이 else후속이다 if(즉 수 있도록 else if사다리를)

찌르지 않은 물건이 있으면 오해 및 / 또는 유지 관리 문제가 발생할 가능성이 있습니다. 이것이 "안전하지 않은"OPs 아이디어의 핵심입니다.

또한 중괄호 여부에 관계없이 while()같은 줄 에 포함시키는 것에 대해 매우 겁이납니다 else. 그것은 나에게 올바르게 읽히지 않습니다 ... else절 이라는 추가 들여 쓰기 마스크가 부족합니다 . 명확성이 부족하면 오해가 발생합니다 (위 참조).

따라서이 예에서 나는 다음에 대해 강력하게 조언 / 권장하고 (팀에서 주장한다)

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

물론 적절한 의견도 기대할 것입니다.

-- 편집하다 --

최근 애플은 유지 보수 수정 문제로 인해 SSL 취약점으로 어려움을 겪었습니다. 괄호가없는 단일 행은 괜찮다는 생각을 자고 자합시다.


2
다른 사람을 따르는 유일한 올바른 용어인지에 동의합니다. 만약 else while내가 있었다면 아마도 코드의 빠른 스키밍에 루프가 있었을 것입니다. 특히 내가 찾고있는 조건이 if에 의해 만족 되었다면.
Drake Clarris

3
재밌 네요 모든 사람들이 모든 것이 중괄호 안에 있으면 더 읽기 쉽다고 말합니다. 나는 그 반대가 사실이라고 생각합니다. 문장이 하나 뿐인 경우 중괄호를 사용하지 않으면 쉽게 읽을 수 있습니다. 덜 혼란. 항상 그런 식으로 해왔 기 때문일 수 있습니다.
Jeff Davis

2
@JeffDavis 그것은 좋은 캐치입니다. "읽기 쉬움"은 쓸모없는 거룩한 전쟁에 대한 전형적인 초대입니다. 나는 중괄호를 선호하지만 관련이없는 "읽기 쉬운"쓰레기 때문에 (예를 들어 나에게는 정확히 반대입니다) 더 이상 코드 유지 관리를 중단하기가 더 어렵 기 때문에 중괄호를 선호합니다. 방법의 영업 이익은 더 나은 자신의 문제를 철자 작성자 : 이다 else while중괄호 개입하지 않고 "안전"생각을 ?
gnat

@JeffDavis-나는이 스레드가 2 살이라는 것을 알고 있지만, 애플은 최근에 중괄호를 사용하지 않는 것이 좋은 생각이 아니라는 것을 발견했다. andrewbanks.com/…
Andrew

@Andrew 애플의 스위프트 (Swift) 언어는 이제 한 줄 흐름 제어를 명시 적으로 금지한다. 그 버그는 그렇게하는 이유 중 하나 일 수 있습니다.
술탄

6

나는 항상 모든 것을 중괄호 안에 넣고 들여 쓰기하고 주석을달라고 배웠습니다. 오류를 읽고 발견하는 것이 훨씬 쉽다고 생각합니다. 개인적으로 모듈성이 중요하다고 생각하므로 항상 다음과 같은 코드를 작성합니다.

    if(blah)
    {
     ....
    }
    else
    {
       while(!bloop()
       {
        bar;
       }
    }

6

나는 방법추출 하고 만들 것입니다

if ( blah )
{
    ...
}
else
{
   newMethod();
}

리팩토링 카탈로그 사이트 에서 설명한 "추출 방법"접근 방식을 참조하십시오 .

함께 그룹화 할 수있는 코드 조각이 있습니다.

프래그먼트를 이름이 메소드의 목적을 설명하는 메소드로 변환하십시오.

void printOwing() {
    printBanner();

    //print details
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + getOutstanding());
}

                                                                                                         http://www.refactoring.com/catalog/arrow.gif

void printOwing() {
    printBanner();
    printDetails(getOutstanding());
}

void printDetails (double outstanding) {
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + outstanding);
}

예를 들어 while 루프가 함수 레벨 데이터를 사용했다면 이제 그 데이터를 모듈 (또는 C ++를 사용하는 경우 클래스) 레벨로 더 많이 가져와야합니다. 그리고 작은 코드 스 니펫 만 있으면 사소한 방법을 사용합니다. 그러나 때로는 상황에 따라 동의합니다.
Andrew

1
+1 Smart C ++ 컴파일러는 함수를 인라인 할 수 있습니다. .Net 환경에서는 JIT로 인해 작은 기능이 더 좋습니다.
Job

4

나는 그것을 나쁜 코딩 습관으로 생각할 것입니다. 때로는 완벽하게 작동하며 코드를 컴파일하고 실행하는 데 아무런 문제가 없습니다. 다른 경우 심각한 버그가 발생할 수 있으며 해당 버그를 수정하는 데 몇 시간을 소비하게됩니다.

항상 코드를 모듈화하는 것이 좋습니다. 다른 부분에 while 루프를 넣어야하는 경우 다른 사람이 코드를 작업 할 때 논리를 쉽게 이해할 수 있도록 블록에 넣으십시오.

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

코드를 블록에 넣는 것이 좋습니다. 또한 이해하기 쉽고 디버그하기도 쉽습니다.


4

개인적으로 마음에 들지 않지만 가장 선호하는 if / else 코드 블록에도 중괄호를 사용하는 것이 선호되지만 간단하게 유지하는 것이 좋습니다. 그것은 단지 더 깔끔합니다.

그러나 이것이 혼란스러운 곳은 if / else가 중괄호로 일부를 루프하지 않고 중첩 한 경우입니다. 그 스파게티 중간에 While 루프! 나는 그 나쁜 코드로 작업했으며 디버그하고 이해하는 것은 악몽입니다. 이것은 처음부터 간단하게 유지되고 만족할 때 좋습니다. 그러나 다른 프로그래머가 와서 무언가를 추가 할 수 있습니다. 어쩌면 while 루프 내에 다른 것이 있습니다. 처음부터 깨끗하게 쓰여지면 이런 일이 발생할 가능성이 줄어 듭니다.

요점은 다른 프로그래머가 옳고 그른 것을 한 눈에 볼 수 있도록 물건을 명확하게하는 것입니다. 패턴이 올바르게 표시되고 방해되지 않도록 코드를 작성하십시오.

이것의 반대 측면은 아마도 어떤 사람들은 어떤 경우에는 이것이 잘 읽힌다 고 주장하는 사람들을 볼 수 있다는 것입니다. 리소스가 있다면 뭔가를 기다리는 동안 다른 처리를해야합니다. 그럼에도 불구하고 else 블록 안에 while 루프를 중첩시키는 데 여전히 차이가 없습니다.


3

글쎄, 모두가 중괄호 사용에 대해 논쟁하고 그것을 좋아하는 것처럼 보이지만, 나는 실제로 반대를 선호합니다. 나는 더 읽기 쉽고 간결하지 않기 때문에 필요할 때만 중괄호를 사용합니다.

if (...)
   foo();
else while(...)
   bar();

... 실제로이 " else while(...)"를 읽을 수 있습니다. 심지어 평범한 영어처럼 읽습니다! 그러나 나는 사람들이 모든 것을 이상하게 생각할 것이라고 생각합니다.

결국, 우리 모두는 중괄호로 바보 증거를 만드는 경향이 있습니다.


3
일부 무고한 테이너는 변경 후 특히 읽을 수 있습니다 그 else while(...) bar();같은 것으로 else while(...) foobar(); bar();:)
모기

3
글쎄, 나는 그것이 꽤 어리 석고 위험한 무고한 관리자 라고 말할 것입니다 . 나는 어리석은 오류를 피하기 위해 바보 짓는 원리를 알고 있지만 ... 지금까지가는 것은 상당히 슬프다. 그러나 나는 그런 의견과 공감대를 얻을 것이라는 것을 알았습니다. 문제 없어.
dagnelies

2
"여러분의 코드를 관리 할 사람이 당신이 사는 곳을 알고있는 폭력적인 정신병자 인 것처럼 항상 코딩하십시오." ( Alan Braggins )
gnat

1
글쎄, 모든 것은 코드에서 일하는 누군가의 어리석은 수준으로 가정합니다. 만약 당신의 "유지 관리자"가이 네 줄의 코드로 혼란스러워 진다면, 당신에게는 큰 문제가 있다고 주장합니다. 폭력적인 사이코라면 둘이 있습니다. ;)
dagnelies

1
만약 내가 위에서 언급 한 링크 가이 인용문의 버전을 확대 했다면 , 프로그래머 1 : '여기에 좋은 인용문이있다- "여러분의 코드를 관리하는 사람이 당신이 사는 곳을 아는 폭력적인 정신병자처럼 항상 코드를 만들어라" " . 프로그래머 2 : (유지 관리자를 쳐다 보며) '어떻게'을 의미합니까? '
gnat

2

나는 항상 중괄호를 넣습니다. 서두를 때 다른 줄을 추가하고, 들여 쓰기하고, 중괄호를 잊어 버리고, 일어나고있는 일을 머리를 긁을 수 있기 때문입니다. 오프닝 브래킷을 같은 줄에 유지하지만 중요하지 않습니다. 나는 두 가지 경우 모두 더 낫다.

if(blah) {
    foo();
}
else {
    bar();
}

중괄호의 위치는 아마도 종교를 초월한 (또는 아마도 포함하는) 것보다 더 많은 논쟁을 유발할 것입니다!
앤드류

동의했다. 위치가 아니라 그들의 존재를 강조하기 위해 내 대답을 편집 할 것입니다.
Tsvetomir Dimitrov 2014

2

너무 많은 사람들이 괄호를 쓰려고하지 않는 중괄호의 문제점은 무엇입니까?

정확히 어떤 문제가 else while해결됩니까?

중괄호는 싸고 좋으며 영리하고 재치있는 것이 아니라 코드 의도를 분명하고 명확하게 만듭니다.

인용하는 유닉스 철학 :

선명도의 규칙 : 선명도는 영리함보다 낫습니다.

유지 관리는 매우 중요하고 비용이 많이 들기 때문에 프로그램을 작성하는 가장 중요한 통신은 실행하는 컴퓨터가 아니라 향후 소스 코드를 읽고 유지 관리 할 사람 (자신 포함)에게 보내는 것처럼 프로그램을 작성하십시오.


1

아무 문제 없어

if (blah)
    foo();
else
    bar();

아무 문제가없는 것처럼

if (blah) foo(); else bar();

올바른 상황에서 (여러 상황은 다를 수 있지만 반복되는 코드가 많을 때 특정 스타일이 가장 잘 사용됩니다. 그러면 각 줄의보기가 문체 들여 쓰기보다 중요합니다)

그러나 한 가지 방법을 선택하면 일관성을 유지하십시오. 두 번째 예제는 if 표현식에 명령문에 대괄호가 있으므로 while 문은 else 절의 대괄호 안에 있어야합니다.


게다가, 나는이 코드를 전에 보았다 :

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

그리고 그것은 코딩 표준 나치 자신 (모든 것에 대한 대괄호를 주장한)에 의해 작성되었습니다.


1

최신 IDE는 파일을 저장할 때 코드를 다시 포맷하거나 (불필요한 괄호 제거 또는 추가 포함) 코드를 다시 들여 쓰도록 쉽게 구성 할 수 있습니다. 따라서 예를 들어 자동으로

if (blah) {
  blub();
} else
  while (!bloop()) {
    bar();
  }

들여 쓰기는 불필요한 괄호가 없어도 항상 중첩을 쉽게 볼 수 있습니다. 따라서 그러한 IDE 설정을 적용하면 위험이 없습니다.

개인적으로, 나는 중괄호와 줄 바꿈을 생략하여 코드를 더 쉽게 읽을 수 있기 때문에 훨씬 더 읽기 쉬운 코드를 찾습니다.

if (blah) blub();
else while (!bloop()) bar();

그러나 물론 많은 개발자들은 그러한 것들에 대해 영원히 하루 종일 논쟁하는 것을 매우 기쁘게 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.