코드가 정말 못났다. 반복적일 뿐 아니라 너무 길기까지 하다. 코드를 살펴보면 ‘도형이 특정 타입인지 확인한 후 타입별 속성을 이용하는’ 식의 패턴을 세 번이나 반복한다. 중요한 것은 메서드 내에 if 문이 여러 개 있음에도 불구하고 각각의 if 문은 return 문만을 포함하므로 항상 전체 if 문 중에 단 하나만 선택적으로 수행된다는 점이다. 다음 코드는 동일한 작업을 수행하는 코드를 C# 7의 switch 문을 이용하여 작성한 예다.
예제 12-11 패턴을 사용하여 둘레 길이 계산 ▶ ShapePerimeterWithPatternsSwitchCase.cs
static double Perimeter(Shape shape)
{
switch (shape)
{
➊
case null:
throw new ArgumentNullException(nameof(shape));
➋
case Rectangle rect:
return 2 * (rect.Height + rect.Width);
case Circle circle:
return 2 * PI * circle.Radius;
case Triangle tri:
return tri.SideA + tri.SideB + tri.SideC;
➌
default:
throw new ArgumentException(...);
}
}
➊ null 값 처리
➋ 타입별 처리
➌ 무엇을 해야 할지 알 수 없다면 예외를 던짐