Java разборные операторы if - PullRequest
       13

Java разборные операторы if

2 голосов
/ 28 сентября 2011

Я использую PMD , чтобы проверить мой код. Это дает мне очень полезные советы в большинстве случаев, но я не могу понять, что можно улучшить в следующем сценарии.

Исходный код выглядит примерно так:

if ((getSomething() != null && getSomethingElse() != null)
     || (getSomething() == null && getSomethingElse() == null))
{
   ...
}

PMD говорит мне:

Иногда два оператора «если» можно объединить, разделив их условия с логическим оператором короткого замыкания.

Для простоты, давайте просто используем a и b в качестве логических переменных. Тогда этот фрагмент кода выглядит так:

if ((!a && !b) || (a && b))

Это может быть преобразовано в одно из следующих:

if ((!a || b) && (a || !b))
if (!(a^b))

и, наконец,

if (a==b)

Итак, я упростил свой код до

if ((getSomething() == null) == (getSomethingElse() == null))

Однако PMD продолжает жаловаться (фактически, на все три версии). Это ложное срабатывание или есть лучший способ написать условие if?

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Проблема была в другом. Оператор if был единственным кодом внутри другого if (код происходит из метода проверки):

if (...)
{
   ...
}
else if (...)
{
   ...
}
else if (...)
{
   if ((getSomething() == null) == (getSomethingElse() == null))
   {
      ...
   }
}

Что означает сообщение PMD, так это то, что я мог бы объединить условия последнего условия if-if и внутреннего предложения if:

if (...)
{
   ...
}
else if (...)
{
   ...
}
else if (... && ((getSomething() == null) == (getSomethingElse() == null)))
{
      ...
}

Однако я не уверен, если я сделаю это, потому что оригинальная версия кажется намного понятнее.

2 голосов
/ 28 сентября 2011
if ((a != null) && (b != null) && (a==b))

.. хотя лично я бы сделал проверку нуля до этого оператора if, чтобы я мог обрабатывать случаи a == null и b == null индивидуально

1 голос
/ 28 сентября 2011

Проблема в том, что о больших блоках условностей трудно рассуждать.

OTOH, не каждое предупреждение, которое выдает PMD, должно быть уделено внимание - учитывайте ROI. Стоит ли рефакторинг или реструктуризация, чтобы сделать его чище? Можно ли обрабатывать одну и ту же функциональность по-другому?

Если оно того не стоит, не беспокойтесь.

...