워밍업 클럽 2기(클린코드 & 테스트) 2번째 미션(DAY 4)

SOLD

  • S - Single Responsibility Principle (SRP): 클래스는 하나의 책임만 가져야 하며, 변경이 필요할 때 그 책임 하나만 변경되어야 한다는 원칙이며, 해당 원칙을 고수 했을 때 클래스가 더 간단하고 유지보수가 용이해진다.

  • O - Open/Closed Principle (OCP): 확장에 대해서는 열려 있어야 하지만, 수정에 대해서는 닫혀 있어야 한다는 원칙으로 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있어야 한다.

  • L - Liskov Substitution Principle (LSP): 자식 클래스는 부모 클래스의 기능을 대체할 수 있어야 한다는 원칙으로 자식 클래스가 부모 클래스를 대체해도 프로그램의 동작에는 문제가 없어야 한다.

  • I - Interface Segregation Principle (ISP): 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다는 원칙으로 하나의 인터페이스 보단 여러개의 구체적인 인터페이스로 나눠 사용하는게 더 바람직 하다.

  • D - Dependency Inversion Principle (DIP): 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다는 원칙으로 추상은 구현체에 의존해서는 안 되고, 구현체가 추상에 의존해야 한다.

    리펙터링

    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;
    }
    • 해당 코드를 리펙터링 해보자.

public class OrderValidator {
    private static final Logger log = LoggerFactory.getLogger(OrderValidator.class);

    public boolean validate(Order order) {
        return hasItems(order) && hasValidTotalPrice(order) && hasCustomerInfo(order);
    }

    private boolean hasItems(Order order) {
        if (order.getItems().isEmpty()) {
            log.info("주문 항목이 없습니다.");
            return false;
        }
        return true;
    }

    private boolean hasValidTotalPrice(Order order) {
        if (order.getTotalPrice() <= 0) {
            log.info("올바르지 않은 총 가격입니다.");
            return false;
        }
        return true;
    }

    private boolean hasCustomerInfo(Order order) {
        if (!order.hasCustomerInfo()) {
            log.info("사용자 정보가 없습니다.");
            return false;
        }
        return true;
    }
}

댓글을 작성해보세요.

채널톡 아이콘