Анализатор обнаружил ситуацию, когда в операторе 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. |