因此,我有一个非常难以理解的if陈述,有人建议我研究De Morgans法并对其进行重构,以使其更加清晰易读。我知道如何用简短的语句来实现它,但是我真的不知道如何重构我的代码。请注意,前两个是对象!谢谢你的帮助!
if (!userTemplate.getFromAccount().equals(document.getDetails())
&& !userTemplate.getBenAccount().equals(document.getFromAccount())
&& !userTemplate.getDetails().equals(document.getBenAccount())
&& !userTemplate.getBenType().equals(document.getBenType())
&& !userTemplate.getAmount().equals(document.getCreditAmount()))
答案 0 :(得分:4)
在Wikipedia中,可以将De Morgans法简单地解释为
不是(A或B)=不是A也不是B;
不是(A和B)=不是A还是不是B
所以您当前的if
语句
if (!userTemplate.getFromAccount().equals(document.getDetails())
&& !userTemplate.getBenAccount().equals(document.getFromAccount())
&& !userTemplate.getDetails().equals(document.getBenAccount())
&& !userTemplate.getBenType().equals(document.getBenType())
&& !userTemplate.getAmount().equals(document.getCreditAmount()))
可以重构为
if (!(userTemplate.getFromAccount().equals(document.getDetails())
|| userTemplate.getBenAccount().equals(document.getFromAccount())
|| userTemplate.getDetails().equals(document.getBenAccount())
|| userTemplate.getBenType().equals(document.getBenType())
|| userTemplate.getAmount().equals(document.getCreditAmount())))
答案 1 :(得分:1)
将所有这些条件提取为布尔值也是一个好主意,这也会使if
更具可读性。
boolean fromAccountCondition = userTemplate.getFromAccount().equals(document.getDetails());
boolean benAccountcondition = userTemplate.getBenAccount().equals(document.getFromAccount());
boolean detailsCondition = userTemplate.getDetails().equals(document.getBenAccount());
boolean benTypeCondition = userTemplate.getBenType().equals(document.getBenType());
boolean amountCondition = userTemplate.getAmount().equals(document.getCreditAmount()))
然后
if (!(fromAccountCondition || benAccountcondition
|| detailsCondition || benTypeCondition || amountCondition)) {
...
}
注意:实际上,我实际上更喜欢将取反值放在布尔值本身中,即:
boolean fromAccountCondition = !userTemplate.getFromAccount().equals(document.getDetails());
boolean benAccountcondition = !userTemplate.getBenAccount().equals(document.getFromAccount());
boolean detailsCondition = !userTemplate.getDetails().equals(document.getBenAccount());
boolean benTypeCondition = !userTemplate.getBenType().equals(document.getBenType());
boolean amountCondition = !userTemplate.getAmount().equals(document.getCreditAmount()))
然后
if (fromAccountCondition && benAccountcondition
&& detailsCondition && benTypeCondition && amountCondition)) {
...
}
答案 2 :(得分:0)
也许我遗漏了一些东西,但是您的if语句中的!A*!B*!C*!D
等于!(A+B+C+D)
。
答案 3 :(得分:0)
德摩根定律说(用Java语言编写):
(!A && !B && !C && ...) == !(A || B || C || ...)
因此,您可以重写代码(为清晰起见,我缩短了冗长的表达式):
if (!A && !B && !C && !D && !E)
到
if (!(A || B || C || D || E))