Как рефакторинг, если заявление с использованием закона Де Моргана Java - PullRequest
0 голосов
/ 28 марта 2019

Итак, у меня есть очень нечитаемое утверждение 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()))

Ответы [ 4 ]

4 голосов
/ 28 марта 2019

Из Википедии закон Де Моргана можно объяснить простыми словами:

not (A или B) = не A и не B;

not (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 голос
/ 28 марта 2019

Было бы также неплохо извлечь все эти условия в логические значения, что сделало бы 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)) {
  ...
} 
0 голосов
/ 28 марта 2019

Закон де Моргана гласит (написано на языке Java):

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

Поэтому вы можете переписать свой код (я сокращаю длинные выражения для ясности):

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

до

if (!(A || B || C || D || E))
0 голосов
/ 28 марта 2019

Может быть, я что-то упускаю, но ваше выражение if говорит !A*!B*!C*!D, что равно !(A+B+C+D).

...