-
[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