我需要帮助缩小这个IF声明

时间:2013-12-12 19:03:41

标签: if-statement code-formatting boolean-logic

我想提出更优雅的代码。我有这个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 个答案:

答案 0 :(得分:2)

让我们:

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

ABC是布尔变量。然后,您的IF语句具有以下布尔表达式:!A*B + A*B*C

一旦简化,这个表达式就会引导我们:

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

!*+分别是NOTANDOR的布尔运算符。

将其翻译回您的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;

答案 1 :(得分: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 ) ));