조건부에서 (위치 <크기)가 일반적인 패턴 인 이유는 무엇입니까?


9

조건문 (IF)에서 모두가 사용 (position < size)하지만 왜 그럴까요?
컨벤션 만 또는 그만한 이유가 있습니까?

야생에서 발견 :

if (pos < array.length) {
   // do some with array[pos];
}

드물게 발견 :

if (array.length > pos) {
   // do some with array[pos];
}

7
오른쪽에 "변수"가있는 것이 마음에 들지 않는 경우가 if (MIN <= x && x <= MAX)있습니다. ( 일부 언어 에서는 MIN <= x <= MAXC 로 작성 될 수 있습니다 . C에서는 완벽하게 합법적이지만 의미가 있다고 생각하는 것은 아닙니다.)
Keith Thompson


5
간격으로 기록하는 방법과 관련이있을 수 있습니다 [min, max]하지 [max, min]. 따라서 요소 x를 작성하여 간격에 속하는 것보다 확인하는 것이 당연합니다 min <= x <= max.
Andres F.

얼마나 어리석은가.
Tulains Córdova 2016 년

두 번째 예는 마치 (! (array.lengh <= pos)) ...처럼 명확하게 설명 될 수 있습니다.
OldFart

답변:


48

더 깊은 패턴은 우리가 자연스럽게 "[다양한 것] [비교] [다양하지 않은 것]"을 표준 순서로 사용한다는 것입니다. 위치가 다를 수 있지만 크기는 다르기 때문에이 원칙은 귀하의 예에 적용됩니다.

평등을 테스트 할 때 유일한 예외는 일부 프로그래머 가 버그가 아닌 공통을 피하기 위해 반대 순서 ( 요다 조건 이라고 함)를 사용하도록 훈련하는 것입니다. 나는 자연 순서가 설명되어 있기 때문에이 아이디어를 잡지 않습니다. 우리가 아이디어를 영어로 표현하는 방식이기 때문에 훨씬 더 읽기 쉽습니다. 대부분의 현대 컴파일러는 이것을 감지하고 경고를 발행하기 때문입니다.variable = constantvariable == constant


3
개발 도구에 따라 많은 구성 요소에 대해서도 경고 (또는 오류)가 발생합니다 variable = constant.
GalacticCowboy

5
+1. constant == variable현상 에 대한 자세한 내용은 "요다 조건"을 검색하십시오 .
John M Gant

나는 내 자신의 코드베이스 (예를 들어 최근에이 같은 일을 본 적이 if(DBNull == row["fieldName"]) methodCall()대부분의 시간은 내가 본 그 주위에 다른 방법으로 일을했기 때문에 내가 미쳐가는 경우 궁금.
앤드류 그레이에게

1
또한 (position < size)종종 상한을 표현 lowerbound <= position < upperbound한다고 덧붙여서 실제로는 상한으로 크기의 일부를 복원합니다. 두 가지 제약 조건이 명시되어 position있으면 중간에만 갈 수 있습니다.
Steve314

4
아마도 언어와 관련이있을 것입니다. 관계가 X 의 특성 인 것처럼 " X 연산자 Y "를 " X 는 ( 연산자 Y )" 로 구문 분석 합니다. 비교를 요청함으로써, 우리는 X 가 좋은지 나쁜지를 묻습니다 (그리고 Y 는 로컬로 상수로 취급됩니다). "pos <array.length"를 묻는 느낌 : "위치가 괜찮습니까 (배열 길이보다 작습니까?)" 그렇지 않다면 그 위치에 문제가있는 것입니다. 또 다른 입장을 알려주세요. 그리고 당신이 원하는 것을 기뻐할 것입니다. 그러나 배열 길이에 대해서는 잘못된 것이 없습니다. "array.length> pos"를 묻는 것은 배열이 너무 짧으면 배열을 늘려야 할 것 같습니다.

14

내가 본 것에 대한 유일한 정당화는 우리가 학교에서 배운 숫자 나 다른 주문과 같다는 것입니다. 예를 들어 다음과 같이 숫자 줄을 작성합니다.

<--|--|--|--|--|--|-->
   1  2  3  4  5  6

작은 것들은 큰 것의 왼쪽에 나타납니다. 날짜와 같은 다른 것들에도 적용됩니다 (달력이 어떻게 배치되는지 생각하십시오).

기본적으로 사물의 순서에 대해 자연스럽게 생각하는 방식으로 요약됩니다. 많은 양식을 처리 할 필요가 없기 때문에 첫 번째 양식을 읽는 것이 더 쉽습니다.


1
더 작은 값으로 평가되는식이 조건에서 먼저 나온다는 것을 의미합니까? 값이 런타임을 변경하면 어떻게 될지 어떻게 확신 할 수 있습니까?
Tulains Córdova 2016 년

@ user61852 런타임에 값이 무엇인지 알 필요가 없습니다. 예 : 런타임 값 A와 값 B에서 계산하는 2 개의 값이 있으며 값 A가 값 B보다 작은 지 테스트하고 싶습니다. "if (valueA <valueB)"라고 쓰겠습니다. valueA가 valueB보다 작은 지 여부는 중요하지 않습니다. 그것을보고하고 valueA가 valueB보다 작을 때 찾고 있다는 것을 알기가 더 쉽습니다. "if (valueB> valueA)"를 보려면이 코드 분기를 따라갈 때 더 작은 것이 무엇인지 생각해야합니다.
Becuzz 2016 년

1
나는 이해하지 못했다. 나는 대답을 투표했다. 이제 투표를하고 싶지만 사이트에서 투표를 변경할 수 있도록 답변을 편집해야합니다. 투표 할 수 있도록 수정 해주세요.
Tulains Córdova 2016 년

@ user61852 지금 투표를 변경할 수 있습니다.
Becuzz

11

그것은 주로 관습의 문제이지만, 이것이 우리가 생각하는 방식과 가장 일치한다고 생각합니다. 강조하는 항목을 보여줍니다.

이것을 영어로 번역하면, 문장의 주제가 일시적인 항목 인 "위치가 배열 길이보다 작은 경우"라는 문구가됩니다.

달리 표현하자면, "배열 길이가 위치보다 큰 경우"는 피사체에 배열 길이 (고정 값으로 가정)를 넣고 위치 (일시적)는 직접 물체가됩니다.


3
실제로 (마지막 문장에서) 위치는 전치사의 대상이됩니다. 그러나 나는 당신이 말하려는 것에 동의합니다. 언어학에서 우리는 위치가 주제 이고 "배열 길이 미만"이 주석 이라고 말할 것 입니다. "주제로 문장 화 된 구성 요소를 문장으로 배치하는 경향이 널리 퍼져 있습니다." en.wikipedia.org/wiki/…
LarsH

4

내 의견은 이것이 내 의견 일 뿐이며 가독성에 대한 관례라는 것입니다. 두 사람은 동일하지만 내 두뇌는 다르게 느낍니다. 배열 크기가 pos보다 큰지 알고 싶지 않습니다. pos가 배열 크기보다 작은 지 알고 싶습니다.

반 빈 대 반 전체 토론과 같습니다. 수학적으로 동일하지만 내 뇌는 상황에 따라 다르게 볼 것입니다.

개인적으로 보면

if (array.lengh > pos) {
    // do some with array[pos];
}

나는 이것이 버그인지 여부와 프로그래머가 무엇을 의미하는지에 대해 생각하기 시작할 것이다. 경계 검사 이외의 작업을 시도하고 있습니까?

어쩌면 나는 밝지 않지만 모든 코드 라인에서 그런 종류의 분석을해야한다면 내 뇌가 아프다.


3

다른 사람들이 시도한 것을 다른 방식으로 표현하기 위해 ...

질서가 프로그램의 행동에 영향을 미치지 않을 때, 그 차이는 분명히 인간에게 가장 읽기 쉬운 문제입니다. 왼쪽에 "주제"를 넣는 것이 언어적인 이유는 다음과 같습니다.

언어학에서, 문장 의 주제 는 이야기되고있는 것이고 주석은주제 에 대해 이야기되고있는 것입니다. 이 예에서 우리는 가정 할 수 position는 IS 주제 "배열의 길이보다"를, 그리고 코멘트 . 영어와 다른 많은 언어로 주제는 일반적으로 주석 앞에 표시됩니다.
" 주제화 된 구성 요소를 문장에 처음 배치하는 주제가 널리 퍼져 있습니다. "

엄지 손가락의 좋은 규칙은, (이 경우, 또는 절) 문장으로 된 코드의 라인을 생각 문장이 무엇인지 결정하는 것입니다 그래서 , 당신이 할 수있는 경우 먼저 넣어. 종종, 문장의 "약"은 상수가 아닌 변수가 될 것입니다. 그러나 때로는 주석 에도 변수가 포함되므로 그렇게 할 수는 없습니다.


1

초기 언어가 컴파일 된 기본 어셈블러 (및 현재 많은 언어)에서 나온 두 가지 요소의 조합입니다.

  1. 배열은 메모리에서 0부터 시작하는 오프셋입니다 (즉, 첫 번째 데이터 청크는 할당 된 메모리 블록의 시작 (0- 인덱스)에 있음). 따라서 다양한 부품에 0..n-1을 사용합니다.

  2. 값이 다른 값 (또는 레지스터 등)보다 작은 경우 분기는 일반적으로 단일 명령어입니다. 따라서 간단한보다 작음 (<) 연산자를 사용하십시오.

따라서이 패턴은 구시대 어셈블러에서 ANSI-C (어떻게 든 매크로 어셈블러와 유사 함)로 이동하여 Java 및 다른 C 유사 언어로 이동했습니다.


0

다른 많은 답변들이 말했듯이, 종종 읽는 것이 훨씬 쉽습니다.

[thing that varies] [comparison] [thing that does not vary]

내가 아는 거의 모든 사람이이 스타일을 독점적으로 사용합니다.

=할당과 ==비교에 사용하는 C 스타일 언어에는 예외가 있습니다 . 실수로 입력 한 경우 :

if (variable = 5) ...

대신에:

if (variable == 5) ...

유효한 코드 줄이므로 오류가 발생하지 않습니다. (일부 컴파일러와 IDE는이 작업에 대해 경고하지만 간단한 오타를 갖는 것은 여전히 ​​쉽습니다.)

그러나 다음과 같이 쓰는 경우 :

if (5 == variable) ...

컴파일러 / 인터프리터는 유효한 구문이 아니기 때문에 오류가 발생합니다 (대부분의 언어에서는 어쨌든).

이 전환은 종종 요다 조건 이라고합니다 .

업데이트 : 다음은 Yoda 조건이 유용한 장소 목록입니다 .


-1

개인적으로 나는 이것을 선호합니다 :

bool positionIsWithinBounds = pos < array.length;
if (positionIsWithinBounds) {
   // do some with array[pos];
}

... 더 많은 코드이지만 읽기도 쉽습니다.


4
비교 이름을 +1. 그러나 실제로는 더 복잡한 조건에 대해서는이 방법이 더 좋으며 이와 같은 간단한 경우에는 그렇지 않습니다. 실제로 "내" "경계", 나 "배열"에 대해 생각을 중지하게하고, 무슨 뜻인지 그 모든 때 나는 본능적으로 그것이 무엇을 의미하는지 알 pos수하는 > array.length. 다시 말해, 조건의 의미를 매우 명확하게하더라도 실제로는 IMO를 읽는 것이 조금 더 어려워집니다.
John M Gant

추적해야 할 또 다른 이름은 ...
Deduplicator

-1

선호도 또는 관습의 문제입니다. 일관되게하려면 두 가지 방법으로 합리적으로 진행할 수 있습니다.

  1. 항상 "피험자"를 먼저 입력하십시오 (문장으로 생각하십시오)-시험의 가치입니다. 예를 들어if (age>5)

  2. 또는 항상 작은 요소를 먼저 넣으십시오 (화면에서 값이 자연 순서대로 정렬 될 때 생각하십시오). 예를 들어이 if (a<b)코드가 대부분 약 a인지 또는 거의 b인지에 관계없이 작성 합니다.

두 규칙 모두 두 번째 대신 표시 한 첫 번째 스 니펫을 권장하므로이 특정 경우에 답이있는 것 같습니다. 나는 (1)과 (2)를 모두 위반하는 코드를 작성하지 않는 것이 현명하다고 말하고 싶습니다. 대부분의 사람들이 읽기가 더 어려울 것입니다.

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