함수에 매개변수가 많을수록 함수의 역할을 이해하기 어려워진다.
//AsIs
public double getFinalPrice() {
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.9 : basePrice * 0.95;
}
//ToBe
public double getFinalPrice() {
double basePrice = this.quantity * this.itemPrice;
return this.discountedPrice(basePrice);
}
private double discountedPrice(double basePrice) {
return discountLevel() == 2 ? basePrice * 0.9 : basePrice * 0.95;
}
private int discountLevel() {
return this.quantity > 100 ? 2 : 1;
}
플래그를 사용하는 함수는 그렇지 않은 함수와 목적에서 그 차이를 파악하기 힘들다.
//AsIs
//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 "TX", "NY", "OR" -> 3;
default -> 4;
};
return order.getPlacedOn().plusDays(deliveryTime);
}
}
//Client
LocalDate placedOn = LocalDate.of(2021,12,15);
Order orderFromWA = new Order(placedOn, "WA");
Shipment shipment = new Shipment();
shipment.deliveryDate(orderFromWA,true);
shipment.deliveryDate(orderFromWA,false);
//ToBe
//Shipment
public LocalDate rushDeliveryDate() {
int deliveryTime = switch (order.getDeliveryState()) {
case "WA", "CA", "OR" -> 1;
case "TX", "NY", "FL" -> 2;
default -> 3;
};
return order.getPlacedOn().plusDays(deliveryTime);
}
public LocalDate regularDeliveryDate() {
int deliveryTime = switch (order.getDeliveryState()) {
case "WA", "CA" -> 2;
case "TX", "NY", "OR" -> 3;
default -> 4;
};
return order.getPlacedOn().plusDays(deliveryTime);
}
//Client
LocalDate placedOn = LocalDate.of(2021,12,15);
Order orderFromWA = new Order(placedOn, "WA");
Shipment shipment = new Shipment();
shipment.rushDeliveryDate(orderFromWA);
shipment.regularDeliveryDate(orderFromWA);
비슷한 매개변수 목록을 여러 함수에서 사용하고 있다면 메소드들을 모아서 클래스로 만들고 필요한 매개변수들을 클래스내 state로 이동함으로써 매개변수를 줄일 수 있다.