SonarQube сообщает Удалить это выражение, которое всегда оценивается как «true» - PullRequest
2 голосов
/ 23 января 2020

У меня есть следующий код:

final Set<String> desktopMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.DESKTOP);
final Set<String> mobileMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.MOBILE);
final Set<String> tabletMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.TABLET);

//In case they are the same, only default.
if (desktopMediaCodes.equals(mobileMediaCodes) && mobileMediaCodes.equals(tabletMediaCodes)) {
    asset.setDefaults(desktopMediaCodes);
    return;
}

//In case three are different, we will send mobile, desktop and tablet.
if(!desktopMediaCodes.equals(mobileMediaCodes) && !desktopMediaCodes.equals(tabletMediaCodes) && !mobileMediaCodes.equals(tabletMediaCodes)){
    asset.setDesktop(desktopMediaCodes);
    asset.setMobile(mobileMediaCodes);
    asset.setTablet(tabletMediaCodes);
    return;
}

//In case only tablet is different, we will send default and tablet.
if(desktopMediaCodes.equals(mobileMediaCodes) && !mobileMediaCodes.equals(tabletMediaCodes)){
    asset.setDefaults(desktopMediaCodes);
    asset.setTablet(tabletMediaCodes);
    return;
}

//In case only desktop is different, we will send default and tablet.
if(mobileMediaCodes.equals(tabletMediaCodes) && !tabletMediaCodes.equals(desktopMediaCodes)){
    asset.setDefaults(mobileMediaCodes);
    asset.setDesktop(desktopMediaCodes);
    return;
}

//In case only mobile is different, we will send default and tablet.
if(tabletMediaCodes.equals(desktopMediaCodes) && !tabletMediaCodes.equals(mobileMediaCodes)){
    asset.setDefaults(tabletMediaCodes);
    asset.setMobile(mobileMediaCodes);
    return;
}

И SonarQube сообщает мне, что

screen with issues

(желтые поля)

И это не правда, это ошибка или я что-то упустил? SonarQube сбивает меня с толку.

1 Ответ

3 голосов
/ 25 января 2020

Вам необходимо прочитать весь контекст. У вас есть 5 операторов if в вашем коде. Я немного упросту это:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M && M != T

4) M == T && D != T

5) D == T && D != M

Давайте проанализируем код.

Первый выпуск

Он сообщает, что M != T всегда оценивается в true в 3-й строке:

3) D == M && M != T

Почему? Потому что ваша 1-я строка:

1) D == M && M == T

Она гарантирует, что в 3-й строке возможны только следующие значения:

D == M && M != T
D != M && M != T
D != M && M == T

Вы можете понимать это как:

  • если D == M, то M должно быть! = T (нет смысла проверять M != T)
  • , если D != M, тогда M может быть = или! = T ( мы должны проверить, если M = или! = T)

Новый код:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M

4) M == T && D != T

5) D == T && D != M

Второй выпуск

Та же ситуация как в первом выпуске. D != T всегда оценивается как true в 4-й строке:

4) M == T && D != T

, потому что 3-я строка:

3) D == M

гарантирует, что D != M. 2-я строка:

2) D != M && D != T && M != T

гарантирует, что:

D == T && M != T
D != T && M == T
D == T && M == T

Мы удалим 3-й вариант, потому что 1-я строка его перехватывает:

1) D == M && M == T

Теперь у нас есть :

D == T && M != T
D != T && M == T

Вы можете понимать это как:

  • если D == M, то M должно быть! = T (проверять M != T) * не имеет смысла
  • если D != M, то M должно быть = T (проверять нет смысла M == T)

Новый код:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M

4) M == T

5) D == T && D != M

Третий и четвертый выпуски

Целое условие if всегда оценивается в true. Давайте прочитаем 5-ю строку:

5) D == T && D != M

M != D всегда верно, потому что 3-я строка гарантирует это:

3) D == M

Новый код:

1) D == M && M == T

2) D != M && D != T && M != T

3) D == M

4) M == T

5) D == T

Мы также можем удалить D == T, потому что:

3) D == M
4) M == T

На 5-й строке возможна только следующая опция: D != M && M != T. 2-я строка:

2) D != M && D != T && M != T

Если D != T, то 2-я строка ловит его. Это означает, что единственная возможность - D == T, поэтому нет смысла проверять ее.

Окончательный код

final Set<String> desktopMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.DESKTOP);
final Set<String> mobileMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.MOBILE);
final Set<String> tabletMediaCodes = getCodesByMediaDeviceType(mediaModels, MediaDeviceType.TABLET);

// In case they are the same, only default.
if (desktopMediaCodes.equals(mobileMediaCodes) && mobileMediaCodes.equals(tabletMediaCodes)) {
    asset.setDefaults(desktopMediaCodes);
    return;
}

// In case three are different, we will send mobile, desktop and tablet.
if (!desktopMediaCodes.equals(mobileMediaCodes) && !desktopMediaCodes.equals(tabletMediaCodes) && !mobileMediaCodes.equals(tabletMediaCodes)) {
    asset.setDesktop(desktopMediaCodes);
    asset.setMobile(mobileMediaCodes);
    asset.setTablet(tabletMediaCodes);
    return;
}

// In case only tablet is different, we will send default and tablet.
if (desktopMediaCodes.equals(mobileMediaCodes)) {
    asset.setDefaults(desktopMediaCodes);
    asset.setTablet(tabletMediaCodes);
    return;
}

// In case only desktop is different, we will send default and tablet.
if (mobileMediaCodes.equals(tabletMediaCodes)) {
    asset.setDefaults(mobileMediaCodes);
    asset.setDesktop(desktopMediaCodes);
    return;
}

// In case only mobile is different, we will send default and tablet.
asset.setDefaults(tabletMediaCodes);
asset.setMobile(mobileMediaCodes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...