이 블로그 글은 박우빈님의 인프런 강의: Readable Code: 읽기 좋은 코드를 작성하는 사고법
를 참조하여 작성한 글입니다.
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;
}
@Service
@RequiredArgsConstructor
public class OrderService {
...
public boolean validateOrder(Order order) {
if (order.hasNoItems()) {
throw new OrderException("주문 항목이 없습니다.");
}
if (order.hasNotCustomerInfo()) {
throw new OrderException("사용자 정보가 없습니다.");
}
if (order.isInValidTotalPrice())) {
throw new OrderException("올바르지 않은 총 가격입니다.");
}
return true;
}
}
@Entity
@Table(name = "orders")
@Where(clause = "deleted_at IS NULL")
@SQLDelete(sql = "UPDATE orders SET deleted_at = NOW() WHERE id = ?")
public class Order {
...
private boolean hasNoItems() {
return this.items.isEmpty();
}
private boolean hasNotCustomerInfo() {
return this.customInfo.isEmpty();
}
private boolean isTotalPriceLessThanZero() {
return this.items.stream().mapToInt(Item::getPrice).sum() <= 0;
}
}
public class OrderException extends RuntimeException {
public OrderException(String message) {
super(message);
}
}
order.getItems().size() == 0 getter 의 연속적 사용을 메서드화하여 Order 객체 안으로 숨겨서 캡슐화했다.!order.hasCustomerInfo() 과 같은 부정 연산자를 없애고, hasNotCustomerInfo 처럼 부정어도 메서드화 하여 가독성을 높였다.