Анализатор обнаружил ситуацию, когда в операторе switch разные метки case содержат одинаковые фрагменты кода. Часто это свидетельствует об избыточном коде, который можно улучшить объединением меток. Но нередко одинаковые фрагменты кода могут быть причиной copy-paste программирования и являться настоящими ошибками.
Рассмотрим пример с избыточным кодом:
public static String getSymmetricCipherName(SymmetricKeyAlgorithmTags tag)
{
switch (tag)
{
case DES:
return "DES";
case AES_128:
return "AES";
case AES_192:
return "AES";
case AES_256:
return "AES";
case CAMELLIA_128:
return "Camellia";
case CAMELLIA_192:
return "Camellia";
case CAMELLIA_256:
return "Camellia";
case TWOFISH:
return "Twofish";
default:
throw new IllegalArgumentException("....");
}
}
В реальных проектах для различных case'ов возможны случаи, когда необходимо выполнить одинаковые действия. И для того, чтобы выглядело читабельнее, код можно написать более компактно:
public static String getSymmetricCipherName(SymmetricKeyAlgorithmTags tag)
{
switch (tag)
{
case DES:
return "DES";
case AES_128:
case AES_192:
case AES_256:
return "AES";
case CAMELLIA_128:
case CAMELLIA_192:
case CAMELLIA_256:
return "Camellia";
case TWOFISH:
return "Twofish";
default:
throw new IllegalArgumentException("....");
}
}
Рассмотрим пример из реального приложения, где разработчик допустил ошибку из-за опечатки:
protected boolean condition(Actor actor) throws ....
{
....
if (fieldValue instanceof Number)
{
....
switch (tokens[2])
{
case "=":
case "==":
passing = (Double) fieldValue
==
Double.parseDouble(secondValue);
break;
case "!":
case "!=":
passing = (Double) fieldValue
==
Double.parseDouble(secondValue);
break;
case "<=":
passing = ((Number) fieldValue).doubleValue()
<=
Double.parseDouble(secondValue);
break;
....
}
....
}
....
}
В коде меток '!' и '!=' допущена опечатка, которая возникла по всей видимости из-за copy-paste. Просмотрев остальные ветви case, можно прийти к выводу, что следовало использовать оператор сравнения '!=' вместо '=='.
Исправленный код:
protected boolean condition(Actor actor) throws ....
{
....
if (fieldValue instanceof Number)
{
....
switch (tokens[2])
{
case "=":
case "==":
passing = (Double) fieldValue
==
Double.parseDouble(secondValue);
break;
case "!":
case "!=":
passing = (Double) fieldValue
!=
Double.parseDouble(secondValue);
break;
case "<=":
passing = ((Number) fieldValue).doubleValue()
<=
Double.parseDouble(secondValue);
break;
....
}
....
}
....
}
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6067. |