[인프런 워밍업 클럽 3기 BE 클린코드 & 테스트] Day 4 미션 제출

리팩토링

섹션3까지의 내용을 중심으로 리팩토링하였습니다. (처음에 섹션 4까지의 내용을 모두 적용하여 리팩토링 하는 것으로 파악하였는데, 아니어서 문구 수정하여 그대로 제출합니다. )

public class OrderValidator {

    private static final String NO_ITEMS_ERROR = "주문 항목이 없습니다."; // 에러 메시지를 상수로 정의해 가독성 향상
    private static final String INVALID_TOTAL_PRICE_ERROR = "올바르지 않은 총 가격입니다.";
    private static final String NO_CUSTOMER_INFO_ERROR = "사용자 정보가 없습니다.";

    public boolean validateOrder(Order order) {
        if (hasNoItems(order)) {
            log.info(NO_ITEMS_ERROR);
            return false; // early return 적용
        }

        if (isTotalPriceInvalid(order)) {
            log.info(INVALID_TOTAL_PRICE_ERROR);
            return false;
        }

        if (hasNoCustomerInfo(order)) {
            log.info(NO_CUSTOMER_INFO_ERROR);
            return false;
        }

        return true;
    }

    private boolean hasNoItems(Order order) { // 한 메서드가 하나의 기능만 수행하도록 함(단일책임원칙)
        return order.getItems().isEmpty();
    }

    private boolean isTotalPriceInvalid(Order order) {
        return order.getTotalPrice() <= 0; // 부정 연산자 제거
    }

    private boolean hasNoCustomerInfo(Order order) {
        return !order.hasCustomerInfo();
    }
}

SOLID 원칙을 자신의 언어로 정리하기

SOLID 원칙: 객체 지향 설계에서 코드의 유지보수성과 확장성을 높이기 위한 소프트웨어 개발 원칙

단일 책임 원칙 (SRP): 클래스 레벨에서 많이 이야기하며, 하나의 클래스가 하나의 책임만 가져야 함.

  • 그 책임이 변경될 이유도 하나여야 함. 변경 이유가 곧 책임

확장-폐쇄 원칙 (OCP): 확장에는 열려 있고, 수정에는 닫혀 있어야 함.

  • 기존 코드 변경 없이 기능 확장이 가능해야 함. 추상화와 다형성을 활용해 지킬 수 있음

리스코프 치환 원칙 (LSP): 부모 클래스와 자식 클래스가 있을 때, 부모가 있는 곳에 자식 클래스의 인스턴스로 대체해도 정상 동작하여야 함.

  • 자식 클래스는 부모 클래스의 역할을 완전히 대체할 수 있어야 함

인터페이스 분리의 원칙 (ISP): 인터페이스는 기능 단위로 잘게 쪼개야 함.

  • 복잡한 인터페이스는 분리 필요

의존성 역전의 원칙 (DIP): 고수준 모듈은 저수준 모듈(구체적 객체)에 의존하지 않음

  • 고수준 모듈과 저수준 모듈 모두 추상화에 의존해야 함.(저수준 모델이 바뀌어도 고수준 모델이 타격받지 않음)

댓글을 작성해보세요.

채널톡 아이콘