#java #if-statement #demorgans-law
#java #if-statement #закон деморгана
Вопрос:
Итак, у меня очень нечитаемый оператор if, и кто-то предложил мне взглянуть на закон Де Моргана и реорганизовать его, чтобы он был более чистым и читаемым. У меня появилась идея, как это сделать с помощью простых и коротких инструкций, но я действительно не знаю, как реорганизовать свой код. Обратите внимание, что первые два являются объектами! Спасибо за вашу помощь!
if (!userTemplate.getFromAccount().equals(document.getDetails())
amp;amp; !userTemplate.getBenAccount().equals(document.getFromAccount())
amp;amp; !userTemplate.getDetails().equals(document.getBenAccount())
amp;amp; !userTemplate.getBenType().equals(document.getBenType())
amp;amp; !userTemplate.getAmount().equals(document.getCreditAmount()))
Комментарии:
1. Вы смотрели законы Де Моргана ?
2. Да, я прохожу теоретическую часть! Но не уверен, как это реализовать в данном случае!
3. Кто бы ни сказал вам, что это нечистое и нечитаемое, не так уж хорошо. Я нахожу это очень легким для чтения и понимания. Да, это долго
IF
, но закон Де Моргана этого не изменит
Ответ №1:
Из Википедии, закон Де Моргана можно объяснить простыми словами как
not (A или B) = не A и не B;
not (A и B) = не A или не B
Итак, ваше текущее if
утверждение
if (!userTemplate.getFromAccount().equals(document.getDetails())
amp;amp; !userTemplate.getBenAccount().equals(document.getFromAccount())
amp;amp; !userTemplate.getDetails().equals(document.getBenAccount())
amp;amp; !userTemplate.getBenType().equals(document.getBenType())
amp;amp; !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. Почему-то я нахожу переработанный код более сложным для понимания, чем сам код
2. @XtremeBaumer, закон Де Моргана не обязательно улучшает читаемость логического выражения. В правиле просто указано, как логическое выражение может быть выражено в другой форме.
3. Да, прокомментировал это в основном из-за «более чистой и читаемой» части в вопросе
4. @VHS Спасибо за вашу помощь! Я предложу оба примера! Я думал о создании отдельного метода для этого, а затем реализовать его! Может быть, таким образом, это будет более чистым!
5. Да, преобразования булевой алгебры не обязательно делают код более читаемым. Несмотря на это, количество отрицаний уменьшается. Первый пример должен гласить «если все пары различаются», а второй — «если даже ни одна пара не равна»
Ответ №2:
Также было бы неплохо извлечь все эти условия в логические значения, что также сделало бы 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 amp;amp; benAccountcondition
amp;amp; detailsCondition amp;amp; benTypeCondition amp;amp; amountCondition)) {
...
}
Комментарии:
1. Это был бы и мой подход. Иногда требуется написать больше кода, чтобы улучшить читаемость. И я уверен, что знание реальных бизнес-кейсов, стоящих за кодом, привело бы к гораздо более значимым именам логических переменных.
2. согласен, присвоение имен переменным очень важно
Ответ №3:
Возможно, я что-то упускаю, но в вашем if-заявлении указано, !A*!B*!C*!D
что равно !(A B C D)
.
Ответ №4:
Закон Де Моргана гласит (написан на языке Java):
(!A amp;amp; !B amp;amp; !C amp;amp; ...) == !(A || B || C || ...)
Поэтому вы можете переписать свой код (я сокращаю длинные выражения для наглядности):
if (!A amp;amp; !B amp;amp; !C amp;amp; !D amp;amp; !E)
Для
if (!(A || B || C || D || E))