Цикломатическая Сложность этого метода "setHeader" составляет 139, что больше 10 разрешенных - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть 139 переключателей в setHeader

private static void setHeader(String headertableField, String headerValue) {
    switch (headertableField) {
        case AUS:
            headerDTO.setAudval(StringUtils.getTrimValueAfterNullCheck(headerValue));
            break;

        case AXL:
            headerDTO.setAxlfieldl(StringUtils.getTrimValueAfterNullCheck(headerValue));
            break;

        ................
        ..................
        default:
            break;

    }
}

Показывает проблемы с сонаром. Можете ли вы предложить любое решение, чтобы уменьшить сложность.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Ответ Юджина довольно хорош, но вы можете пойти дальше и использовать ту же логику в enum

enum HeaderField {
    AUS(HeaderDTO::setAudval),
    AXL(HeaderDTO::setAxlfieldl);

    private BiConsumer<HeaderDTO, String> fieldSetter;

    HeaderField(BiConsumer<HeaderDTO, String> setter) {
        fieldSetter= setter;
    }

    public void setField(HeaderDTO headerDTO, String value) {
        fieldSetter.accept(headerDTO, value);
    }
}

Тогда вы можете использовать его:

HeaderField.AUS.setField(headerDTO, "value");
HeaderField.AXL.setField(headerDTO, "axl");
0 голосов
/ 27 апреля 2018

Сначала немного фона:

Когда вы используете case/switch с String, это не простая проверка, если / else / равно. Внутри (в отличие от int типов, например) сначала hashCode вычисляется для строки, которую вы включаете, и lookupswitch вызывается для этого.

Если это значение hashCode равно одному из значений, присутствующих в операторах case (это означает, что потенциально эта строка равна той, которую вы ищете), сделайте еще один lookupswitch для предварительно определенного значения, которое зависит от откуда вы «исходите» (предыдущий поисковый переключатель говорит вам, куда прыгать).

В любом случае, переключение String на самом деле является переключателем поиска, который O(1) (даже если делать два из них).

Что вы можете сделать, это скрыть эту сложность по той же цене O(1) через Map.

Map<String, BiConsumer<HeaderDTO, String>> MAP = Map.of(
      "AUS", (x, y) -> x.setAudval(StringUtils.getTrimValueAfterNullCheck(y))
      // all other cases
)

и затем просто имея эту карту, сделайте:

private static void setHeader(String headertableField, String headerValue){
    MAP.get(headertableField).accept(headerDTO, headerValue);
}
...