我想提出更优雅的代码。我有这个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语句的更优雅/最简单的代码方式是什么?
答案 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
A
,B
,C
是布尔变量。然后,您的IF
语句具有以下布尔表达式:!A*B + A*B*C
一旦简化,这个表达式就会引导我们:
!A*B + A*B*C = B*(!A+A*C) = B*((!A+A)*(!A+C)) = B*(!A+C)
(!
,*
,+
分别是NOT
,AND
和OR
的布尔运算符。
将其翻译回您的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 ) ));