Если условие упрощение - PullRequest
2 голосов
/ 27 февраля 2020

Я рефакторинг фрагмента кода, в котором я вижу следующее условие, которое мне интересно, если это упрощено.

data.RecordId != 0 || (data.RecordId == 0 && data.SerialNum == "0000")

Разве data.RecordId == 0 || data.SerialNum == "0000" это не то же самое?

Если возможно, как получилось? Не могли бы вы подробно?

Ответы [ 7 ]

5 голосов
/ 27 февраля 2020

да, возможно, если у вас была опечатка (! = Не ==) ...

пусть Вольфрам Альфа объяснит:

https://www.wolframalpha.com/input/?i=simplify%3A+R+%21%3D+0+%7C%7C+%28R+%3D%3D+0+%26%26+S%3D%3D+0000%29

R! = 0 ∨ (R = 0 ∧ S = 0)

просто обозначается как:

R! = 0 ∨ S = 0

Объяснение шаг за шагом:

https://en.wikipedia.org/wiki/Boolean_algebra#Laws Распределение ∨ над ∧ говорит:

x v (y ∧ z) = (x ∨ y) ∧ (x ∨ z)

в вашем случае:

R! ∨ (R ∧ S) = (R! ∨ R) ∧ (R! ∨ S)

где (R! ∨ R) всегда верно, и вы можете опустить его в качестве 1-го операнда в логах и c:

R! ∨ (R ∧ S) = true ∧ (R! ∨ S)

R! ∨ (R ∧ S) =  (R! ∨ S)

voilá

Но я вижу другой вид различий во время выполнения, который имеет дело с ярлык для оценки &&:

, если data.RecordId == 0 имеет значение false в более длинном выражении, он не будет оценивать правильную часть с data.SerialNum, что может избежать получения нулевого ref.

3 голосов
/ 27 февраля 2020

Вы могли бы просто сказать:

data.RecordId != 0 || data.SerialNum == "0000"

Проверка data.RecordId == 0 не нужна, мы уже определили, что data.RecordId != 0 не выполняется, поэтому из этого следует, что data.RecordId == 0 верно. Помните, что булевы условия оцениваются слева направо, и они закорачиваются: в случае || оценка останавливается, если первое условие истинно.

Другой способ посмотреть на это - использовать логические логики c, символически ваше выражение может быть представлено и упрощено следующим образом:

1. ¬p ∨ (p ∧ q)
2. (¬p ∨ p) ∧ (¬p ∨ q)
3. true ∧ (¬p ∨ q)
4. ¬p ∨ q
  • p представляет условие data.RecordId == 0
  • q представляет условие data.SerialNum == "0000"
  • В строке 1 мы применяем свойство распределения
  • В строке 2 мы применяем тождество, которое гласит, что ¬p ∨ p всегда true
  • В строке 3 мы применяем тождество, которое говорит, что true ∧ p есть p
  • И вот как мы приходим к упрощению строки 4
0 голосов
/ 27 февраля 2020

Нет, это не обязательно будет так же, как == 0 проверяет значение int, а "0000" проверяет значение строки

0 голосов
/ 27 февраля 2020

Ну, простое объяснение выглядит так:

Когда мы получили data.RecordId! = 0 || (data.RecordId == 0 ...) первая часть ( data.RecordId! = 0 ) говорит, что все, кроме 0, означает true . если это не так, тогда мы будем go для второй части ( data.RecordId == 0 ) и определенно, когда мы здесь, значение data.RecordId будет равно 0 и означает всегда верно . (потому что мы проверяем все, кроме 0 в первой части условия).
Итак, единственной ценной частью второго условия является data.SerialNum == "0000 , и мы получим

data.RecordId != 0 || data.SerialNum == "0000"
0 голосов
/ 27 февраля 2020

Да, это может быть

data.RecordId != 0 || data.SerialNum == "0000"

Но, исходя из вашего условия 1, data.SerialNum == "0000" следует проверять только тогда, когда data.RecordId == 0 имеет значение true. Что делать, если data.RecordId отличается от 0.

Итак, это верно для приведенного выше случая

data.RecordId != 0 || (data.RecordId == 0 && data.SerialNum == "0000")
0 голосов
/ 27 февраля 2020

Ну, для

data.RecordId != 0 || (data.RecordId == 0 && data.SerialNum == "0000")
  • Если data.RecordId != 0, мы возвращаем true.
  • В случае сбоя data.RecordId != 0 параметр only равен data.RecordId == 0 и, таким образом, проверить, является ли он избыточным

Таким образом, мы можем падение data.RecordId == 0:

data.RecordId != 0 || (data.SerialNum == "0000")

или

data.RecordId != 0 || data.SerialNum == "0000"
0 голосов
/ 27 февраля 2020
if(data.RecordId != 0)

тогда

(data.RecordId == 0)

будет истинным. поэтому не нужно упоминать, что достаточно

data.RecordId != 0 || data.SerialNum == "0000"

.

...