![[인프런워밍업클럽] Day4 미션 - 읽기좋은 코드](https://cdn.inflearn.com/public/files/blogs/b758e4d8-707b-4400-b58c-8b370771dbe0/4-backend.png)
[인프런워밍업클럽] Day4 미션 - 읽기좋은 코드
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;
}
[TO-BE]
메서드 분리 & Early Return 적용
if -else - else-if 문을 각각의 if문으로 분리하고 return 할 수 있도록 수정
공백 라인 적용
각각의 조건문에서 공백라인을 적용해 분리된 로직을 확인할 수 있도록 수정
부정연산자를 긍정형으로 바꿔서 적용
!(order.getTotalPrice() > 0)
조건문 내 영역을 메서드를 분리하고 0이거나 0보다 작은 경우를 나타내는checkTotalPriceAboveZero
로 메서드 이름을 변경!order.hasCustomerInfo()
조건을 사용자 정보를 가지고 있는 의미를 나타내는checkCustomerInfoExists
메서드로 변경
예외 처리
각각의 메서드에서 주문항목이 없는 경우, 사용자 정보가 없는 경우 0보다 같거나 작은 경우를 확인 하기 때문에 예외로 처리하면 좋겠다고 생각해
IllegalArgumentException
예외를 던지도록 수정원 메서드인 validateOrder을 try-catch문으로 변경하고 각각의 메서드로 예외를 확인하고 아닌 통과가 되면 true를 반환하도록 수정했다.
public boolean validateOrder(Order order) {
try {
checkOrderItemsExist(order);
checkCustomerInfoExists(order);
checkTotalPriceAboveZero(order);
return true;
} catch (IllegalArgumentException e) {
log.info(e.getMessage());
return false;
}
}
private static void checkOrderItemsExist(Order order) {
if (order.getItems().size() == 0) {
throw new IllegalArgumentException("주문 항목이 없습니다.");
}
}
private static void checkCustomerInfoExists(Order order) {
if (!order.hasCustomerInfo()) {
throw new IllegalArgumentException("사용자 정보가 없습니다.");
}
}
private static void checkTotalPriceAboveZero(Order order) {
if (order.getTotalPrice() <= 0) {
throw new IllegalArgumentException("올바르지 않은 총 가격입니다.");
}
}
2. SOLID에 대하여 자기만의 언어로 정리하기
SRP(Single Responsibility Principle)
하나의 클래스는 하나의 책임만 가져야 한다는 의미
하나의 클래스가 여러 역할을 담당하면 결합도가 높아지기 때문에 유지보수가 어려워 진다.
OCP(Open-Closed Principle)
확장에는 열려있고, 수정에는 닫혀있어야 한다는 의미
새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있어야 한다
LIP(Liskov Substitution Principle)
부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체해도 동일하게 동작해야 한다는 의미
상속 관계에서 부모 클래스가 가지고 있는 동작을 자식 클래스가 깨뜨리면 안 된다
ISP (Interface Segregation Principle)
클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다
클라이언트가 필요하지 않은 기능까지 구현하는 것을 지양
DIP (Dependency Inversion Principle)
구체적인 구현체가 아닌 추상화(인터페이스)에 의존해야 한다는 의미
고수준 모듈이 저수준 모듈에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다
댓글을 작성해보세요.