임시 필드(Temporary Field)

박상훈·2022년 8월 18일
클래스에 있는 어떤 필드가 특정한 경우에만 값을 가짐

특이 케이스 추가하기(Introduce Special Case)

  • 어떤 필드의 특정한 값에 따라 동일하게 동작하는 코드가 반복적으로 발생하는 경우
  • Null Object 패턴을 해당 패턴의 특수한 형태라고 함

특정한 케이스를 클래스로 분리(UnknownCustomer 클래스) 생성자 오버라이딩할 때
unknown 에 해당하는 값 을 세팅하여 객체를 생성할 수 있도록 설정
필요한 클래스가 추가되고 코드를 분리 하므로서 CustomerService 불필요한 로직이 현저히 줄어듬

before

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
}

after

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();
    }
}
profile
엔지니어

0개의 댓글