워밍업 클럽 2기 - Day4 Mission

FreshBreeze·2024년 10월 3일
0

  1. SOLID 에 대해여 자기만의 언어로 정리하기
  2. 코드 리팩토링

1. SOLID 란?

로버트 마틴이 제시한 객체 지향 프로그래밍 설계의 다섯 가지 기본 원칙

SRP: Single Responsibility Principle
단일 책임 원칙

  • 하나의 클래스는 단 한가지의 책임을 가져야 한다.
    • 책임 = '변경 이유'
  • 변경이 중요한 기준!
    • 변경 사항이 있을 때 파급 효과가 적도록

OCP: Open-Closed Principle
개방-폐쇄 원칙

  • 확장에는 열려 있고, 수정에는 닫혀 있어야 한다.
    • 기존 코드의 변경 없이, 시스템의 기능을 확장.

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

  • 상속 구조에서, 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환
    • 하위 클래스는 인터페이스 규약 철저.

ISP: Interface Segregation Principle
인터페이스 분리 원칙

  • 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 된다.
    • 특정 클라이언트를 위한 인터페이스 다수 > 범용 인터페이스 하나

DIP: Dependency Inversion Principle
의존관계 역전 원칙

  • 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다.
    • 저수준 모듈이 변경되어도, 고수준 모듈에는 영향이 가지 않도록.
  • 구현 클래스에 의존하지 말고, 인터페이스에 의존

2. 코드 리팩토링

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

리팩토링 주안점

  1. 부정어구 사용 자제
// As-Is
if (!order.hasCustomerInfo()) { ··· } 
else if (!(order.getTotalPrice() > 0)) { ··· }

// To-Be
if (order.hasNotCustomerInfo()) { ··· } 
else if (order.getTotalPrice() <= 0)) { ··· } 
  1. Early return을 통한 else 사용 자제
  2. 중첩 분기문, 중첩 반복문
// As-Is
if (order.getItems().size() == 0) { 
  ···
} else {
  if (order.getTotalPrice() > 0) {
    ···
    if (!order.hasCustomerInfo()) {
      ···
    } else {
      ···
    }
  } else if (order.getTotalPrice() <= 0)) {
    ···
  }
}

// To-Be
if (order.getItems().size() == 0) { 
  ···
  return false;
} 

if (order.getTotalPrice() <= 0)) { 
  ···
  return false;
}

if (order.hasNotCustomerInfo()) { 
  ···
  return false;
}

return true;
  1. Null값 예외처리
if (order == null) {
  log.info("주문 객체가 null입니다.");
  return false;
}
  1. getter, setter 사용 자제
// As-Is
order.getItems().size()

// To-Be
order.getTotalSize()

리팩토링 결과

  public boolean validateOrder(Order order) {

    if (order == null) {
      log.info("주문 객체가 null입니다.");
      return false;
    }

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

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

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

    return true;
  }

출처
(Inflearn) Readable Code: 읽기 좋은 코드를 작성하는 사고법 - 박우빈

0개의 댓글

관련 채용 정보