리팩터링/냄새 (리팩터링할 시점)

냄새 9. 기능 편애(Feature Envy)

developer-tj 2023. 3. 29. 12:00
반응형

기능 편애(Feature Envy)는 어떤 메소드가 자신이 속한 클래스가 아닌 다른 클래스의 메소드나 데이터를 자주 호출할 때 발생하는 코드 냄새(code smell)입니다.
즉, 메소드가 다른 클래스의 기능에 너무 의존적이어서, 해당 메소드가 다른 클래스에 더 적합하게 위치할 수 있는지를 고민해봐야 하는 경우입니다.

기능 편애는 두 개의 클래스 간에 너무 많은 상호작용이 일어나는 것으로 보통 인식됩니다.
이러한 경우 해당 클래스들은 결합도(coupling)가 높아져서 코드의 재사용성, 유지보수성, 확장성이 떨어지게 됩니다.
또한, 한 클래스가 다른 클래스의 많은 기능을 사용하게 되면, 코드 일관성이 떨어지고, 클래스의 책임을 명확하게 분리하지 못하게 됩니다.

기능 편애는 보통 다음과 같은 문제를 유발할 수 있습니다.

  • 한 클래스가 다른 클래스의 내부 상태에 너무 의존적이어서, 다른 클래스의 수정이 해당 클래스까지 영향을 미칠 수 있습니다.
  • 메소드가 너무 많은 클래스에 의존하면, 이를 모두 파악하는 것이 어렵기 때문에 코드의 이해가 어려워집니다.
  • 클래스 간의 결합도가 높아지면, 테스트와 디버깅이 어려워질 수 있습니다.

따라서 기능 편애를 해결하는 가장 좋은 방법은, 해당 메소드가 다른 클래스에 의존하지 않도록 코드를 재구성하는 것입니다.
이를 위해서는 다른 클래스의 메소드와 데이터를 해당 클래스 내부로 이동시키거나, 두 클래스를 더 작은 단위로 분리하여 의존성을 낮출 수 있습니다.
또한, 디자인 패턴 중 하나인 데코레이터 패턴(decorator pattern)을 활용하여, 클래스 간의 의존성을 느슨하게 만들 수도 있습니다.


적용 가능한 리팩터링 기법