워밍업클럽2기-Backend 클린코드-#2_Day4 발자국 미션-SOLID

SOLID- 나의 언어로 정리하기

 

SRP- Single Responsible Principle 단일 책임 원칙

객체는 단 하나의 책임만 가지고 있어야 한다. 책임을 분리하면 읽기 쉽고 유지보수하기 쉬운 코드가 된다.

책임을 분리해서 서로 상호작용하며 기계 부품들 처럼 굴러가는 어플리케이션 만들기!

객체들간에 서로의 코드가 어떻게 작동 하는지를 알수없게 책임을 나눠 메서드 안에 넣고 깔끔하게 숨긴다.-(뇌메모리 적게 쓰기)

 

OCP- open closed principle -개방 폐쇠 원칙

확장에는 열려있고 변경에는 닫혀있다. 인터페이스를 사용해서 다양한 확장 가능성을 열어둔다. 객체는 인터페이스만 알면 어떤 클래스가 들어오는지 몰라도 사용할수있게 코드 짜기.

지뢰찾기 게임에서 처음에는 난이도가 하나밖에 없었는데 나중에 난이도 여러개를 만든다면 코드에 직접 적어서 변경하지 않고 난이도 인터페이스로 만들고 easy, normal, hard 클래스들을 만들어준다. 객체는 난이도 인터페이스는 알지만 어떤 난이도의 클래스가 들어오는지 모른다(변경X).

 

LSP- Liskov Substitution Principle 리스코프 치환 원칙

자식 클래스 는 상속 받은 부모 클래스가 가진 책임의 틀안에서 확장되어야 한다.

부모클래스의 기능을 존중하지 않으면 필요하지않는 예외처리가 필요하다.

예) 새 (부모 클래스) 안에 fly()메서드가 있는다 자식 클래스가 팽귄이라서 fly()에 수영하는 기능이 추가되어있다면 이건 LSP를 위반하는거고 에러가 뜰수있다.

 

IPS- Interface Segregation Principle 인터페이스 분리 원칙

인터페이스를 분리하기- 인터페이스가 너무 무거우면 사용하지않는 코드들이 많아지고 불필요한 결함도 높아진다.

인터페이스를 잘게 쪼개어서 쓰지않는 기능들은 클라이언트가 가지고 있지않게 한다.

텔레토비들이 먹는 쿠키를 찍어낼때 필요한 쿠키 틀을 만들때 눈과 입 모양의 쿠키 틀 인터페이스를 만드는게 아니라 쿠키의 모양 틀 인터페이스(a), 쿠키의 눈만 찍어낼수있는 인터페이스(b), 쿠키의 입만 찍어낼수있는 인터페이스(c) 이렇게 따로 분리해서 만들면 a,b 를 사용해서 눈만 있는 쿠키, a,b,c를 사용해서 눈과 입이 있는 쿠키처럼 인터페이스를 따로 분리해서 깔끔하고 다양하게 쿠키 들을 찍어낼수있다.

 

DIP- Dependency Inversion Principle 의존역전 원칙

구체적인 클래스가 아닌 추상화된 인터페이스에만 의존하게 설계하고, 실제 구현체는 외부에서 주입받아 사용하도록 한다. 이렇게 하면 어떤 구현체가 들어오더라도 기존 코드를 변경할 필요가 없고, 확장성이 크게 증가한다.

쿠키 찍어내는 기계는 쿠키틀의 모양만 알면 다양한 구현체 모양의 쿠키틀의 표정은 몰라도 모양을 맞으니 그냥 끼워서 사용할수있다 😀

 

 

 

리팩토링

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

       
    }

 추가로 변경하기 예의를 갖추어 오더에게 여쭈어보라고 강사 선생님이 그러셨당.

 

 public boolean validateOrder(Order order) {

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

        if (isOrderEmpty(order)) {
            log.info("주문 항목이 없습니다.");
            return false;
        }

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

        return true;
    }

    private static boolean hasInvalidOrderPrice(Order order) {
        return order.getTotalPrice() < 0;
    }

    private static boolean isOrderEmpty(Order order) {
        return order.getItemSize() == 0;
    }

    private static boolean lacksOfUserInfor(Order order) {
        return order.doesntHaveCustomerInfo();
    }

댓글을 작성해보세요.

채널톡 아이콘