Уменьшить проблему цикломатической сложности - PullRequest
0 голосов
/ 21 сентября 2018

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

Код состоит из большого количества операторов «если», которые проверяют параметрыкоторый пришел в метод и решает, какое значение перечисления создать

Вот фрагмент кода, например:

      public ProductType createProductType(String val1, String val2, String val3) {
        if (PRODUCT_MODEL.equals(val1) && PRODUCT_TYPE.equals(val2) {
            return ProductType.SOAP;
        }
        if (PRODUCT_MODEL.equals(val1) || val3.equals(SWAP)) {
            return ProductType.STRING;
        }
}

И так далее. Как вы можете видеть, я не могу написать этоиспользование регистра переключателя, поскольку проверяется более 1 переменной.Также я не могу создать статическую карту с ключами типа Предикат, потому что сравнение критериев пришло к методу динамически.Поэтому я не могу понять, как исключить эти операторы «если».

Есть предложения?

РЕДАКТИРОВАТЬ

, если разделить его на методы для каждоготип продукта, как тогда я буду проверять, когда создается тип продукта?Я имею в виду, что у меня есть

ProductType productType = null;
productType = tryParseSoap;
if (Objects.nonNull(productType)) {
    return productType;
}
productType = tryParseString;
if (Objects.nonNull(productType)) {
    return productType
}

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

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете определить интерфейс, скажем ProductTypeCreator

public interface ProductTypeCreator {

    boolean isApplicable(String val1, String val2, String val3);

    ProductType create(String val1, String val2, String val3);

}

Затем создайте реализацию для каждого конкретного случая if.После этого вы можете создать список создателей и изменить свой метод на что-то вроде.

public ProductType createProductType(String val1, String val2, String val3) {
    // this should already be instantiated
    List<ProductTypeCreator> creators;
    return creators
       .stream()
       .filter(creator -> creator.isApplicable(val1, val2, val3))
       .map(creator -> creator.create(val1, val2, val3))
       .findFirst()
       .get();
}

Таким образом, вы можете избежать ifs.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...