워밍업 클럽 스터디 - 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 : 의존성 역전 원칙
레스토랑에서 업주 마음대로 직원에게 지시하는 것보다, 문서로 만들어 일관된 방식으로 전달하는 것이다. 이렇게 하면 업주나 직원이 바뀌더라도 직원들은 동일한 업무 지침에 따라 일할 수 있다. 즉, 업주가 아닌 지침서에 의존하도록 하는 것이다. 이 원칙을 통해 레스토랑 운영이 특정 사람의 방식에 좌우되지 않고, 유연하게 유지 될 수 있도록 한다.
댓글을 작성해보세요.