inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

인프런 워밍업 클럽 2기 발자국 1주차

leebs0521
0

Keep (유지할 점)

Problem (문제점)

Try (시도해볼 점)

미션 2. 코드 리팩토링

기존 코드

기존의 validateOrder 메서드는 여러 조건을 중첩된 if 문으로 처리하여 가독성이 떨어지고, 확장성이 낮았습니다.

public boolean validateOrder(Order order) {
    if (order.getItems().size() == 0) {
        log.info("주문 항목이 없습니다.");
        return false;
    } else {
        if (order.getTotalPrice() > 0) {
            if (!order.hasCustomerInfo()) {
                log.info("사용자 정보가 없습니다.");
                return false;
            } else {
                return true;
            }
        } else if (!(order.getTotalPrice() > 0)) {
            log.info("올바르지 않은 총 가격입니다.");
            return false;
        }
    }
    return true;
}

리팩토링한 코드

리팩토링 후, 각 검증 로직을 별도의 클래스로 분리하여 Single Responsibility Principle을 적용했습니다. 이를 통해 가독성과 유지 보수성을 향상시켰습니다.

public class Order {
    public boolean hasItems() {
        return this.getItems().size() != 0;
    }
}
public interface OrderValidator {
    boolean validate(Order order);
}
public class ItemValidator implements OrderValidator {
    @Override
    public boolean validate(Order order) {
        if (order.hasItems()) {
            return true;
        }
        log.info("주문 항목이 없습니다.");
        return false;
    }
}
public class PriceValidator implements OrderValidator {
    @Override
    public boolean validate(Order order) {
        if (order.getTotalPrice() > 0) {
            return true;
        }
        log.info("올바르지 않은 총 가격입니다.");
        return false;
    }
}
public class CustomerInfoValidator implements OrderValidator {
    @Override
    public boolean validate(Order order) {
        if (order.hasCustomerInfo()) {
            return true;
        }
        log.info("사용자 정보가 없습니다.");
        return false;
    }
}
public class OrderValidation {
    private final List<OrderValidator> validators;

    public OrderValidation(List<OrderValidator> validators) {
        this.validators = validators;
    }

    public boolean validateOrder(Order order) {
        for (OrderValidator validator : validators) {
            if (!validator.validate(order)) {
                return false;
            }
        }
        return true;
    }
}

이 리팩토링을 통해 각 검증 로직이 명확하게 분리되어, 새로운 검증 규칙을 추가하기 쉽고, 코드의 가독성을 높일 수 있었습니다. 각 클래스가 단일 책임을 가지므로 유지 보수성도 향상되었습니다.

답변 0