워밍업 클럽 스터디 - Day4

워밍업 클럽 스터디 - Day4

해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님<Readable Code: 읽기 좋은 코드를 작성하는 사고법> 강의를 듣고 작성한 글입니다.

 

미션 2-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; 
}

 

validateOrder가 하는 일 파악하기

  • 주문 항목이 있는지 체크

  • 가격이 0보다 큰지 체크

  • 사용자 정보가 있는지 체크

    1. early return 적용하기

  • early return을 적용함으로써 else의 사용을 지양한다.

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

2. 부정어를 대하는 자세

  • 부정어구를 쓰지 않아도 되는 상황인지 체크

  • 부정의 의미를 담은 다른 단어 존재하는지 체크

3. getter 사용 자제

  • 객체에 직접 메세지를 보내 확인 하는 것이 무례하지 않다.

4. 예외처리

  • OrderException 클래스 생성

public class OrderException extends RuntimeException{
	public OrderException(String message) { 
		super(message); 
	} 
}

 

TO-BE

public boolean validateOrder(Order order){  
    if(order.isItemEmpty()) {  
        throw new OrderException("주문 항목이 없습니다.");  
    }  
    if(order.isTotalPriceLessThanZero()){  
        throw new OrderException("올바르지 않은 총 가격입니다.");  
    }  
    if(order.isCustomerInfoMissing()){  
        throw new OrderException("사용자 정보가 없습니다.");  
    }  
    return true;  
}

// Order
private boolean isItemEmpty() {  
    return this.items.isEmpty();  
}  
  
private boolean isTotalPriceLessThanZero() {  
    return this.items.stream()  
            .mapToInt(Item::getPrice).sum() <= 0;  
  
}  
private boolean isCustomerInfoMissing() {  
    return this.customInfo.isEmpty();  
}

 

미션 2-2. SOLID 에 대해 자기만의 언어로 적어보기

 

1. SRP : 단일 책임 원칙

  • 레스토랑에서 일하는 사람들에 비유해 적어보고자 한다. 레스토랑에 주방장, 웨이터, 청소부 가 있다고 생각해 보면, 주방장은 요리만, 웨이터는 주문과 서빙만, 청소부는 청소만 해야 한다. 만약 주방장이 서빙까지 맡게 된다면 주방 일이 제대로 안 될 수 있다. 이와 같이 모든 역할이 각자 하나의 책임만 맡고, 그 일을 잘하는 것이 단일 책임 원칙이라고 생각한다.

2. OCP : 개방 폐쇄 원칙

  • 레스토랑에 새로운 메뉴를 추가할 때, 기존 주방의 동선 이나 도구 배치를 크게 바꾸지 않고 새로운 메뉴를 준비할 수 있어야 한다. 주방의 구조나 기존 메뉴는 그대로 두고, 필요한 추가 장비나 재료만 추가하는 식이다. 새로운 요구사항에 맞게 확장(새로운 메뉴 추가)은 쉽게 가능하지만, 기존 시스템 (기존 메뉴 및 도구 배치)은 유지하는 것이 이 원칙이라고 생각한다.

3. LSP : 리스코프 치환 원칙

  • 예를 들어 새로운 웨이터가 채용 되더라도 기존 웨이터가 하던 일을 동일하게 할 수 있어야 한다. 만 약 새로 온 웨이터가 “서빙은 할 수 있지만 손님과의 소통은 못 한다”라고 하면 문제가 생긴다. 따라 서 기존 역할을 무리 없이 수행할 수 있도록 상호 대체 가능해야 하는 원칙이라고 생각한다.

4. ISP : 인터페이스 분리 원칙

  • 모든 직원이 모든 일을 다 할 수 있도록 하는 대신, 각자의 역할에 맞는 것만 하도록 하는 것이 더 효율적이다. 웨이터는 서빙과 주문만 받고, 주방장은 요리와 재료 준비만, 청소부는 청소만 할 수 있게 역할 별로 필요한 업무만 하는 것이 인터페이스 분리 원칙이라고 생각한다.

5. DIP : 의존성 역전 원칙

  • 레스토랑에서 업주 마음대로 직원에게 지시하는 것보다, 문서로 만들어 일관된 방식으로 전달하는 것이다. 이렇게 하면 업주나 직원이 바뀌더라도 직원들은 동일한 업무 지침에 따라 일할 수 있다. 즉, 업주가 아닌 지침서에 의존하도록 하는 것이다. 이 원칙을 통해 레스토랑 운영이 특정 사람의 방식에 좌우되지 않고, 유연하게 유지 될 수 있도록 한다.

댓글을 작성해보세요.

채널톡 아이콘