DEV ℧ Developer Diary

[Refactoring] 냄새 23. 상속 포기

해당 포스트는 inflearn의 백기선님의 강의인 리팩토링 을 듣고 정리한 글입니다.

냄새 23. 상속 포기

  • 서브클래스가 슈퍼클래스에서 제공하는 메소드나 데이터를 잘 활용하지 않는다는 것은 해당 상속 구조에 문제가 있다는 뜻이다.
    • 기존의 서브클래스 또는 새로운 서브클래스르 만들고 슈퍼클래스에서 “메소드와 필드를 내려주면 (Push Down Method / Field)” 슈포클래스에 공동으로 사용하는 기능만 남길 수 있다.
  • 서브클래스가 슈퍼클래스의 기능을 재사용하고 싶지만 인터페이스를 따르고 싶지 않은 경우에는 “슈퍼클래스 또는 서브클래스를 위임으로 교체하기” 리팩토링을 적용할 수 있다.

예제 코드

간단한 기능이다. 만약 수퍼클래스에서 구현한 메소드가 하위클래스중 사용하지 않는 경우가 있다면, 해당 메소드는 수퍼클래스에서 구현하지 않고 사용 하는 하위클래스에만 적용한다는 뜻이다.

예제를 통해서 살펴보도록 하자.

할당량(Quota)를 필드로 가진 Employee 클래스가 각각 Engineer, Salesman을 상속한다고 보자.

public class Employee {
    protected Quota quota;
    protected Quota getQuota() {
        return new Quota();
    }
}

public class Engineer extends Employee { }

public class Salesman extends Employee { }

만약 할당량이이 Engineer클래스에는 필요없지만 Salesman에만 필요하다면? 굳이 Employee에서 가지고 있을 필요는 없다.

아래와 같이 Employee에서는 기능을 삭제하고 필요한 클래스에만 옮겨주도록 하자.

수퍼클래스는 공통적인 메소드를 모아두는 것이 좋다.

public class Employee { }

public class Engineer extends Employee { }

public class Salesman extends Employee {
  protected Quota quota;
  protected Quota getQuota() {
    return new Quota();
  }
}