Информация об изменениях

Сообщение Re: Уменьшить Cognitive Complexity метода. рефакторинг. от 14.09.2018 5:04

Изменено 14.09.2018 5:31 Artem Korneev

Re: Уменьшить Cognitive Complexity метода. рефакторинг.
Здравствуйте, HAXT, Вы писали:

HAX>Хотелось бы какое то элегантное решение, может быть предикатами или лямбдами переделать. Есть какие идеи ?


Ну сходу пока вот что-то такое получилось.
zoneId и dataFormat воткнул как есть — я не знаю, откуда оно приходит, но их нужно будет отправить туда, где определяются правила распаковки данных — в инициализатор dataSources.
Я только с колонкой PRODUCT не очень понял. Там значение — строка или список строк? В остальных местах вроде явно строка идет, а тут коллектор возвращает список.

List<String> getProduct(IndexedDraftOrderDto o) {
    return Optional.ofNullable(o.getProducts()).orElse(Collections.emptyList()).stream()
        .map(IndexedProductDto::getProductName)
        .collect(Collectors.toList());
}

Map<String, Function<IndexedDraftOrderDto, String>> dataSources = new HashMap<> {{
    put(ExportColumnEnum.ORDER_CODE,   (o) -> o.getOrderCode());
    put(ExportColumnEnum.STATUS,       (o) -> isNull(o.getOrderState()) ? "" : ORDER_STATE_DESC.get(o.getOrderState()));
    put(ExportColumnEnum.CUSTOMER,     (o) -> nonNull(o.getCustomer()) ? o.getCustomer().getName() : "");
    put(ExportColumnEnum.ANIMAL_COUNT, (o) -> o.getNumberOfAnimals());
    put(ExportColumnEnum.SAVED,        (o) -> formatDate(o.getSavedDate(), zoneId, dateFormat));    
    put(ExportColumnEnum.PRODUCT,      (o) -> getProduct(o));
    put(ExportColumnEnum.MARKET,       (o) -> o.getMarket());
}}

private void fillCvsColumnsValues(ExportOrderRequestDto request, CsvBuilder csvBuilder, PageDto<IndexedDraftOrderDto> searchOrders) {
    var columns = request.getColumns();
    for (IndexedDraftOrderDto o: searchOrders.getContent()) {
        dataSources.forEach((column, extractor) -> {
            if (columns.contains(column)) {
                csvBuilder.addNextColumnValue(extractor.apply(o));
            }
        }
    }

    csvBuilder.endRow();
}
Re: Уменьшить Cognitive Complexity метода. рефакторинг.
Здравствуйте, HAXT, Вы писали:

HAX>Хотелось бы какое то элегантное решение, может быть предикатами или лямбдами переделать. Есть какие идеи ?


Ну сходу пока вот что-то такое получилось.
zoneId и dataFormat воткнул как есть — я не знаю, откуда оно приходит, но их нужно будет отправить туда, где определяются правила распаковки данных — в инициализатор dataSources.
Я только с колонкой PRODUCT не очень понял. Там значение — строка или список строк? В остальных местах вроде явно строка идет, а тут коллектор возвращает список.

List<String> getProduct(IndexedDraftOrderDto o) {
    return Optional.ofNullable(o.getProducts()).orElse(Collections.emptyList()).stream()
        .map(IndexedProductDto::getProductName)
        .collect(Collectors.toList());
}

Map<String, Function<IndexedDraftOrderDto, String>> dataSources = new HashMap<> {{
    put(ExportColumnEnum.ORDER_CODE,   (o) -> o.getOrderCode());
    put(ExportColumnEnum.STATUS,       (o) -> isNull(o.getOrderState()) ? "" : ORDER_STATE_DESC.get(o.getOrderState()));
    put(ExportColumnEnum.CUSTOMER,     (o) -> nonNull(o.getCustomer()) ? o.getCustomer().getName() : "");
    put(ExportColumnEnum.ANIMAL_COUNT, (o) -> o.getNumberOfAnimals());
    put(ExportColumnEnum.SAVED,        (o) -> formatDate(o.getSavedDate(), zoneId, dateFormat));    
    put(ExportColumnEnum.PRODUCT,      (o) -> getProduct(o));
    put(ExportColumnEnum.MARKET,       (o) -> o.getMarket());
}}

private void fillCvsColumnsValues(ExportOrderRequestDto request, CsvBuilder csvBuilder, PageDto<IndexedDraftOrderDto> searchOrders) {
    Collection<String> columns = request.getColumns();
    for (IndexedDraftOrderDto o: searchOrders.getContent()) {
        dataSources.forEach((column, extractor) -> {
            if (columns.contains(column)) {
                csvBuilder.addNextColumnValue(extractor.apply(o));
            }
        }
    }

    csvBuilder.endRow();
}