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