如何使用De Morgans Law Java重构if语句

时间:2019-03-28 14:00:08

标签: java if-statement demorgans-law

因此,我有一个非常难以理解的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 个答案:

答案 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))