클래스에 있는 어떤 필드가 특정한 경우에만 값을 가짐
특정한 케이스를 클래스로 분리(UnknownCustomer 클래스) 생성자 오버라이딩할 때
unknown 에 해당하는 값 을 세팅하여 객체를 생성할 수 있도록 설정
필요한 클래스가 추가되고 코드를 분리 하므로서 CustomerService 불필요한 로직이 현저히 줄어듬
class BasicBillingPlan extends BillingPlan { }
class BillingPlan { }
class Customer {
private String name;
private BillingPlan billingPlan;
private PaymentHistory paymentHistory;
// ...getter, setter, constructor
}
class CustomerService {
public String customerName(Site site) {
Customer customer = site.getCustomer();
String customerName;
if (customer.getName().equals("unknown")) {
customerName = "occupant";
} else {
customerName = customer.getName();
}
return customerName;
}
public BillingPlan billingPlan(Site site) {
Customer customer = site.getCustomer();
return customer.getName().equals("unknown") ? new BasicBillingPlan() : customer.getBillingPlan();
}
public int weeksDelinquent(Site site) {
Customer customer = site.getCustomer();
return customer.getName().equals("unknown") ? 0 : customer.getPaymentHistory().getWeeksDelinquentInLastYear();
}
}
class PaymentHistory {
private int weeksDelinquentInLastYear;
// ...getter, constructor
}
class Site {
private Customer customer;
// ...getter, constructor
}
class UnknownCustomer {
public UnknownCustomer() {
super("unknown", new BasicBillingPlan(), new NullPaymentHistory());
}
@Override
public String getName() {
return "unknown";
}
@Override
public boolean isUnknown(Customer customer) {
return true;
}
}
class NullPaymentHistory extends PaymentHistory {
public NullPaymentHistory() {
super(0);
}
}
class Customer {
// ... beforeCustomer 클래스와 동일하고 아래와 같이 메서드 하나 추가
public boolean isUnknown(Customer customer) {
return false;
}
}
class CustomerService {
public String customerName(Site site) {
return site.getCustomer().getName();
}
public BillingPlan billingPlan(Site site) {
return site.getCustomer().getBillingPlan();
}
public int weeksDelinquent(Site site) {
return site.getCustomer().getPaymentHistory().getWeeksDelinquentInLastYear();
}
}