기능 편애(Feature Envy)

박상훈·2022년 8월 18일
0
어떤 모듈에 있는 함수가 다른 모듈에 있는 데이터나 함수를 더 많이 참조
함수 옮기기 리팩토링 적용 필요
함수 본문 중 일부분만 다른 곳의 데이터와 함수를 참조하는 경우 함수 추출하기 적용
여러 모듈을 참조하는 경우 가장 많은 데이터를 참조하는 곳으로 옮기거나 함수를 여러개로 쪼개서 모듈로 분산
데이터와 해당 데이터를 참조하는 곳에 두어야 함

Bill 에서 기능에 대한 집착이 있는 케이스로 electricityBill, gasBill 을 더하는 연산만
bill 에서 진행하도록 하고 각 각의 연산은 해당 레코드에서 진행하도록 수정

before

class Bill {
    private ElectricityUsage electricityUsage;
    private GasUsage gasUsage;
  
    public double calculateBill() {
        var electricityBill = electricityUsage.getAmount() * electricityUsage.getPricePerUnit();
        var gasBill = gasUsage.getAmount() * gasUsage.getPricePerUnit();
        return electricityBill + gasBill;
    }
}

class ElectricityUsage {
    private double amount;
    private double pricePerUnit;
  
    // ...생성자, getter
}

class GasUsage {
    private double amount;
    private double pricePerUnit;
  
    // ...생성자, getter
}

after

class Bill {
    private ElectricityUsage electricityUsage;
    private GasUsage gasUsage;
  
    public double calculateBill() {
        return electricityUsage.getElecticityBill() + gasUsage.getGasBill();
    }
}

class ElectricityUsage {
    private double amount;
    private double pricePerUnit;
  
    // ...생성자, getter

    public double getElectricityBill() {
      return this.getAmount() * this.getPricePerUnit();
    }
}

class GasUsage {
    private double amount;
    private double pricePerUnit;
  
    // ...생성자, getter

    public double getGasBill() {
      return this.getAmount() * this.getPricePerUnit();
    }
}
profile
엔지니어

0개의 댓글