Уменьшите когнитивную сложность при картографировании
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);
});