Уменьшите когнитивную сложность при картографировании

      if(obj.getAttribute() != null) {
    newobject.setAttribute(obj.getAttribute());
    }
if(obj.getAttribute() != null) {
        newobject.setAttribute(obj.getAttribute());
}
if(obj.getAttribute() != null) {
        newobject.setAttribute(obj.getAttribute());
}

Представьте себе этот код в масштабе — сопоставление объекта с более чем 15 атрибутами. Как уменьшить когнитивную сложность, не разделяя отображение на две/три части, что увеличивает общую когнитивную сложность.

2 ответа

Вы можете использоватьOptionalнравиться

      newobject.setAttribute(
    Optional.ofNullable(obj.getAttribute()).orElse("your_default_value")
);

Но это зависит от того, что должно произойти, когдаobj.getAttribute()пусто ?
Из того, что предусмотреноnewobject.attributeв любом случае будет пустым, присвоение свойства от родителя не требует проверки на ноль.

Вы можете использовать mapstruct, как говорится в комментарии. Если по какой-либо причине вы этого не хотите (например, из-за того, что mapstruct использует отражение, что может быть несколько неэффективно), вы можете использовать карту.

Предположим, у вас есть два таких класса:

      class A {
    Integer getAttribute1() { return null; }
    String getAttribute2() { return ""; }
}

class B {
    void setAttribute1(Integer x) {}
    void setAttribute2(String x) {}
}

Затем вы можете определить карту следующим образом:

      private static Map<Function<A, ?>, BiConsumer<B, Object>> mapOfAtoB = Map.of(
        A::getAttribute1, (b, x) -> b.setAttribute1((Integer) x),
        A::getAttribute2, (b, x) -> b.setAttribute2((String) x));

и используйте его так:

      void copyAtoB(A a, B b) {
    mapOfAtoB.forEach((fA, fB) -> {
        Object o = fA.apply(a);
        if (o != null)
            fB.accept(b, o);
    });
Другие вопросы по тегам