2013-12-12 4 views
1

더 우아한 코드를 제안하고 싶습니다. 나는이 IF 문이 있습니다 이 IF 문을 응축하는 데 도움이 필요합니다.

if ((!mainFlag and 
     form.opt1 == store.opt1 and form.opt2 == store.opt2 and 
     form.opt3 == store.opt3 and form.opt4 == store.opt4) or 
    (mainFlag and 
     form.opt1 == store.opt1 and form.opt2 == store.opt2 and 
     form.opt3 == store.opt3 and form.opt4 == store.opt4 and 
     form.opt5 == store.opt5 and form.opt6 == store.opt6)){ 
    dataHasBeenUpdated = False; 
} else { 
    dataHasBeenUpdated = True; 
} 

는 기본적으로 나는 항상 업데이트되어 있는지 확인에 필요한 분야의 번호가을 (OPT1 - 4), 그러나 mainFlag = true는 또한 다른 두 필드를 확인해야합니다.

처음 네 개의 opt # 필드에 대해 동일한 검사를 두 번 수행하면 문제가됩니다. 이 IF 문을 작성하는 좀 더 우아하고 /하지 않은 코드 방법은 무엇입니까? 이것은 충분히 내 생각을 단순화한다

답변

2

는하자 : A는, B, C 부울 변수

A = mainFlag 
B = form.opt1 == store.opt1 and form.opt2 == store.opt2 and 
    form.opt3 == store.opt3 and form.opt4 == store.opt4 
C = form.opt5 == store.opt5 and form.opt6 == store.opt6 

. 이 표현은 우리를 리드 !A*B + A*B*C

일단 단순화 : 다음, 당신의 IF 문은 명령문에 다음 부울 식에 있습니다

!A*B + A*B*C = B*(!A+A*C) = B*((!A+A)*(!A+C)) = B*(!A+C) 

(!, *, +는 부울 연산자는 각각 NOT, ANDOR에 대한)

IF 문으로 다시 번역 :

if (
    (form.opt1 == store.opt1 and form.opt2 == store.opt2 and /*  */ 
     form.opt3 == store.opt3 and form.opt4 == store.opt4  /* B */ 
    ) 
    and 
    ( /* !A */ 
     !mainFlag or (
        form.opt5 == store.opt5 and form.opt6 == store.opt6 /* C */ 
        ) 
    ) 
    ) 
     dataHasBeenUpdated = False; 
    else 
     dataHasBeenUpdated = True; 
+0

당신이 그것을 넣으면 간단 해 보입니다. :) Thanks –

0

...

dataHasBeenUpdated = ! (form.opt1 == store.opt1 
        and form.opt2 == store.opt2 
        and form.opt3 == store.opt3 
        and form.opt4 == store.opt4 
        and (!mainFlag 
         or ( mainFlag 
          and form.opt3 == store.opt3 
          and form.opt4 == store.opt4))); 
관련 문제