﻿# V6067\. Two or more case\-branches perform the same actions\.

Анализатор обнаружил, что в операторе switch разные метки case содержат одинаковые фрагменты кода\. Часто это свидетельствует об избыточном коде, который можно улучшить объединением меток\. Но нередко одинаковые фрагменты кода могут быть причиной copy\-paste программирования и являться настоящими ошибками\.

Рассмотрим пример с избыточным кодом:

```cpp
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`'ов возможны случаи, когда необходимо выполнить одинаковые действия\. И для того, чтобы выглядело читабельнее, код можно написать более компактно:

```cpp
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("....");
    }
}
```

Рассмотрим пример из реального приложения, где разработчик допустил ошибку из\-за опечатки:

```cpp
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`, можно прийти к выводу, что следовало использовать оператор сравнения `!=` вместо `==`\. 

Исправленный код:

```cpp
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;
      ....
    }
   ....
  }
  ....
}
```