5-1.switch 문 Switch Statements

[ 2017-08.01 작성 ]

  • switch 문의 단점은 반드시 중복이 생긴다는 점이다. 동일한 switch가 다른 곳에서 또 쓰일가능성이 크다
  • switch 문에 새 코드행을 추가하려면 그렇게 여기저기에 존재하는 switch 문을 전부 찾아서 수정해야한다.
  • 이 문제를 해결할수 있는 방법은 다형성 즉 재정의를 이용하는 것이다.
  • switch 문을 메서드 추출로 빼낸 후 메서드 이동을 실시해서 그 메서드를 재정의해야 할 클래스에 옮겨 넣으면 된다.
  • 단, 간단한 스위치는 그냥 사용하는 것이 더 낫다.

다형성

CrappySwitch
public class CrappySwitch {
  public string DoSomething(int foo) {
    switch (foo) {
      case 0: return "foo";
      case 1: return "bar";
      case 2: return "baz";
    }
  
    return null;
  }
}

팩토리패턴

public interface IFooable {
  string DoSomething();
}

public class ZeroFooable : IFooable {
  public string DoSomething() {
    return "foo";
  }
}

public class OneFooable : IFooable {
  public string DoSomething() {
    return "bar";
  }
}

public class TwoFooable : IFooable {
  public string DoSomething() {
    return "baz";
  }
}

public class DefaultFooable : IFooable {
  public string DoSomething() {
    return null;
  }
}

public class FooableFactory {
  public IFooable GetFooable(int foo) {
    switch (foo) {
      case 0: return new ZeroFooable();
      case 1: return new OneFooable();
      case 2: return new TwoFooable();
    }

    return new DefaultFooable();
  }
}

public class CrappySwitch {
  private readonly FooableFactory factory;

  public CrappySwitch(FooableFactory factory) {
    this.factory = factory;
  }

  public string DoSomething(int foo) {
    return factory.GetFooable(foo).DoSomething();
  }
}

해시테이블 OR 딕셔너리

HashTable

public void HashTableCase()
{
   Hashtable hash = new Hashtable();

   hash.Add("f", "foo");
   hash.Add("b", "bar");
   hash.Add("z", "baz");
   
   Console.Write("Value = {0}", hash["f"]);
}

Dictionary

public void Dictionary()
{
  Dictionary<string, string> dic = new Dictionary<string, string>();
  dic.Add("f", "foo");
  dic.Add("b", "bar");
  dic.Add("z", "baz");

   Console.Write("Value = {1}", dic["f"]);
}

Wrapping up

두 경우 모두 코드 양이 반드시 감소하지는 않습니다. 리팩토링의 요점은 코드의 양을 줄이는 것이 아니라 현재 코드의 디자인을 개선하는 것입니다.

어떤 방법을 선택하든 함께 작업하는 코드에 따라 달라집니다. 몇 가지 일반적인 사용 사례는 다음과 같습니다.

  • switch별도의 클래스 / 객체 / 파일 / 범위에서 중복 된 문 을 제거하려는 경우 다형성을 사용해보십시오
  • 성능을 향상시키려는 경우 해시 테이블을 사용하십시오.
  • 읽기 가능성 만 향상시키려는 경우 해시 테이블을 사용하십시오.
  • 귀하의 switch진술이 너무나 거대하고 한 곳에서만 사용되는 경우 해시 테이블을 사용하십시오 (또는 왜 그렇게 큰지 파악하고 수정하십시오)

위 참고 사이트 : http://tmont.com/blargh/2011/11/refactoring-a-switch-statement