-
[Refactoring] 9. 기능 편애클린코드 2022. 9. 12. 15:14
| 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다.
기능 편애
- 어떤 모듈에 있는 함수가 다른 모듈에 있는 데이터나 함수들을 더 많이 참조할 때 발생한다.
- 만약 여러 모듈을 참조하고 있다면, 그 중에서 가장 많은 데이터를 참조하는 곳으로 옮기거나, 함수를 여러 개로 쪼개서 각 모듈로 분산시킬 수 있다.
- 데이터와 해당 데이터를 참조하는 행동을 같은 곳에 두는 것이 좋다.
- 예외적으로, 데이터와 행동을 분리한 디자인 패턴을 적용할 수 있다.
- 관련 리팩토링
- 함수 옮기기 -> 함수를 적절한 위치로 이동시킨다.
- 함수 추출하기 -> 함수 일부부만 다른 곳에서 많이 참조할 시 함수를 추출하여 다른 모듈로 이동시킨다.
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