모범 사례 부울 할당 [닫힘]


10

다른 개발자로부터 인계받은 프로그램에서 다음 조건을 발견했습니다.

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

나는이 코드가 중복적이고 추악하다고 생각하므로 비교를 기반으로 간단한 부울 할당이라고 생각한 것으로 변경했습니다.

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE;

이것을 보았을 때, 내 코드를 검토 한 사람은 변경 사항이 기능적으로 정확하지만 다른 사람이 혼란스럽게 할 수 있다고 언급했습니다. 그는 삼항 연산자를 사용하면이 할당을보다 명확하게 할 수 있지만 더 많은 중복 코드를 추가하는 것을 좋아하지 않습니다.

obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE) ? true : false;

그의 추론은 다른 개발자가 당신이 한 일을 정확히 멈추고 퍼즐을 풀어야하는 경우 가장 간결한 방식으로 무언가를하는 것이 가치가 없다는 것입니다.

여기서 실제 질문은 부울에 값을 할당하는이 세 가지 방법 중 obj.NeedsChange가장 명확하고 유지 관리가 가능한 방법은 무엇입니까?


25
세 번째 형태는 말도 안됩니다. 그것은 두 번째 형태에서 이미 명백하게 드러나야 할 것을 말하고 있습니다.
Robert Harvey

6
이것은 전적으로 개인 취향에 달려 있습니다. 우리는 그렇지 않은 척 할 수 있지만 그것들은 기능적으로 동일하기 때문에 스타일로 귀결됩니다 . 물론, 가독성에는 차이가 있지만, "읽기 쉽고 투명"한 것은 "
분명

3
@scriptin 5-8 줄 v 1 줄은 기본 설정보다 많으며 일반적으로 5-8 줄이 더 명확하고 좋습니다. 이 간단한 예에서는 1 라인을 선호하지만 일반적으로 1 라이너로 난독 처리 된 10 개의 라이너가 너무 많아서 편안합니다. 나는 변형 1에 대해 결코 불평하지 않을 것이지만, 예쁘지 않을 수도 있지만 명확하고 명백하게 일을 수행합니다.
gbjbaanb 2016 년

4
옵션 1과 3은 "저자는 부울 논리를 실제로 이해하지 못한다"고 말합니다.
17 of 26

2
값 1에 따라 중단 점을 자주 설정해야하는 경우 변형 1이 유용 할 수 있습니다.
Ian

답변:


39

나는 2를 선호하지만, 약간 조정하려고 할 수 있습니다.

obj.NeedsChange = ( obj.Performance <= LOW_PERFORMANCE );

나에게 괄호를 사용하면 행을 구문 분석하기가 쉽고 비교 결과를 할당하고 이중 할당을 수행하지 않음을 한눈에 알 수 있습니다. 왜 그런지 잘 모르겠습니다 (손으로 괄호가 실제로 이중 할당을 막는 언어를 생각할 수는 없습니다).


4
이것은 정답입니다-질문의 코드는 정확하지만 괄호를 추가하면 독자에게 할당이 아니라고 알립니다. 코드를 빠르게 살펴보면 대괄호는 즉각적인 추가 정보를 제공하여 코드가 그와 같은 의미 였는지 우발적 인 버그가 아닌지 더 가까이에서 볼 수 없게합니다. 예를 들어, 행이이라고 가정 a = b == c합니다. 부울을 할당했거나 b와 a 모두에 c를 할당한다는 의미입니까?
gbjbaanb 2016 년

괄호는 파이썬에서 이중 할당을 방지합니다. 이중 할당을 방해하지 않는 언어에서도 괄호는 두 가지 유형의 작업을 처리하고 있음을 나타내는 데 도움이됩니다.
user2357112는 Monica

23

변형 1은 쉽게 이해할 수 있지만 이것이 유일한 장점입니다. 나는 이런 식으로 쓰는 사람은 부울이 무엇인지 실제로 이해하지 못하고 다른 많은 측면에서 유사하게 유아 코드를 작성할 것이라고 자동으로 가정합니다.

변형 2는 내가 항상 쓰고 읽을 것을 기대합니다. 그 관용구에 혼란스러워하는 사람은 소프트웨어의 전문 작가가되어서는 안된다고 생각합니다.

변형 3은 1과 2의 단점을 결합시킨다.


변형 1은 변형 2와의 이점을 공유합니다.
중복 제거기

1
영아 코드의 경우 +1 나는 수년간 그러한 코드를 살펴 봤지만 그것을 식별 할 수있는 올바른 단어가 부족했습니다.
Lilienthal 2016 년

1
변형 1과 같은 코드를 사용한 첫 번째 가정은 과거 어느 시점의 두 가지가 더 복잡하고 리팩토링 할 때 누군가주의를 기울이지 않았다는 것입니다. 그러나 그것이 처음 쓰여졌을 때의 방식이라면, 나는 "부울을 이해하지 못합니다"
Izkata

13

언제라도 코드는 "무엇을해야합니까?" 독자의 냄새.

예를 들어, 첫 번째 예는 "if / else 문에 제거 된 시점에 다른 기능이 있었습니까?"

예제 (2)는 간단하고 명확하며 필요한 것을 정확하게 수행합니다. 나는 그것을 읽고 코드가 무엇을 즉시 이해합니다.

(3)에 여분의 보풀이 생기면 저자가 왜 (2)가 아닌 그런 식으로 썼는지 궁금해 할 것입니다. 이유 가 있어야 하지만이 경우에는없는 것처럼 보이므로 구문이 존재하지 않는 것을 제안하기 때문에 전혀 도움이되지 않으며 읽기가 더 어렵습니다. 존재하는 것을 배우려고하면 (아무것도 없을 때) 코드를 읽기가 더 어려워집니다.


2

변형 2와 변형 1이 일련의 명백하고 간단한 리팩토링을 통해 관련되어 있음을 쉽게 알 수 있습니다.

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

여기에 불필요한 코드 복제가 있으며 할당을 제외 할 수 있습니다.

obj.NeedsChange = if (obj.Performance <= LOW_PERFORMANCE)
{
    true
}
else
{
    false
}

더 간결하게 작성 :

obj.NeedsChange = if (obj.Performance <= LOW_PERFORMANCE) true else false

이제 조건이 참이면 true를 할당하고 조건이 false이면 false를 할당한다는 것을 즉시 분명해야합니다. IOW는 단순히 조건 값을 할당합니다.

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE

변형 1과 3은 비교의 반환 값이 무엇인지 이해하지 못하는 사람이 작성한 일반적인 신인 코드입니다.


if (...) ... false 부분을 멋진 부분 바로 앞에 주석으로 추가하면 코드 선명도와 더 나은 코드를 통해 간단한 스캔을 얻을 수 있습니다.
DaveM

2

당신의 프로그래밍은 "코드를 유지하는 사람이 당신이 사는 곳을 아는 폭력적인 정신병자처럼"암묵적으로 표현하는 경향이 있지만, 당신 당신의 정신적 후임자가 유능 할 몇 가지 기본적인 것들을 가정 수 있습니다 .

그 중 하나는 그가 사용하는 언어 의 구문 입니다.

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE;

C / C ++ / C # / Java / Javascript 구문을 아는 사람에게는 매우 분명합니다.

또한 8 줄보다 훨씬 읽기 쉽습니다.

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.NeedsChange = false;
}

실수에 덜 취약

if (obj.Performance <= LOW_PERFORMANCE)
{
    obj.NeedsChange = true;
}
else
{
    obj.Needschange = false;
}

언어의 구문을 절반 잊어 버린 것처럼 불필요한 문자를 추가하는 것보다 낫습니다.

obj.NeedsChange = obj.Performance <= LOW_PERFORMANCE ? true : false;

obj.NeedsChange = (obj.Performance <= LOW_PERFORMANCE);

일관성없는 순서, 일관성없는 왼쪽 / 오른쪽 연관성, 과부하 된 기호 사용, 중괄호 / 들여 쓰기 복제, 삼항 연산자, 접두사 표기법 등 여러 언어의 C와 같은 구문에는 많은 잘못이 있다고 생각합니다.

그러나 솔루션은 독자적인 독점 버전을 발명하지 않습니다. 모든 사람이 자신의 것을 만들면서 그렇게하는 것은 광기입니다.


일반적으로 Real World TM 코드를 읽을 수 없게 만드는 가장 중요한 것은 그 양입니다.

비 병리학 적 200 라인 프로그램과 사소하게 동일한 1,600 라인 프로그램 사이에서 더 짧은 프로그램은 거의 항상 파싱하고 이해하기가 더 쉽습니다. 나는 당신의 변화를 언제든지 환영합니다.


1

대부분의 개발자는 두 번째 양식을 한 눈에 이해할 수 있습니다. 제 1 형식과 같이 단순화에 대한 제 의견으로는 단순히 불필요합니다.

다음과 같이 공백과 중괄호를 추가하여 가독성을 향상시킬 수 있습니다.

obj.NeedsChange =    obj.Performance <= LOW_PERFORMANCE;

또는

obj.NeedsChange = ( obj.Performance <= LOW_PERFORMANCE );

Jacob Raihle이 언급했듯이

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