본문 바로가기

클린코드

[Refactoring] 16. 임시 필드

 

코딩으로 학습하는 리팩토링 - 인프런 | 강의

리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직

www.inflearn.com

| 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다.


임시 필드
  • 클래스에 있는 어떤 필드가 특정한 경우에만 값을 가지는 경우
  • 관련 리팩토링
    • 클래스 추출하기 -> 변수 이동
    • 함수 옮기기 -> 변수를 사용하는 함수를 특정 클래스로 옮기기
    • 특이 케이스 추가하기 -> 특정한 경우에 해당하는 클래스를 만들어서 해당 조건을 제거

Refactoring 1. 특이 케이스 추가하기

  • 어떤 필드의 특정한 값에 따라 동작하는 코드가 반복적으로 나타난다면 해당 필드를 감싸는 특별한 케이스를 만들어 해당 조건을 표현할 수 있다.
  • 이러한 매커니즘을 특이 케이스 패턴이라 하고 Null Object 패턴은 해당 패턴의 특수한 형태이다.
Before
public class Customer {

    private String name;

    private PaymentHistory paymentHistory;

    public Customer(String name, PaymentHistory paymentHistory) {
        this.name = name;
        this.paymentHistory = paymentHistory;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public PaymentHistory getPaymentHistory() {
        return paymentHistory;
    }

    public void setPaymentHistory(PaymentHistory paymentHistory) {
        this.paymentHistory = paymentHistory;
    }

    public boolean isUnknown() {
        return false;
    }
}

public 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 int weeksDelinquent(Site site) {
        Customer customer = site.getCustomer();
        return customer.getName().equals("unknown") ? 0 : customer.getPaymentHistory().getWeeksDelinquentInLastYear();
    }

}

public class PaymentHistory {

    private int weeksDelinquentInLastYear;

    public PaymentHistory(int weeksDelinquentInLastYear) {
        this.weeksDelinquentInLastYear = weeksDelinquentInLastYear;
    }

    public int getWeeksDelinquentInLastYear() {
        return this.weeksDelinquentInLastYear;
    }
}

public class Site {

    private Customer customer;

    public Site(Customer customer) {
        this.customer = customer;
    }

    public Customer getCustomer() {
        return customer;
    }
}
After
public class Customer {

    private String name;

    private PaymentHistory paymentHistory;

    public Customer(String name, PaymentHistory paymentHistory) {
        this.name = name;
        this.paymentHistory = paymentHistory;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public PaymentHistory getPaymentHistory() {
        return paymentHistory;
    }

    public void setPaymentHistory(PaymentHistory paymentHistory) {
        this.paymentHistory = paymentHistory;
    }

    public boolean isUnknown() {
        return false;
    }
}

public class UnknownCustomer extends Customer {
    public UnknownCustomer() {
        super("unknown", new NullPaymentHistory());
    }

    @Override
    public boolean isUnknown() {
        return true;
    }

    @Override
    public String getName() {
        return "occupant";
    }
}

public class CustomerService {

    public String customerName(Site site) {
        return site.getCustomer().getName();
    }

    public int weeksDelinquent(Site site) {
        return site.getCustomer().getPaymentHistory().getWeeksDelinquentInLastYear();
    }

}

public class PaymentHistory {

    private int weeksDelinquentInLastYear;

    public PaymentHistory(int weeksDelinquentInLastYear) {
        this.weeksDelinquentInLastYear = weeksDelinquentInLastYear;
    }

    public int getWeeksDelinquentInLastYear() {
        return this.weeksDelinquentInLastYear;
    }
}

public class NullPaymentHistory extends PaymentHistory {
    public NullPaymentHistory() {
        super(0);
    }
}

public class Site {

    private Customer customer;

    public Site(Customer customer) {
        this.customer = customer.getName().equals("unknown") ? new UnknownCustomer() : customer;
    }

    public Customer getCustomer() {
        return customer;
    }
}

'클린코드' 카테고리의 다른 글

[Refactoring] 18. 중재자  (0) 2022.09.22
[Refactoring] 17. 메시지 체인  (0) 2022.09.21
[Refactoring] 15. 추측성 일반화  (0) 2022.09.18
[Refactoring] 14. 성의없는 요소  (0) 2022.09.17
[Refactoring] 13. 반복문  (0) 2022.09.16