워밍업 클럽 2기(클린코드 & 테스트) 2번째 미션(DAY 4)
1개월 전
SOLD
S - Single Responsibility Principle (SRP): 클래스는 하나의 책임만 가져야 하며, 변경이 필요할 때 그 책임 하나만 변경되어야 한다는 원칙이며, 해당 원칙을 고수 했을 때 클래스가 더 간단하고 유지보수가 용이해진다.
O - Open/Closed Principle (OCP): 확장에 대해서는 열려 있어야 하지만, 수정에 대해서는 닫혀 있어야 한다는 원칙으로 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있어야 한다.
L - Liskov Substitution Principle (LSP): 자식 클래스는 부모 클래스의 기능을 대체할 수 있어야 한다는 원칙으로 자식 클래스가 부모 클래스를 대체해도 프로그램의 동작에는 문제가 없어야 한다.
I - Interface Segregation Principle (ISP): 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다는 원칙으로 하나의 인터페이스 보단 여러개의 구체적인 인터페이스로 나눠 사용하는게 더 바람직 하다.
D - Dependency Inversion Principle (DIP): 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다는 원칙으로 추상은 구현체에 의존해서는 안 되고, 구현체가 추상에 의존해야 한다.
리펙터링
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; }
해당 코드를 리펙터링 해보자.
public class OrderValidator {
private static final Logger log = LoggerFactory.getLogger(OrderValidator.class);
public boolean validate(Order order) {
return hasItems(order) && hasValidTotalPrice(order) && hasCustomerInfo(order);
}
private boolean hasItems(Order order) {
if (order.getItems().isEmpty()) {
log.info("주문 항목이 없습니다.");
return false;
}
return true;
}
private boolean hasValidTotalPrice(Order order) {
if (order.getTotalPrice() <= 0) {
log.info("올바르지 않은 총 가격입니다.");
return false;
}
return true;
}
private boolean hasCustomerInfo(Order order) {
if (!order.hasCustomerInfo()) {
log.info("사용자 정보가 없습니다.");
return false;
}
return true;
}
}
댓글을 작성해보세요.