[35] 확장 메서드는 절대 오버로드하지 마라

다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.

 

 

확장 메서드의 목적은 기존에 개발된 타입을 개선하기 위함이다.

타입의 본질적인 동작 방식을 변경하기 위하여 사용해서는 안된다.

 

확장 메서드를 과도하게 사용하거나 잘못 사용하면 유지보수 비용이 급격하게 증가하게 된다.

 

여러 네임 스페이스에 걸쳐 선언된 확장 메서드

다음은 여러 네임스페이스에 같은 이름의 확장메서드를 선언한 코드이다.

namespace ConsoleExtensions
{
    public static class ConsoleReport
    {
        public static string Format(this Person target) =>
            $"{target.LastName, 20} {target.FirstName, 15}";
    }
}

namespace XmlExtensions
{
    public static class XmlReport
    {
        public static string Format(this Person target) =>
            new XElement("Person",
                new XElement("LastName", target.LastName),
                new XElement("FirstName", target.FirstName)
                ).ToString();
    }
}

위의 코드는 다음과 같은 문제점이 있다.

 

1. 네임스페이스를 잘못참조하면 프로그램 동작 방식이 바뀐다.

2. 2개의 네임스페이스가 공통적으로 필요한 메서드는 중복 정의할 수밖에 없다.

3. 코드 사용자가 네임스페이스가 바뀐다고 코드의 동작이 바뀐다는 것을 인지하지 못한다. 

 

위의 예시는 사실 객체의 기능을 확장한 게 아니라 그냥 외부에서 객체를 사용하였다고 보는 게 맞을 것이다.

 

특정 타입에 대해 동작하는 확장 메서드는 하나의 세트로 간주해야 한다.

확장 메서드를 여러 네임 스페이스에 오버로드 해서는 안된다.

동일한 확장 메서드를 여러 개 만들어야 한다면 이름을 달리하고 정적 메서드로 작성하는 걸 고려하자.

 

결론

 - 확장 메서드는 논리적으로 추가하려는 기능이 타입 내에 포함되는 것이 적절한 경우에만 사용하자.

 

 

 

댓글

Designed by JB FACTORY