[인프런] 워밍업클럽 3기
[인프런 워밍업 클럽 3기] BE 클린코드 - 미션 4
동그리담
2025. 3. 4. 22:28
1. 리팩토링 해보기
public class Misson {
public static final String MESSAGE_DOSE_NOT_EXIST_ORDER_ITEM = "주문 항목이 없습니다.";
public static final String MESSAGE_DOSE_NOT_EXIST_USER_INFO = "사용자 정보가 없습니다.";
public static final String MESSAGE_TOTAL_PRICE_IS_ZERO = "올바르지 않은 총 가격입니다.";
static class Order{
private static final List<Item> items = new ArrayList<>();
private static String custInfo;
public int getTotalPrice(){
int totalPrice = 0;
for(Item i : items){
totalPrice += i.price;
}
return totalPrice;
}
public boolean isTotalPriceNegative(){
return getTotalPrice() < 0;
}
public boolean hasNotCustomerInfo(){
return custInfo.isEmpty();
}
public boolean itemIsEmpty(){
return items.isEmpty();
}
}
public boolean validateOrder(Order order) {
if (order.itemIsEmpty()){
log.info(MESSAGE_DOSE_NOT_EXIST_ORDER_ITEM);
return false;
}
if (order.hasNotCustomerInfo()) {
log.info(MESSAGE_DOSE_NOT_EXIST_USER_INFO);
return false;
}
if (order.isTotalPriceNegative()) {
log.info(MESSAGE_TOTAL_PRICE_IS_ZERO);
return false;
}
return true;
}
}
2. 좋은 객체 지향 설계의 5가지 원칙 SOLID
S | Single Responsibility Principle 단일 책임의 원칙 |
"한 클래스는 오직 하나의 책임만 가져야 한다" 클래스 하나가 애플리케이션 전반에 걸쳐 여러 일을 동시에 하면, 그 클래스를 수정 할 때마다 영향력이 커지게 된다. 이런 수정 리스크를 줄이기 위해 하나의 클래스는 하나의 역할만 작동하도록 설계 하는 것이 목표 |
O | Open/Closed Principle 개방 - 폐쇄의 원칙 |
"확장에는 열려있고 수정에는 닫혀있어야 한다." 새로운 기능을 추가하거나 요구사항이 바뀌어도 기존 코드는 최소한으로 수정되게 설계하자. 확장 기능이 필요할 때 굳이 오래된 로직을 해치지 않고, 다형성을 활용해 쉽게 덧붙일 수 있게 설계 하는 것이 목표 |
L | Liskov Substitution Principle 리스코프 치환 원칙 |
"부모 타입의 자리에 어떤 자식 타입을 넣어도 프로그램은 제대로 동작해야 한다." 부모 클래스를 대체해 다른 자식 클래스를 넣는다고 해도, 프로그램은 정상 작동 해야한다. |
I | Interface Segregation Principle 인터페이스 분리 원칙 |
"범용 인터페이스에 의존하지 않도록 해야 한다.." 여러 개의 인터페이스로 쪼개어 설계하지 않고, 하나의 범용 인터페이스로 설계하게 되면, 수정도 어렵고 테스트도 복잡해진다. |
D | Dependency Inversion Principle 의존관계 역전 원칙 |
"구체에 의존하지 않고, 추상에 의존해야 한다." 의존관계를 보다 유연하게 설계하기 위해 구현체에 의존하지 않고, 상위 추상 타입에 의존하면, 이렇게 되면, 변경과 확장이 용이해진다. |