본문 바로가기

클린코드

[Refactoring] 9. 기능 편애

 

 

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

리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직

www.inflearn.com

| 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다.


기능 편애
  • 어떤 모듈에 있는 함수가 다른 모듈에 있는 데이터나 함수들을 더 많이 참조할 때 발생한다.
  • 만약 여러 모듈을 참조하고 있다면, 그 중에서 가장 많은 데이터를 참조하는 곳으로 옮기거나, 함수를 여러 개로 쪼개서 각 모듈로 분산시킬 수 있다.
  • 데이터와 해당 데이터를 참조하는 행동을 같은 곳에 두는 것이 좋다.
  • 예외적으로, 데이터와 행동을 분리한 디자인 패턴을 적용할 수 있다.
  • 관련 리팩토링
    • 함수 옮기기 -> 함수를 적절한 위치로 이동시킨다.
    • 함수 추출하기 -> 함수 일부부만 다른 곳에서 많이 참조할 시 함수를 추출하여 다른 모듈로 이동시킨다.
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