“if (0 == value)…”가 좋은 것보다 더 많은 해를 끼치 지 않습니까? [닫은]


49

이것은 내가 다른 사람의 코드에서 볼 때 가장 싫어하는 것 중 하나입니다. 나는 그것이 무엇을 의미하는지, 왜 어떤 사람들은 이런 식으로 그것을 하는지를 알고 있습니다 ( "실수로 '='를 대신 사용하면 어떻게됩니까?"). 나를 위해 아이가 계단을 내려갈 때 계단을 크게 세는 것과 매우 흡사합니다.

어쨌든, 여기에 대한 나의 주장은 다음과 같습니다.

  • 프로그램 코드를 읽는 자연스러운 흐름을 방해합니다. 우리 인간은 "값이 0 인 경우"가 아니라 "값이 0 인 경우"라고 말합니다.
  • 현대 컴파일러는 조건에 할당이 있거나 실제로 조건이 해당 할당으로 구성된 경우 경고합니다.
  • 프로그래머라면 값을 비교할 때 double '='을 넣는 것을 잊지 마십시오. "!"를 넣는 것을 잊어 버릴 수도 있습니다. 비평 등을 테스트 할 때

17
나도 그다지 신경 쓰지 않지만, 그것은 나의 개인적인 애완 동물 친구들 목록과는 거리가 멀다.
Adam Crossland

7
그리고 프로그래머들은 때때로 더블 '='을 그리워합니다. 만드는 것은 쉬운 실수이며 간과하기 쉬운 실수입니다.
sange

8
이것이 어떻게 건설적이지 않거나 실제적인 질문이 아닌가?
TheLQ

7
이것은 그래서 여기 닫혀 내 짧은 생각이다 : 사람들은 어떻게 작성 기억할 수 0 == value있지만 쓸 기억하지 ==? 나는 당신이 그것에 대해 생각한다면, 당신이 그것을 시작하기 위해 올바르게 작성하지 않는 이유는 블리 미를 의미합니다.
Dr Hannibal Lecter

3
@muntoo : 컴파일러에 따르면 많은 것이 "정확한"것이라고 생각합니다. 매우 좋은 벤치 마크라고 생각하지 않습니다.
Dr Hannibal Lecter

답변:


59

아, 그렇습니다. "요다 조건부"( "값이 0이면이 코드를 실행하십시오!"). 나는 항상 그들이 lint (1)와 같은 도구에 대해 더 낫다고 주장하는 사람을 지적합니다. 이 특정 문제는 70 년대 후반부터 해결되었습니다. 대부분의 현대 언어는 if(x = 10)부울에 할당 한 결과를 강제로 거부하기 때문에 와 같은 표현식을 컴파일조차하지 않습니다 .

다른 사람들이 말했듯이, 그것은 확실히 문제가 아니지만 약간의인지 부조화를 유발합니다.


32
"요다 조건부": +1 나는 실제로 그것을 LOL했다. :)
Bobby Tables

3
순서는 괜찮지 만 일반 부울 캐스트 대신 0과 비교하는 것에 반대합니다 if(!value).
SF.

1
조건부 오류 내 할당을 고려하십니까?

4
"대부분의 현대 언어는 이것을 컴파일하지도 않습니다." 부울에 할당 한 결과를 자동으로 강제하는 언어를 사용할 때 문제가 발생합니다. 내가 생각할 수있는 가장 인기있는 언어는 JavaScript입니다. 이것이 자바에서 항상 yoda 조건을 사용하는 이유입니다. 그래서 자바 스크립트를 작성할 때 잊지 말아야합니다. 문제가 될 수있을 정도로 자주이 둘 사이를 전환합니다.
Sam Hasler

3
아무도 컴파일하지 않는 컴파일러를 알고 if (0 == x)있습니까?
Kristopher Ives

56

그것은 작지만 눈에 띄는 정신 세를 부과하기 때문에 불쾌합니다.

사람들은 거의 모든 프로그래밍 언어 (및 대부분의 자연어)에서 왼쪽에서 오른쪽으로 읽습니다.

내가 볼 때 123 == x, 정신적으로 분석하는 방식은 다음과 같습니다.

  • 123-그래서 뭐? 불완전한 정보.
  • == -123은 123입니다. 왜 테스트합니까?
  • x-그래, 우리가 걱정하는 부분이야. 지금 만 상황이 있습니다.
  • 다시 재고로 돌아가서 123x와 비교하는 이유.

내가 볼 때 x == 123정신 분석은 다음과 같습니다

  • x-상황을 제공하며 조건에 대해 알고 있습니다. 나머지는 무시해도됩니다. 이전 흐름을 기반으로 나는 왜 그리고 앞으로 올 것이 무엇인지 (그리고 그것이 다르다면 놀랐습니다) 좋은 아이디어를 얻었습니다.
  • == -나도 그렇게 생각해
  • 123 -응

중단은 작지만 (단순한 예에서는) 항상 눈치 notice습니다.

당신이 경우 먼저 값을 두는 것은 좋은 생각이있을 수 있습니다 원하는 예를 들어, 그것에 관심을 끌기 위해 if (LAUNCH_NUKES == cmd). 일반적으로 이것은 의도가 아닙니다.


5
바로 그거죠. 자연어에서 상수는 항상 같은 이유로 마지막에 온다 : 만약 빛이 적색이라면 ...
mojuba

2
@mojuba 사실, 거의 보편적입니다. 이상하게도, 물체가 주제보다 먼저 나오는 자연 언어가 몇 개 있지만 (OVS / OSV 순서) 모두 모호합니다.
dbkk

1
반면에, 우리 중 일부는 변수 앞에있는 기호를 읽는 경향이 있습니다. 그들은 더 눈길을 끌고 있습니다. 그래서 구문 분석 것이다 =또는 ==이전 123하거나 x, 심지어는 내 머리에 영어로 코드를 번역하는 귀찮게하지 끝낸다.
이즈 카타

또한 대부분의 컴파일러는 추가 괄호를 사용하지 않는 한 프롬프트가 표시되면 경고를 표시하므로 문제가 아닌 문제를 해결하려고 시도합니다.
중복 제거기

47

해로운? 아니요. 어느 쪽이든 작동합니다.

나쁜 연습? 물론 논쟁의 여지가 있습니다. 간단한 방어 프로그래밍입니다.

잠을 잃을 가치가 있습니까? 아냐


8
그리고 그것을 읽을 때, 나는 코딩 스타일을 토론하는 가장 중요한 이유 인 코드를 즉시 이해합니다. 나는 수면을 잃을 가치가 없다고 전적으로 동의합니다.
Jeff Siver

17

이것은 기본적으로 flaimbait입니다.

아닙니다. 선보다 해를 끼치 지 않습니다. 단순한.

더 많은 단어?

컴파일러 논쟁? 어머, 어쩌면-어쩌면 당신을 구하기 위해 컴파일러에 너무 많은 믿음을 두지 마십시오.

잘 - "당신은 잊지 말아야" 대만족 걸, 아니 물론 당신이 그 사이에 내가 피곤, 나는 두 개의 서로 다른 언어를 사용했다 때로는 단지 가끔 한 모든 일을 코딩 봤는데있어 안되는 인간 - 실수.

이런 종류의 행동의 요점은 방어 적이라는 것입니다. 충돌을 예상하기 때문에 보험보다 더 실수를 할 것으로 예상되기 때문입니다. 그러나 보험에 가입하면 좋을 것입니다.

읽기 어려운가요? 당신은 괜찮은 프로그래머가 == 고정 배선을해야한다고 주장하지만 (모든 종류의 나쁜 가정을합니다) 자기 같은 괜찮은 프로그래머는 0 == value를 읽을 수 없습니다 ??

해를 끼치 지 않으며 잠재적 이점이 있으며 어리석은 질문이며 다른 사람들이 원하면 계속 할 수 있습니다.


6
프로그래밍을 공부하기 전에 대 수법을 공부 한 사람들에게는 0 == 값이 부자연 스럽다고 생각합니다.
mojuba

4
그것은 요점이 아닙니다.-그렇습니다. 당신이 옳게 읽지 않지만 프로그래머로서 우리가 무엇을하는지에 대해 똑같이 많은 것들이 자연 언어로 정확하게 쌓이지 않으며 어떻게 해석하는지에 대한 문제입니다. 당신은 참조
Murph

4
Bravo .. 그것은 자연스럽게 읽히기 때문에 당신은 그것에주의를 기울이고 따라서 잠재적 인 실수를 잡는 경향 이 있다는 사실은 말할 것도 없습니다 .
mocj

7
@mocj-따라서 코드를 읽는 사람들이 실제로 코드를 읽을 필요가 있도록 모든 코드를 가능한 한 끔찍하게 작성해야 합니까?
Kaz Dragon

6
@mocj-고맙지 만 요다 조건을 읽는 동안 "뇌 말더듬"이 좋은 것이라고 주장했습니다. 만약 그렇다면, "뇌 말더듬"을 일으키기 위해 모든 코드를 작성하는 것을 목표로해야하는지에 대한 질문을하고 있습니다. 진짜 질문.
Kaz Dragon

11

나는 그것을 해로 부르지 않을 것이지만, 그것은 불쾌합니다. 그래서 나는 그렇게 말하지 않을 것입니다.


10

나는 '전체를 잊어 버리면 어떻게 될까?' 정말 많은 무게를 가졌습니다. 예, 오타를 만들 수 있지만 오타는 모두 실수입니다. 실수를 두려워하기 때문에 전체 코딩 스타일을 변경하는 것은 어리석은 것 같습니다. 언젠가 무언가를 대문자로 쓰거나 밑줄을 잊어 버릴 수 있기 때문에 모든 변수와 함수를 펑크없이 소문자로 만드십시오.


5
그것은 문제의 요점이 아니며 요점은 "유해하다"는 것입니다. 최악의 자극이지만, 유해하지는 않습니다.
Murph

1
역동적 인 언어로-절대적으로, 당신은 기호를 잘못 입력하고 나중에 버그의 근원을 찾는 데 시간을 낭비 할 수 있습니다
mojuba

3
모든면에서, 늦은 밤 (또는 2)을 보냈고 소스 (C ++ 코드에서)가 == 대신 = = 인 것을 발견하면 약간의 무게가 나옵니다.
DevSolo

2
@DevSolo : 나는 그것이 당신의 경력에서 한두 번 일어날 것이라고 생각하지만 그 이상은 아닙니다.
mojuba

9

일부 사람들은 조건부 작업을 정확하게하기 위해이 도구를 사용합니다. 예를 들어 :

방법 1 :

FILE *fp;

fp = fopen("foo.txt", "w+");
if (fp == NULL) {

방법 2 :

FILE *fp;

if (NULL == (fp = fopen("foo.txt", "w+"))) {

어떤 사람들은 두 번째 예가 더 간결하다고 생각하거나 역전 된 주장은 시험 자체 이전의 시험 (조건부)의 요점을 보여줍니다.

실제로, 나는 정말로 어느 쪽도 상관하지 않습니다. 나는 스타일에 대한 나의 애완 동물 친구들을 가지고 있으며 가장 큰 것은 불일치입니다. 따라서 동일한 방식으로 일관되게 수행하면 코드를 읽지 않아도됩니다.

자신의 독특한 스타일로 한 번에 6 명의 다른 사람들이 한 번에 작동하는 것처럼 보일 때까지 조금 혼란 스럽습니다.


4
두 번째 예는 "허?" 첫 번째는 훨씬 더 읽기 쉽습니다. 좋은 예입니다. :)
Mateen Ulhaq

6

나에게 그것은 간단한 컨디셔닝입니다. (90 년대에) C와 C ++을 배운 사람으로서, 나는 그 이유가 교훈이 되더라도 그것에 익숙해 져서 여전히 그것을 사용합니다.

"일정한"에 대해 왼쪽을 보도록 "조절 된"상태가되면 두 번째 특성이됩니다.

또한 동등성 (또는 부정적 동등성)에 대해서만 사용합니다.

@Wonko의 답변에 전적으로 동의합니다.


5

내가 도움이되는 한 가지 경우는 if의 변수 부분이 꽤 길고 값을 보면 코드를 쉽게 읽을 수 있습니다. 점으로 구분 된 네임 스페이스 언어에 가장 적합한 예가 있습니다.

예를 들어, 싱글 사인온 (SSO)으로 작업 한 무언가에 특정 유형의 오류가 발생하고 특정 방식으로 복구 된 경우 두 개의 동시 세션이있을 수있는 상황이 발생했습니다. 이 같은:

if (2 <= application.httpcontext.current.session["thenameofmysessiontoken"].items.count())

이 예제에는 다른 방법이 있지만, 첫 번째 버전이 더 읽기 쉬운 경우가 있습니다.


2
여기 키워드는 "다른 방법"이라고 생각합니다.;)
mojuba

이 경우에는 가능하지만 어떤 경우에는 여전히 가장 읽기 쉬운 결과입니다. 나의 유일한 요점은 언어 나 욕구 행동과 유형-오와 싸우는 것 이외의 다른 정당한 이유가 있다는 것입니다
Bill

솔직히 말해서, <= 및> =에 대한 Yoda 조건에 어려움이 있습니다. == 부호는 다른 문제입니다. 왜냐하면 내 머리에서 기호를 전환 할 수 있기 때문에 귀하의 경우 count ()가 2 이상이어야한다는 것을 기억해야합니다. 더 작거나 같은 부호.
Alex

3

그러나 오류가 발생합니다. 때로는 루프 연산자를 사용하여 동등성을 검사 할 수도 있고 적어도 표준을 사용하는 것이 좋습니다.

내가 따랐던 조언 (아마도 Code Complete)은 왼쪽에서 가장 낮은 값을 비교하는 것입니다. 나는 이전에 동료와이 문제를 논의하고 있었는데, 그는 그것이 미쳤다고 생각했지만 나는 그것에 매우 익숙해졌다.

그래서 나는 말할 것입니다 :

if ( 0 <= value )

그러나 나는 또한 말할 것입니다 :

if ( value <= 100 )

평등 왼쪽에있는 변수를 확인하는 경향이 있습니다. 더 읽기 쉽습니다.


1
나는 if(y > x)항상 사용하는 데 익숙합니다 . 않는 한 y상수이다.
Mateen Ulhaq

나는 그런 식으로 사용했지만 왼쪽에서 가장 낮은 값을 갖는 아이디어를 얻은 후에 내 코드가 한 눈에 훨씬 더 읽기 쉽다는 것을 알았습니다.
glenatron의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.