ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Refactoring] 16. 임시 필드
    클린코드 2022. 9. 20. 18:35
     

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

    리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리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

    댓글

Designed by Tistory.