해당 포스팅은 인프런 백기선님의 '리팩토링'을 학습 후 정리한 내용입니다.
public class Order {
private int quantity;
private double itemPrice;
public Order(int quantity, double itemPrice) {
this.quantity = quantity;
this.itemPrice = itemPrice;
}
public double finalPrice() {
double basePrice = this.quantity * this.itemPrice;
int discountLevel = this.quantity > 100 ? 2 : 1;
return this.discountedPrice(basePrice, discountLevel);
}
private double discountedPrice(double basePrice, int discountLevel) {
return discountLevel == 2 ? basePrice * 0.90 : basePrice * 0.95;
}
}
discountedPrice() 함수의 파라미터 discountLevel 은 다른 파라미터를 통해 값을 유츄할 수 있다.
함수로 추출하자!
package me.whiteship.refactoring._04_long_parameter_list.practice._01;
public class Order {
private int quantity;
private double itemPrice;
public Order(int quantity, double itemPrice) {
this.quantity = quantity;
this.itemPrice = itemPrice;
}
public double finalPrice() {
double basePrice = this.quantity * this.itemPrice;
return this.discountedPrice(basePrice);
}
private int getDiscountLevel() {
return this.quantity > 100 ? 2 : 1;
}
private double discountedPrice(double basePrice) {
return getDiscountLevel() == 2 ? basePrice * 0.9 : basePrice * 0.95;
}
}
- getDiscountLevel() 이라는 함수로 추출하여 discountedPrice() 함수 내부에서 호출하여 사용한다.
- 따라서 discountedPrice() 함수의 매개변수를 줄일 수 있다.
public class Shipment {
public LocalDate deliveryDate(Order order, boolean isRush) {
if (isRush) {
int deliveryTime = switch (order.getDeliveryState()) {
case "WA", "CA", "OR" -> 1;
case "TX", "NY", "FL" -> 2;
default -> 3;
};
return order.getPlacedOn().plusDays(deliveryTime);
} else {
int deliveryTime = switch (order.getDeliveryState()) {
case "WA", "CA" -> 2;
case "OR", "TX", "NY" -> 3;
default -> 4;
};
return order.getPlacedOn().plusDays(deliveryTime);
}
}
}
deliveryDate() 함수 내부에서 급 배송을 의미하는 isRush 에 따라 배송 날짜를 계산해주는 함수이다. 하지만 함수 매개변수에 플래그가 있으면 함수가 많은 일을 하고있는 것이다.
함수를 분리하자!
public class Shipment {
public LocalDate regularDeliveryDate(Order order) {
int deliveryTime = switch (order.getDeliveryState()) {
case "WA", "CA" -> 2;
case "OR", "TX", "NY" -> 3;
default -> 4;
};
return order.getPlacedOn().plusDays(deliveryTime);
}
public LocalDate rushDeliveryDate(Order order) {
int deliveryTime = switch (order.getDeliveryState()) {
case "WA", "CA", "OR" -> 1;
case "TX", "NY", "FL" -> 2;
default -> 3;
};
return order.getPlacedOn().plusDays(deliveryTime);
}
}
조건에 맞는 함수로 분리하여 필요한 함수를 호출해 사용하였다.
예제 코드는 이전 포스팅을 참조하자. 보러 가기
각 함수에서 totalNumberOfEvents, participants 와 같은 비슷한 매개변수를 여러 함수에서 사용하고 있다.
필요한 데이터와 메서드를 옮겨 클래스로 만들어 해결할 수 있다.
리팩토링 후 코드는 이전 포스팅을 참조하자. 보러가기