이번 미션에서는 더 읽기 좋은 코드를 만들기 위해 기존 코드를 리팩토링하고, SOLID 원칙을 자기만의 언어로 정리하는 작업을 수행했다.
다음은 주어진 validateOrder 메서드의 기존 코드이다.
📌 기존 코드
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;
}
🔍 분석 결과
getter를 직접 호출하는 부분이 많음 → 캡슐화를 해치고 있음 !, !=) 사용이 많음 → 코드의 직관성이 떨어짐 리팩토링 시 고려할 사항:
✔️ getter 사용을 최소화하기 위해 Order 내부에 메서드를 추가
✔️ 부정 연산자(!)를 제거하여 가독성을 높임
✔️ 불필요한 else 문을 제거하여 코드 흐름을 단순화
Order 클래스 내부에 필요한 메서드를 추가하여 객체 스스로 판단할 수 있도록 수정
📌 수정된 Order 클래스
import java.util.List;
public class Order {
private final List<Integer> items;
private final int totalPrice;
private final int customer;
public Order(List<Integer> items, int totalPrice, int customer) {
this.items = items;
this.totalPrice = totalPrice;
this.customer = customer;
}
public boolean isEmpty() {
return items.isEmpty();
}
public boolean hasCustomerInfo() {
return customer != 0;
}
public boolean moreThanZeroTotalPrice() {
return totalPrice > 0;
}
}
validateOrder 메서드리팩토링된 validateOrder는 더 직관적이고 읽기 쉬운 코드가 되었다.
📌 수정된 validateOrder 메서드
public class MissionDay4 {
public boolean validateOrder(Order order) {
if (order.isEmpty()) {
log.info("주문 항목이 없습니다.");
return false;
}
if (order.moreThanZeroTotalPrice()) {
if (order.hasCustomerInfo()) {
return true;
}
log.info("사용자 정보가 없습니다.");
return false;
}
log.info("올바르지 않은 총 가격입니다.");
return false;
}
}
| 항목 | 리팩토링 전 | 리팩토링 후 |
|---|---|---|
| getter 사용 | 직접 호출 (order.getTotalPrice()) | Order 내부에서 메서드 제공 (order.moreThanZeroTotalPrice()) |
| 부정 연산자 | !order.hasCustomerInfo() 사용 | order.hasCustomerInfo()로 긍정 표현 |
| 조건문 구조 | 중첩된 if-else 다수 포함 | 단순한 if 구조로 개선 |
| 가독성 | 흐름 파악이 어려움 | 더 직관적인 코드 |
SOLID 원칙은 객체 지향 프로그래밍에서 유지보수성과 확장성을 높이기 위한 설계 원칙이다.
아래는 내가 이해한 SOLID 원칙을 나만의 언어로 정리한 내용이다.
"하나의 클래스는 하나의 책임만 가져야 한다."
"확장은 가능하지만, 기존 코드는 수정하지 않는다."
"하위 클래스는 상위 클래스를 대체할 수 있어야 한다."
"필요한 기능만 포함된 인터페이스를 사용하라."
"구체적인 것보다, 추상적인 것에 의존하라."
📖 강의 제목: Readable Code: 읽기 좋은 코드를 작성하는 사고법
👩🏫 강사: 박우빈