티스토리 뷰
확장 메서드는 설계 의도를 드러내는 방법으로는 썩 훌륭하지 않다. 확장 메서드를 사용하는 대부분의 경우가 기존에 개발된 타입을 개선하기 위해서이지 타입의 본질적인 동작 방식을 변경하기 위해서는 아니기 때문이다.
왜 확장 메서드로 타입을 확장해서는 안 되는가?
확장 메서드를 이용하여 인터페이스에 대한 기본 구현체를 제공하는 것이 괜찮은 방법인 것은 분명하지만 타입을 확장하기 위한 용도로 사용하는 것은 적절하지 않다.
확장 메서드를 과도하게 사용하거나 잘못 사용하면 메서드 충돌로 인해 유지보수 비용이 급격하게 증가하는 곤경에 처할 수 있기 때문이다.
예시) Person 클래스
Person 객체의 FirstName과 LastName을 화면에 출력하기 위해서 확장 메서드를 작성할 수 있다.
위 코드가 그렇게 나쁘지 않을 수도 있다. 이제 새로운 요구 사항이 생겨서 XML 파일을 만들어야 한다고 해보자.
위 두 코드는 같은 메서드의 이름을 가지고 있고 다른 네임스페이스를 가지고 있다. 이런 식으로 코드를 작성하면 개발자가 실수로 네임스페이스를 잘못 참조하게 되면 동작 방식이 바뀌어버린다. 혹은 확장 메서드가 포함된 네임스페이스를 참조하는 것을 잊어버리면 컴파일조차 되지 않는다.
네임스페이스를 기반으로 어떤 메서드를 호출할지를 결정하는 방식은 그 구조가 너무 허약하다.
또한 앞서 구현한 새로운 기능은 사실 타입의 기능을 확장하는 것으로는 보기 힘들다. Person 객체를 XML이나 콘솔로 출력하는 기능은 Person 타입의 자체 기능이라기 보다는 외부에서 Person 객체를 사용하는 기능이기 때문이다.
따라서, 다음과 같이 두 메서드를 가능한 한 동일 클래스 내에 서로 다른 이름을 가진 메서드로 작성하는 것이 좋다.
이제 Person 타입의 사용자는 특별한 혼동 없이 두 메서드를 모두 사용할 수 있다. 동일한 원형의 메서드를 네임스페이스의 이름만 달리하여 작성했을 때의 모호함은 사라졌다.
결론
특정 타입에 대해 동작하는 확장 메서드는 하나의 세트로 간주해야 한다. 확장 메서드를 여러 네임스페이스 걸쳐 오버로드해서는 안된다. 동일한 원형의 확장 메서드를 여러 개 만들어야 할 경우라도 절대 그렇게 해서는 안된다.
대신 메서드의 이름을 달리하고 정적 메서드로 작성하는 것을 고려하기 바란다. 그래야만 컴파일러가 using 문장을 기반으로 오버로드된 메서드 중 하나를 선택하는 이상한 상황이 벌어지지 않는다.
참조 - Effective C# <강력한 C# 코드를 구현하는 50가지 전략과 기법, 이펙티브>, 빌 와그너, 김명신, 한빛미디어
'Programming > Effective C#' 카테고리의 다른 글
[Effective C# Item 37] 쿼리를 사용할 때는 즉시 평가보다 지연 평가가 낫다 (0) | 2020.10.20 |
---|---|
[Effective C# Item 36] 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 (0) | 2020.10.20 |
[Effective C# Item 34] 함수를 매개변수로 사용하여 결합도를 낮추라 (0) | 2020.10.20 |
[Effective C# Item 33] 필요한 시점에 필요한 요소를 생성하라 (0) | 2020.10.20 |
[Effective C# Item 32] Action, Predicate, Function과 순회 방식을 분리하라 (0) | 2020.10.20 |