McCabe Cyclomatic Complexity для переключения в Java - PullRequest
9 голосов
/ 28 ноября 2011

Я использую оператор switch с 13 случаями, каждый случай имеет возвращаемое значение только в одной строке.

МакКейб рисует это красным. Есть ли более простой способ написать большое заявление о переключении? Это не кажется сложным для чтения, но мне не нравится, когда настройка по умолчанию становится красной. Если другие люди используют тот же инструмент в моем коде и видят красное, они могут подумать, что я глупый :-)

Редактировать: я сопоставляю различные типы SQL с моими более абстрактными типами, поэтому сокращаю общее количество типов.

case Types.TIME:
    return AbstractDataType.TIME;
case Types.TIMESTAMP:
    return AbstractDataType.TIME;
case Types.DATE:
    return AbstractDataType.TIME;
case Types.BIGINT:
    return AbstractDataType.NUMERIC;
case Types.DECIMAL:
    return AbstractDataType.NUMERIC;

и так далее ...

Ответы [ 3 ]

7 голосов
/ 28 ноября 2011

Вы используете код для выражения того, что на самом деле является данными. Просто используйте карту enum или определите один раз постоянный словарь. Таким образом, вы просто параметризуете простой и общий алгоритм соответствия, а не пишете длинный регистр переключения.

6 голосов
/ 28 ноября 2011

Я не так много знаю об инструментах McCabe.Одна из вещей, которую учитывает сложность Cyclomatic, это множественные точки выхода.

Мне нравится идея EnumMap.

Если будет использоваться переключатель, вы можете иметь переменную результата и покончить со всемиобратные заявления.Вы также можете свернуть все исходные значения с одинаковым типом результата:

result = null;

case Types.TIME:
case Types.DATE:
case Types.TIMESTAMP: result = AbstractDataType.TIME

// etc.

return result;

Я думаю, что это уменьшает цикломатическую сложность, независимо от того, что кто-то думает о ней как о стиле.И это другой способ написать заявление, хотя о том, легче ли вам судить.

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

+ 1 для идеи карты ...

Примерно так:

Инициализировать карту

Map<Types, AbstractDataType> map = new HashMap<Types, AbstractDataType>();
map.put(Types.TIME, AbstractDataTypes.TIME);
// and so on

Затем в вашем коде просто выполните

return map.get(sqlTimeType);

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

AbstractDataTypes.fromSqlType(timeType);

и если вы сделаете:

sqlTimeType.getAbstractType();

Инкапсулировано и может использоваться повторно: -)

...