У меня есть состояние
if(exists && !isDirectory || !exists)
{}
как я могу изменить это, чтобы это было более понятно.
conditions
Spynet
источник
источник
exists
иisDirectory
оба правда?Ответы:
||
коммутативно такэквивалентно.
Теперь, поскольку существует всегда верно во второй части,
||
вы можете отбросить&&
:Или вы можете пойти дальше и сделать:
источник
&&
имеет более высокий приоритет (по крайней мере, в большинстве известных языков - могут быть исключения), чем||
. Таким образомa && b || c
, эквивалентно,(a && b) || c
но не кa && (b || c)
.!exists || !isDirectory
это более "понятно", потому чтоisDirectory
не может быть правдой, если!exists
. Итак, как человек, мы скажем: «если он не существует или он [существует, и он] не является каталогом».||
является коммутативным, только если используется со значениями без побочных эффектов - если, например, он используется с функциями, некоторые функции могут не вызываться (короткое замыкание) или возвращать другое значение в другом порядке.В качестве процесса я предлагаю создать таблицу истинности:
Это соответствует
NAND
операции , которая просто:Если вы не помните все свои логические элементы, в Википедии есть хорошая ссылка с таблицами истинности для загрузки .
@Christoffer Hammarström поднял важный вопрос о состоянии
isDirectory
привязанности к состояниюexists
. Предполагая, что они ссылаются на одну и ту же ссылку, и что невозможно иметь состояние, когда ссылка не существует и является каталогом, таблицу истинности можно записать следующим образом:n/a
Используется для обозначения состояния , которое не имеет значения. Приемлемые сокращения могут привести к тому1
или0
иному состоянию, что приведет кn/a
.Имея это в виду,
!(exists && isDirectory)
все еще действительное сокращение, в результате чего1
для!e && d
.Тем не менее,
!isDirectory
будет гораздо проще сократить, в результате чего0
для!e && d
.источник
isDirectory
зависит отexists
. Он не может быть как каталогом, так и не существовать.n/a
в тех местах, где невозможно достичь состояния, и уравнение должно быть соответственно уменьшено.Для лучшей читаемости я хотел бы извлечь логические условия для методов:
Или с лучшим именем метода. Если вы можете правильно назвать этот метод, читателю вашего кода не нужно выяснять, что означает логическое условие.
источник
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
Вы могли бы просто попытаться прибить случай без дела и выручить, если это обнаружится.
или даже
источник
Вы можете использовать таблицу истинности, как указано. Вторым шагом может быть KV-карта для минимизации количества терминов.
Использование законов булевой алгебры - это еще один подход:
A = существует
B =! IsDirectory
! A =! Существует
&& = *
|| = +
[Править]
Более простое преобразование, потому что операции И и ИЛИ являются взаимно-распределительными:
существует &&! isDirectory || ! Существует
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Edit]
существует &&! isDirectory || ! Существует
= A * B +! A
= A * B +! A * 1 // Идентичность
= A * B +! A * (B + 1) // Аннулятор
= A * B +! A * B +! A / / Распределение и идентификация
= B * (A +! A) +! A // Распределение
= B * 1 +! A // Дополнение 2
= B +! A // Идентичность
=! IsDirectory || !существует
Или с двойным дополнением (!! x = x):
A * B +! A
= !! (A * B +! A)
=! (! (A * B) * A)
=! ((! A +! B) * A)
=! (! A * A + ! B * A)
=! (0 +! B * A)
=! (! B * A)
= B +! A
=! IsDirectory || !существует
источник
Я не люблю использовать "!" когда в выражении более одного условия. Я добавлю строки кода, чтобы сделать его более читабельным.
источник
Как указывалось ранее, условие может быть уменьшено до:
Тем не менее, держу пари, что наличие каталога подразумевает существование. Если это так, мы можем уменьшить условие до:
источник