0

所以我有一个非常不可读的 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()))
4

4 回答 4

4

从维基百科,德摩根定律可以用简单的术语解释为

非(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())))
于 2019-03-28T14:06:07.320 回答
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)) {
  ...
} 
于 2019-03-28T14:16:51.253 回答
0

也许我错过了一些东西,但你的 if 语句说!A*!B*!C*!Dwhich equals !(A+B+C+D)

于 2019-03-28T14:06:23.687 回答
0

德摩根定律说(用 Java 语言编写):

(!A && !B && !C && ...)  ==  !(A || B || C || ...)

因此,您可以重写您的代码(为了清楚起见,我缩短了冗长的表达式):

if (!A && !B && !C && !D && !E)

if (!(A || B || C || D || E))
于 2019-03-28T14:19:06.770 回答