[인프런워밍업클럽] Day4 미션 - 읽기좋은 코드

[인프런워밍업클럽] Day4 미션 - 읽기좋은 코드

https://inf.run/yTUP4

1. 읽기 좋은 코드로 리팩토링 하기

[AS-IS]

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;
}

[TO-BE]

  • 메서드 분리 & Early Return 적용

    • if -else - else-if 문을 각각의 if문으로 분리하고 return 할 수 있도록 수정

  • 공백 라인 적용

    • 각각의 조건문에서 공백라인을 적용해 분리된 로직을 확인할 수 있도록 수정

  • 부정연산자를 긍정형으로 바꿔서 적용

    • !(order.getTotalPrice() > 0) 조건문 내 영역을 메서드를 분리하고 0이거나 0보다 작은 경우를 나타내는 checkTotalPriceAboveZero 로 메서드 이름을 변경

    • !order.hasCustomerInfo() 조건을 사용자 정보를 가지고 있는 의미를 나타내는 checkCustomerInfoExists 메서드로 변경

  • 예외 처리

    • 각각의 메서드에서 주문항목이 없는 경우, 사용자 정보가 없는 경우 0보다 같거나 작은 경우를 확인 하기 때문에 예외로 처리하면 좋겠다고 생각해 IllegalArgumentException 예외를 던지도록 수정

    • 원 메서드인 validateOrder을 try-catch문으로 변경하고 각각의 메서드로 예외를 확인하고 아닌 통과가 되면 true를 반환하도록 수정했다.

public boolean validateOrder(Order order) {
    try {
        checkOrderItemsExist(order);
        checkCustomerInfoExists(order);
        checkTotalPriceAboveZero(order);
        return true;
    } catch (IllegalArgumentException e) {
        log.info(e.getMessage());
        return false;
    }
}

private static void checkOrderItemsExist(Order order) {
    if (order.getItems().size() == 0) {
        throw new IllegalArgumentException("주문 항목이 없습니다.");
    }
}

private static void checkCustomerInfoExists(Order order) {
    if (!order.hasCustomerInfo()) {
        throw new IllegalArgumentException("사용자 정보가 없습니다.");
    }
}

private static void checkTotalPriceAboveZero(Order order) {
    if (order.getTotalPrice() <= 0) {
        throw new IllegalArgumentException("올바르지 않은 총 가격입니다.");
    }
}

 

2. SOLID에 대하여 자기만의 언어로 정리하기

  • SRP(Single Responsibility Principle)

    • 하나의 클래스는 하나의 책임만 가져야 한다는 의미

    • 하나의 클래스가 여러 역할을 담당하면 결합도가 높아지기 때문에 유지보수가 어려워 진다.

       

  • OCP(Open-Closed Principle)

    • 확장에는 열려있고, 수정에는 닫혀있어야 한다는 의미

    • 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있어야 한다

  • LIP(Liskov Substitution Principle)

    • 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체해도 동일하게 동작해야 한다는 의미

    • 상속 관계에서 부모 클래스가 가지고 있는 동작을 자식 클래스가 깨뜨리면 안 된다

  • ISP (Interface Segregation Principle)

    • 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다

    • 클라이언트가 필요하지 않은 기능까지 구현하는 것을 지양

  • DIP (Dependency Inversion Principle)

    • 구체적인 구현체가 아닌 추상화(인터페이스)에 의존해야 한다는 의미

    • 고수준 모듈이 저수준 모듈에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다

댓글을 작성해보세요.

채널톡 아이콘