2012-09-27 2 views
1

I 코드의 다음 블록을 가지고중첩을 단순화하는 데 도움이 필요한 경우 블록

x는 정수이고
if (x > 5) 
{ 
    if (!DateTime.TryParse(y, out z)) 
     break; 
    if (w.CompareTo(z) == -1) 
     break; 
} 

, Y는 문자열, Z 및 W는 날짜 시간 변수이다. break;의 이유는 전체 블록이 루프 내에 있기 때문입니다.

읽기 쉽게하기 위해이 방법을 단순화 할 수 있습니까?

+1

코드에 아무 문제가 없다고 생각합니다. 당신이 할 수 있기 때문에 한 줄에 모든 것을 삽으로하려고하지 마십시오. – nemesv

+0

@nemesv 전적으로 동의합니다. 말하기 변수 이름과 짧은 설명을 사용하여 휴식 이유를 설명하는 것이 좋습니다. – lupz

+1

실제로 두 점은 모두 내 코드에서 처리됩니다. 실제 변수 이름은 너무 길기 때문에 게시하기 전에 대체했습니다. 왜 루프가 깨져야하는지 설명하는 바로 앞에 주석이 있습니다. – Ozzyberto

답변

1

더 중요한 : w, x, y, z에 대한 설명 변수 이름을 사용 (희망이 이름은 당신의 예를 들어했다) :

또한 운영자 대신 CompareTo보다보다 작거나 큰를 사용할 수 있습니다.

if (x > 5) 
{ 
    bool isValidDate = DateTime.TryParse(y, out z); 
    if (!isValidDate || z > w) 
    { 
     // comment like: stop processing if the current date 
     // is after the reference date, or if there was a parsing error 
     break; 
    } 
} 
+0

이것은 정확히 제가 찾고있는 종류의 것입니다. 단지 하나의 작은 것 -'z Ozzyberto

2
if (x > 5) 
{ 
    if(!DateTime.TryParse(y,out z) || w.CompareTo(z) == -1) 
     break; 
} 

두 조건은 동일한 결과를 가지므로 하나의 조건으로 결합 될 수 있습니다.

+0

첫 번째 조건과 동일한 작업을 수행하면 가독성이 향상됩니다. – Ozzyberto

+0

@Ozzyberto 나는 대답을 쓸 때 그 사실을 알았지 만 나는 정말로 모른다. 그것은 당신의 판단을 요구하지만 그것이 나라면 아마 이런 식으로 할 것입니다. 개인적으로 나는 백만 가지 조건의 조건문을 읽지 않아도됩니다. –

+0

전체적인 문제는 모두 그 순서대로 요구된다는 것입니다. 첫 x 째 조건이 실패하면 아무것도 수행하지 않아야합니다. 두 번째 것이 실패하면 세 번째 것은 실패 할 것이다. 왜냐하면'(획득 된)'z 값을 필요로하기 때문이다. – Ozzyberto

2
if ((x > 5) && (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1)) 
    break; 
+0

그것은 매우 간결하지만 절대적으로 읽을 수없고 따르기가 매우 어렵지만. OP는 "읽기 쉽도록"하려고합니다 ... – nemesv

+0

@nemesv 가독성은 주관적입니다. 예를 들어, 나는 이것을 더 쉽게 읽을 수 있습니다. 어쨌든, OP는이 대답이하는 진술을 단순화하도록 요청했습니다. 답변을 단순화하는 것이 가독성을 향상 시킬지 또는 그다지 떨어 뜨릴 지 여부는 또 다른 (주관적인) 질문입니다. – Servy

0
if (x > 5){ 
    if (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) break; 
} 
2

'단순화'는 읽기가 쉽지 않음을 의미합니다.

당신은에 의해 코드를 쉽게 읽을 수 (그리고 더 다양한 코딩 규칙의 관련 확보) 할 수있다 : '!'

1) 문 및 alikes가

2) 사용하지 않는 경우 항상 괄호를 사용하여 ('== false'는 훨씬 더 명시적임)

3) 변수가 무엇인지 명시 적으로 나타내는 변수 이름을 사용하십시오.

4) 여러 개의 break 문을 사용하지 마십시오. 대신 while 조건에서 평가되는 플래그를 사용하십시오.

5) 코드가 여전히 읽기 어려운 경우 : 의견을 사용하십시오!

+0

+1에 # 2. 때로는'== false'라고 쓰는 사람은 제가 유일하다고 느낍니다.'! '가 간과하기 쉽기 때문에 훨씬 더 읽기 쉽다고 생각합니다. –

+0

사람들마다 다른 규칙/지침이 있습니다. 예를 들어 유효한 예외가 있다고 생각할 때 # 1은 규칙이 아니라 지침이라고 생각합니다. 나는 # 2와 완전히 동의하지 않는다. 나머지는 절대적인 것이 아니며 이미 지침으로 기재되어 있습니다. 가독성은 항상 주관적이므로 그 이유 때문에 보편적으로 적용되는 엄격하고 빠른 규칙을 찾을 수 없습니다. – Servy

1

다음은 하나 이상의 버전입니다.

var Break = x > 5 ? ((!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) ? true : false) : false; 

짧지 만 가독성을 저해합니다. 만, 두 가지 중 하나를 수행 루프를 실행하거나 루프 (하나를 경우 한 다른)을 실행하지 않기 때문에

+0

true/false로 해석하는 조건 연산자의 핵심은 무엇입니까? 그것들은 완전히 중복되어 제거 될 수 있습니다. [예] (http://stackoverflow.com/a/12627155/1159478) – Servy

+0

true/false와 함께 작동합니까? –

+0

나는이 질문에 대한 다른 대답에 대한 링크를 제공하지 않았다. 그냥 링크를 따르십시오. – Servy

3

당신은하지 필요성에게 코드를 실행할 수 multilpe if 블록을한다. 표시된 바와 같이 here은 하나의 부울 표현식을 사용하여 루프 반복을 건너 뛸 지 여부를 나타낼 수 있습니다.

(x > 5) && (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) 

이와 같이 루프 내부와 같은 복잡한 조건을 포함하면 가독성이 저하 될 수 있습니다.

while(!done) // or whatever the while loop condition is 
{ 
    if(itemIsValid(x, y, w, out z)) 
    { 
     //the rest of your loop 
    } 
} 

//it may make sense for x, y, w, and possibly z to be wrapped in an object, or that already may be the case. Consider modifying as appropriate. 
//if any of the variables are instance fields they could also be omitted as parameters 
//also don't add z as an out parameter if it's not used outside of this function; I included it because I wasn't sure if it was needed elsewhere 
private bool itemIsValid(int x, string y, DateTime w, out DateTime z) 
{ 
    return (x > 5) 
     && (!DateTime.TryParse(y, out z) || w.CompareTo(z) == -1) 
} 

이 몇 가지 장점이 있습니다 : 루프 이런 식으로 뭔가를 보았다 그래서 개인적으로, 나는 간단하게하는 방법으로이 조건을 추출합니다. 첫째, 주석을 필요없이 코드를 스스로 문서화하는 방법입니다. 루프를 볼 때 "내가 끝내지 않은 상태에서 항목이 유효하면이 모든 작업을 수행합니다"라고 읽을 수 있습니다. 타당도가 정의 된 방법에 관심이있는 경우 메서드를 살펴보고, 그렇지 않으면 건너 뜁니다.메소드의 이름을 "isReservationSlotFree"또는 실제로 표시되는 것과 같은 더 구체적인 이름으로 변경할 수도 있습니다.

유효성 검사 논리가 복잡한 경우 (다소 복잡함) 더 복잡한 루프를 어지럽히 지 않고 설명과 설명을 추가 할 수 있습니다.

+0

당신의 답이 도움이된다는 것을 발견했습니다. 그래서 부분적으로 그것을 구현할 것입니다. 그러나 내가 가장 좋아하는 답변은 @Justin이 제공 한 답변 일 것입니다. 귀하의 답변을 유용하다고 표시 할 수 있다면 가능합니다. – Ozzyberto

+0

나는이 솔루션을 좋아한다. 간단하고 우아하다. –