| 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다.
기능 편애
- 어떤 모듈에 있는 함수가 다른 모듈에 있는 데이터나 함수들을 더 많이 참조할 때 발생한다.
- 만약 여러 모듈을 참조하고 있다면, 그 중에서 가장 많은 데이터를 참조하는 곳으로 옮기거나, 함수를 여러 개로 쪼개서 각 모듈로 분산시킬 수 있다.
- 데이터와 해당 데이터를 참조하는 행동을 같은 곳에 두는 것이 좋다.
- 예외적으로, 데이터와 행동을 분리한 디자인 패턴을 적용할 수 있다.
- 관련 리팩토링
- 함수 옮기기 -> 함수를 적절한 위치로 이동시킨다.
- 함수 추출하기 -> 함수 일부부만 다른 곳에서 많이 참조할 시 함수를 추출하여 다른 모듈로 이동시킨다.
Before
public class Bill {
private ElectricityUsage electricityUsage;
private GasUsage gasUsage;
public double calculateBill() {
var electicityBill = electricityUsage.getAmount() * electricityUsage.getPricePerUnit();
var gasBill = gasUsage.getAmount() * gasUsage.getPricePerUnit();
return electicityBill + gasBill;
}
}
public class ElectricityUsage {
private double amount;
private double pricePerUnit;
public ElectricityUsage(double amount, double pricePerUnit) {
this.amount = amount;
this.pricePerUnit = pricePerUnit;
}
public double getAmount() {
return amount;
}
public double getPricePerUnit() {
return pricePerUnit;
}
}
public class GasUsage {
private double amount;
private double pricePerUnit;
public GasUsage(double amount, double pricePerUnit) {
this.amount = amount;
this.pricePerUnit = pricePerUnit;
}
public double getAmount() {
return amount;
}
public double getPricePerUnit() {
return pricePerUnit;
}
}
=> Bill Class에서 불필요한 전기, 가스 사용량 계산
After
public class Bill {
private ElectricityUsage electricityUsage;
private GasUsage gasUsage;
public double calculateBill() {
return electricityUsage.getElecticityBill() + gasUsage.getGasBill();
}
}
public class ElectricityUsage {
private double amount;
private double pricePerUnit;
public ElectricityUsage(double amount, double pricePerUnit) {
this.amount = amount;
this.pricePerUnit = pricePerUnit;
}
public double getAmount() {
return amount;
}
public double getPricePerUnit() {
return pricePerUnit;
}
public double getElectricityBill() {
return amount * pricePerUnit;
}
}
public class GasUsage {
private double amount;
private double pricePerUnit;
public GasUsage(double amount, double pricePerUnit) {
this.amount = amount;
this.pricePerUnit = pricePerUnit;
}
public double getAmount() {
return amount;
}
public double getPricePerUnit() {
return pricePerUnit;
}
public double getGasBill() {
return amount * pricePerUnit;
}
}
'클린코드' 카테고리의 다른 글
[Refactoring] 11. 기본형 집착 (0) | 2022.09.14 |
---|---|
[Refactoring] 10. 데이터 뭉치 (0) | 2022.09.13 |
[Refactoring] 8. 산탄총 수술 (0) | 2022.09.11 |
[Refactoring] 7. 뒤엉킨 변경 (0) | 2022.09.10 |
[Refactoring] 6. 가변 데이터 (0) | 2022.09.09 |