2009-04-14 2 views
8

나는 개인적으로 다음 코드를 사용하여 아무 문제가단일 if 문에서 조건부의 올바른 균형은 어디에 있습니까?

if (Object foo != null && !String.IsNullOrEmpty(foo["bar"])) 
{ 
    // do something 
} 

나는 다음과 같은 5 술어가 있었다 말하면

if (Object foo != null) 
{ 
    if (!String.IsNullOrEmpty(foo["bar"])) 
    { 
     // do something 
    } 
} 

하지만이 관점으로 지금까지 안 갈거야 너무 장황 생각하기 때문에 편집기에서 텍스트를 한 번에 볼 수 있도록 줄 바꿈을해야했습니다. 비슷한 방법으로 단일 if 문에 포함 할 술어의 수를 나타내는 논리적 "선"이 있습니다. 7 개 이상의 매개 변수

+0

결코 절대로 말하지 마십시오. printf 함수 군에서 7 개 이상의 매개 변수를 사용 해본 적이 있습니까? – Les

답변

10

예를 들어 else 절을 추가하는 것이 다른 결과를 제공한다고 생각하면 두 문장의 if 문을 다시 작성한다고 생각하지 않습니다. 조건의 긴 목록과 함께이 문제는 너무 많이하지 않습니다

if(won_jackpot(obj)) ... 
3

술어의 수는 아니지만 복잡성의 수. 코드가 최소한의 노력으로 무엇을하는지 이해할 수 있다면, 나에게는 괜찮아 보인다.

추가하려면 필자는 다중으로 변경하지 않을 것이지만 조건부에 대한 함수를 추가합니다. 특히 여러 위치에서 동일한 수의 술어가 사용되는 경우

1
내가 어떤 규칙이 있지만, 거기에 생각하지 않는다

: 그것은 당신이 다른 사람에게 보여 때, 그들은 그것을 이해하는 데 어려움을 겪고 충분히 복잡한

  1. 입니까?
  2. 여러 줄을 포함해야합니까?
  3. 여러 개의 'if'절에서 반복적 인 조건 확인을 수행합니까? 이것은 어떤 방법으로 필요한 리팩토링을 가리킬 것입니다.

위의 사항 중 하나라도 적용되면 다시 작성해 드리겠습니다.

9

다양한 유형의 연산자와 올바른 형식의 균형이 맞다고 생각합니다. 운영자 모두 (모든 "과"또는 전부 "또는") 같은 경우에, 당신은 아마 이해를 잃지 않고 함께 표현의 무한한 수를 연결할 수 있습니다 : 그것은 당신이 무엇을하는지에 따라 달라집니다

if (something() && 
    something_else() && 
    so_on() && 
    so_forth() && 
    some_more_stuff() && 
    yada() && 
    yada() && 
    yada() && 
    newman() && 
    soup_nazi() && 
    etc()) 
    ... 
3

. 두 번째 명령문은 역순으로 다른 결과를 생성합니다. (앞에 "not"를 추가하십시오) 이것은 매우 일반적인 버그 소스입니다.

작동하는 약 20 개의 술어로 코드를 보았습니다 (또는 적어도 충분히 잘 작동합니다!) 엄지 손가락 규칙, 나는 개가 저녁 식사처럼 보이는 경우 리팩토링을 고려합니다.

4

나는 마법의 숫자가 있다고 생각하지 않는다. 모든 술어가 합리적으로 이해된다면, 나는 함께 놓을 것이다. 여기에는 if 문을 두 줄로 나눌 수도 있지만 대개 여분의 if 문은 사용하지 않습니다. 그러나 특히 길면 모든 진술이 정말로 필요한지 스스로에게 물어야합니다. 아마도 이전에 값의 일부를 필터링 할 수 있습니다. 가장 큰 관심사는 가독성입니다. 다른 사람이 이해하기 어렵다면 코드를 리팩토링해야합니다. 하지만 코드를 두 개의 서로 다른 if 문으로 분리하면 코드를 읽기 쉽도록 만들지 않고 단지 더 많은 행을 차지하게됩니다.

5

단기 기억은 7 가지 항목의 용량을 제공합니다. 이것은 5 가지가 다른 객체를 포함하는 표현이 일시 중지하고 그것에 대해 생각할 필요가 있음을 의미합니다.

1

: 나는 상태에서 원자 명제의 수를 줄이기 위해 원한다면, 내가 좋아하는, 함께 자신의 기능을 이해하는 몇 가지 요인 것이다 가독성의 손실이 있지만, 테스트 가능성의 손실. 특히 나쁜 방법론을 다루는 경우에는 허락보다는 용서를 구하는 것이 더 쉽습니다 (예 : this question에 대한 답 참조). 그렇게하면 코드를 깨끗하고 테스트 가능하게 유지하고 호출자를 수정하거나 결과 예외를 처리하도록 할 수 있습니다.

0

모두 수행해야 할 작업에 따라 다릅니다. 그러나 특정 알고리즘을 덜 장황 할 것으로보고 할 수 있습니다 한 가지 switch 문입니다 :

switch (myVal) 
{ 
    case "isThis": 
    case "isThat": 
    case "something else": 
     doThis(); 
     break; 
    case "another": 
    case "yet another": 
    case "even another": 
     doThat(); 
     break; 
    case "another one": 
    case "more more": 
     doThisAgain(); 
     break; 
}

것을 이렇게하면 다른 if 문에서 매우 자세한했을 것이다. 일부 코드는 if 및 else 문을 필요로하며, 일부는 압축 될 수 있습니다. 코드 소스의 정확성에 대한 코드 실행 품질을 절대로 희생하지 마십시오.

0

어느 쪽이 더 낫습니까? 둘 다. 둘 다의 의미가 다릅니다.

내가 분할 쉽게 디버깅 할 수 있지만 동의하지만, 그것의 간단한 조합의 'AND 나'또는 그 이상 3 개 테스트에 비해입니다 만약 그렇게 조건부 중단 점 :

을하지, 그것을 리팩토링.

관련 문제