21.데이터 값을 객체로 전환 Replace Data Value with Object

추가적인 데이터나 동작을 필요로 하는 데이터 아이템이 있을 때는 데이터 아이템을 객체로 바꾸어라.

[ 동기 ]

  1. 종종 개발 초기 단계에서는 간단한 사실을 간단한 데이터 아이템으로 표현하도록 한다.

  2. 개발이 진행될수록 이런 간단한 데이터 아이템이 더 이상 간단하지 않다는 것을 알게 된다.

  3. 전화번호를 처음 한동안은 문자열로 표현할 수 있지만, 나중에는 포맷팅을 해야 한다든가, 지역코드를 추출해야 하는 등의 특별한 동작이 필요하다는 것을 알게 된다.

  4. 한두 개의 아이템에 대해서는 아이템을 포함하고 있는 객체에 메소드를 추가할 수 있겠지만, 곧 코드는 중복 (duplication)과 기능에 대한 욕심(feature envy)의 냄새를 풍기게 된다.

  5. 이런 냄새가 나기 시작하면 데이터 값을 객체로 바꾸어야 한다.

http://jinsmisc.pe.kr/49

Before
 class Order
 {
    public string Customer { get; set; }
   public Order(string customer)
   {
       Customer = customer;
   }
   
   private static int NumberOfOrdersFor(IEnumerable<Order> orders, string customer)
   {
      return orders.Count( o => o.Customer.Equals(customer, stringComparison.InvariantCultueIngnoreCase));
   }
 }
After Refactoring
 class Order
 {
    public Customer Customer { get; set; }
   
   public Order(Customer customer)
   {
       Customer = customer;
   }
   
   private static int NumberOfOrdersFor(IEnumerable<Order> orders, Customer customer)
   {
      return orders.Count( o => o.Customer.Equals(customer));
   }
 }
 
 class Customer
 {
  public string Name { get; private set; }
  public Customer(string name)
  {
      Name = name;
  }
  
  public override bool Equals(object obj)
  {
      return Name.Equals((Customer)obj).Name);
  }
  
  public override int GetHashCode()
  {
      return Name.GetHashCode();
  }
 }