[if-statement] 여러 조건으로 if 문을 형식화하는 가장 좋은 방법

두 개 이상의 조건을 기반으로 일부 코드를 실행하려면 if 문을 형식화하는 가장 좋은 방법은 무엇입니까?

첫 번째 예 :-

if(ConditionOne && ConditionTwo && ConditionThree)
{
   Code to execute
}

두 번째 예 :-

if(ConditionOne)
{
   if(ConditionTwo )
   {
     if(ConditionThree)
     {
       Code to execute
     }
   }
}

각 조건이 긴 함수 이름이나 그 밖의 것일 수 있다는 점을 염두에두고 이해하고 읽는 것이 가장 쉽습니다.



답변

나는 옵션 A를 선호한다

bool a, b, c;

if( a && b && c )
{
   //This is neat & readable
}

특히 긴 변수 / 방법 조건이있는 경우 줄 바꿈 만하면됩니다.

if( VeryLongConditionMethod(a) &&
    VeryLongConditionMethod(b) &&
    VeryLongConditionMethod(c))
{
   //This is still readable
}

더 복잡한 경우 if 문 외부에서 조건 메서드를 별도로 수행하는 것이 좋습니다.

bool aa = FirstVeryLongConditionMethod(a) && SecondVeryLongConditionMethod(a);
bool bb = FirstVeryLongConditionMethod(b) && SecondVeryLongConditionMethod(b);
bool cc = FirstVeryLongConditionMethod(c) && SecondVeryLongConditionMethod(c);

if( aa && bb && cc)
{
   //This is again neat & readable
   //although you probably need to sanity check your method names ;)
}

IMHO 옵션 ‘B’의 유일한 이유 else는 각 조건에 대해 실행할 별도의 기능 이있는 경우 입니다.

예 :

if( a )
{
    if( b )
    {
    }
    else
    {
        //Do Something Else B
    }
}
else
{
   //Do Something Else A
}


답변

다른 답변은 첫 번째 옵션이 일반적으로 가장 좋은 이유를 설명합니다. 그러나 여러 조건이있는 경우 옵션 1에서 조건 검사를 수행하는 별도의 함수 (또는 속성)를 만드는 것이 좋습니다. 이렇게하면 최소한 좋은 메서드 이름을 사용할 때 코드를 훨씬 쉽게 읽을 수 있습니다.

if(MyChecksAreOk()) { Code to execute }

...

private bool MyChecksAreOk()
{
    return ConditionOne && ConditionTwo && ConditionThree;
}

조건은 지역 범위 변수에만 의존하므로 새 함수를 정적으로 만들고 필요한 모든 것을 전달할 수 있습니다. 믹스가 있으면 현지 물건을 전달하십시오.


답변

첫 번째 예는 “읽기 쉬움”입니다.

사실, 제 생각에는 “else logic”을 추가해야 할 때마다 두 번째 것을 사용해야하지만 간단한 Conditional의 경우 첫 번째 맛을 사용하십시오. 조건의 길이가 걱정된다면 항상 다음 구문을 사용할 수 있습니다.

if(ConditionOneThatIsTooLongAndProbablyWillUseAlmostOneLine
                 && ConditionTwoThatIsLongAsWell
                 && ConditionThreeThatAlsoIsLong) {
     //Code to execute
}

행운을 빕니다!


답변

이 질문에 대한 답변은 지금까지 순전히 “구문 적”근거로 결정을 내려야하는 것처럼 답변되었습니다.

if 내에서 여러 조건을 배치하는 방법에 대한 정답은 “의미론”에도 의존 해야 합니다. 따라서 조건은 “개념적으로”결합되는 것에 따라 분류되고 그룹화되어야합니다.

두 테스트가 실제로 동일한 동전의 양면 인 경우 예. (x> 0) && (x <= 100)이면 같은 줄에 함께 넣으십시오. 다른 조건이 개념적으로 훨씬 더 먼 경우 예. user.hasPermission (Admin ()) 그런 다음 자체 줄에 넣으십시오.

예 :

if user.hasPermission(Admin()) {
   if (x >= 0) && (x < 100) {
      // do something
   }
}


답변

if (   ( single conditional expression A )
    && ( single conditional expression B )
    && ( single conditional expression C )
   )
{
   opAllABC();
}
else
{
   opNoneABC();
}

다음과 같이 if-else 문에서 여러 조건식 형식을 지정합니다.

  1. 가독성 향상 :
    a. 먼저 표시된 표현식의 모든 이진 논리 연산 {&&, ||}
    b. 각 이진 연산의 두 조건부 피연산자는 수직으로 정렬되기 때문에 분명
    합니다. c. 중첩 된 논리 표현식 연산은 절 내부의 중첩 문과 마찬가지로 들여 쓰기를 사용하여 명확 해집니다.
  2. 명시적인 괄호가 필요합니다 (연산자 우선 순위 규칙에 의존하지 않음)
    . 이것은 일반적인 정적 분석 오류를 방지합니다.
  3. 쉽게 디버깅 할 수 있습니다
    . //
    b로 개별 단일 조건부 테스트를 비활성화 합니다. 개별 테스트
    ceg 직전 또는 후에 중단 점 설정 …
// disable any single conditional test with just a pre-pended '//'
// set a break point before any individual test
// syntax '(1 &&' and '(0 ||' usually never creates any real code
if (   1
    && ( single conditional expression A )
    && ( single conditional expression B )
    && (   0
        || ( single conditional expression C )
        || ( single conditional expression D )
       )
   )
{
   ... ;
}

else
{
   ... ;
}


답변

두 번째는 Arrow Anti-pattern 의 고전적인 예 이므로 피하고 싶습니다.

조건이 너무 길면 메서드 / 속성으로 추출하십시오.


답변

첫 번째는 더 쉽습니다. 왜냐하면 왼쪽에서 오른쪽으로 읽으면 “If something AND somethingelse AND somethingelse THEN”, 이것은 이해하기 쉬운 문장입니다. 두 번째 예는 “If something THEN if something else, THEN if something else THEN”로, 어색합니다.

또한 절에 일부 OR를 사용하고 싶은지 고려하십시오. 두 번째 스타일에서는 어떻게 수행 하시겠습니까?