확장 메서드는 설계 의도를 드러내는 방법으로는 썩 훌륭하지 않다. 확장 메서드를 사용하는 대부분

의 경우가 기존에 개발된 타입을 개선하기 위해서이지 타입의 본질적인 동작 방식을 변경하기 위한

것은 아니기 때문이다.

인터페이스에는 최소한의 기능만을 정의하고, 확장메서드를 이용하여 공통적으로 사용될 것으로

예상되는 작업에 대한 기본 구현체를 제공할 수 있다. 타입을 확장하기 위해서 동일한 기법을 사용

하려 할 수도 있을 것이다. 또한 네임스페이스를 달리하여 여러 가지 버전의 확장 메서드를 정의하려

고 시도할 수도 있다. 하지만 절대로 그래서는 안 된다. 확장 메서드를 이용하여 인터페이스에 대한

기본 구현체를 제공하는 것이 괜찮은 방법인 것은 분명하지만 타입을 확장하기위한 용도로 사용하

는 것은 적절하지 않으며 더 좋은 대안들이 많다. 확장 메서드를 과도하게 사용하거나 잘못 사용하면

메서드 충돌로 인해 유지보수 비용이 급격히 증가하는 곤경에 처할 수 있다.

우선 확장 메서드를 잘못 사용한 예부터 살펴보기로 하자. 별도의 라이브러리에 Person 클래스를

다음과 같이 정의하고 있다고 가정하자.

public sealed class Person
{
		public string FirstName
		{
				get; set;
		}
		public string LastName
		{
				get; set;
		}
}

Person 객체의 FirstName과 LastName을 화면에 출력하기 위해서 확장 메서드를 작성할 수 있다.

// 좋지 않은 시작
// 확장 메서드를 이용하여 클래스를 확장함
namespace ConsoleExtensions
{
		public static class ConsoleReport
		{
				public static string Format(this Person target) =>
						$"{target.LastName, 20}, {target.FirstName, 15}";
		}
}