미션 1

아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다.

AS-IS

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

TO-BE


public boolean isValidOrder(Order order) {
    if (order.hasNotItems()) {
        log.info("주문 항목이 없습니다.");
        return false;
    }

    if (order.isTotalPriceLessOrEqualsThan(0)) {
        log.info("올바르지 않은 총 가격입니다.");
        return false;
    }

    if (order.hasNotCustomerInfo()) {
        log.info("사용자 정보가 없습니다.");
        return false;
    }

    return true;
}
public class Order {
        private List<Item> items;

        private CustomerInfo customerInfo;

        public int getItemSize(){
            return items.size();
        }

        public boolean isTotalPriceGreaterThan(int price){
            int totalPrice = items.stream()
                    .mapToInt(Item::getPrice)
                    .sum();

            return totalPrice > price;
        }

        public boolean isTotalPriceLessOrEqualsThan(int price){
            return !isTotalPriceGreaterThan(price);
        }

        public boolean hasCustomerInfo(){
            return customerInfo != null;
        }

        public boolean hasNotCustomerInfo(){
            return !hasCustomerInfo();
        }

        public boolean hasItems(){
            return items.isEmpty();
        }

        public boolean hasNotItems(){
            return !hasItems();
        }
    }

미션 2

SOLID에 대하여 자기만의 언어로 정리해 봅시다.

<aside> 💡

SOLID : 로버트 C. 마틴이 소개한 객체 지향 프로그래밍의 다섯 가지 기본 원칙. 유지보수가 용이한 시스템을 위해 적용한다.

</aside>

SRP(Single Responsibility Principle)

단일 책임 원칙. 하나의 클래스는 하나의 책임(역할)만 맡아야한다.

클래스가 변경되는 이유는 오직 해당 책임때문이어야한다.

OCP(Open-Close Principle)

개방 폐쇄 원칙. 코드는 확장에는 열려있지만 변경에는 닫혀있어야 한다.

기존 코드의 변경 없이 기능 추가가 가능해야한다.