조건이 긴 경우 가장 잘 읽을 수있는 방법은 무엇입니까? [닫은]


43

가능하면 긴 와인딩 if조건을 피해야하지만 때때로 우리는 글씨를 쓰게됩니다. 매우 간단한 조건이라 할지라도 관련된 진술은 때로는 매우 말이 많기 때문에 전체 조건이 매우 길어집니다. 그것들을 포맷하는 가장 읽기 쉬운 방법은 무엇입니까?

if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) {
    thud();
}

또는

if (
    FoobarBaz::quxQuux(corge, grault)
 || !garply(waldo)
 || fred(plugh) !== xyzzy
) {
    thud();
}

또는

if (FoobarBaz::quxQuux(corge, grault)
    || !garply(waldo)
    || fred(plugh) !== xyzzy) {
    thud();
}

또는

thudable = FoobarBaz::quxQuux(corge, grault);
thudable ||= !garply(waldo);
thudable ||= fred(plugh) !== xyzzy;

if (thudable) {
    thud();
}

또는 다른 환경 설정?

답변:


30

긴 조건이 리팩토링이 필요한 코드의 부호 인 경우가 종종 있지만 피할 수없는 경우도 있습니다. 이 경우 첫 번째를 선호합니다.

if (bar || baz || quux) { ... }

한 줄로 무슨 일이 일어나고 있는지 알 수 있기 때문입니다. 그러나 가능한 경우 다음과 같이하십시오.

function foo() {
  return bar || baz || quux;
}

if (foo()) { ... }

3
세로 대 가로로 스크롤하는 것은 그것이 나쁜 옛날 시절의 거의 한계가 아닙니다 ...
Bill

2
사람들이 여기서 테스트 한 내용을 이해할 수 있도록 기능에 의미있는 (비즈니스) 이름을 지정하십시오.
Matthieu M.

19

나는 연속성을 나타 내기 위해 연산자를 마지막에 유지하는 것을 좋아합니다.

if (the_function_being_called() != RETURNCODE_SUCCESS &&
    the_possibly_useful_recovery_strategy() == RETURNCODE_EPICFAIL &&
    this_user_has_elected_to_recieve_error_reports)
{
    report_error();
}

1
나는 이것을 좋아한다고 생각합니다. 우선 순위도 이해할 수 있도록 많은 괄호를 사용합니다.
Jasarien

5
나는 논리 연산자를 줄의 시작 부분에 두는 것을 선호하므로 줄을 읽을 때 규칙적인 코드 줄이 아니라 조건부의 일부임을 쉽게 알 수 있습니다.

11

나는 의미있는 변수 이름을 좋아합니다.

const bool isInAStrangeCondition =
    FoobarBaz::quxQuux(corge, grault) ||
    !garply(waldo) ||
    fred(plugh) !== xyzzy;

if (isInAStrangeCondition) {
    thud();
}

또는 위에서 언급했듯이 함수로 리팩토링하십시오.


7

더 지저분한 하위 표현식 또는 모두를 부울 변수로 나눕니다. 그러면 'if'문의 최상위 부울 논리가 명확해질 수 있습니다. 내가하는 일에서, 항상 여러 가지 일이 아닙니다.

bool goodblah = some_mess < whatever;
bool frobnacious = messy_crud != junky_expression;
bool yetanother = long_winded_condition;

if (goodblah || (frobnacious && yetanother))   {
    ...
}

이것은 'if'를 실행하기 전에 모든 부울을 볼 수있는 디버거에서 특히 좋습니다.


나는 이것도 좋아하지만 한 가지 이점을 잃습니다. 더 이상 비싼 비교를 더 이상 단락시킬 수 없습니다.

... 그리고 하루 종일 수많은 변수의 이름을 지정해야합니다 ...
cronvel

6

새로운 줄의 시작 부분에 연산자를 정렬하는 경향이 있으므로 용어를 결합하는 방법 (긴 논리 및 긴 산술 모두)을 기억합니다. 이처럼 :

if (first_attempt(data) == SUCCESS
    || (reusable(data) && second_attempt(data) == SUCCESS)
    || (still_reusable(data) && third_attempt(data) == SUCCESS))
  return SUCCESS;

이것은 2 칸 들여 쓰기 또는 환경을 여러 줄 술어 들여 쓰기로 설정 한 경우에만 작동합니다.


0

나는 다음의 팬입니다.

if (really_long_expression && another_really_really_long_expression && 
            another_very_long_expression_OMG_id_it_long){
    bugs();
}

이런 식으로 여전히 if 식처럼 보이고 if-to-pieces if식이 아닙니다. 들여 쓰기는 이전 줄의 연속임을 보여줍니다.

여는 괄호가 이전 줄의 끝에 올 때까지 들여 쓰기를하여 if 표현식이 예상대로 끝날 수 있습니다.


1
나는 당신의 bugs () 메소드가 정말 마음에 들었습니다 : D
Joe Phillips
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.