22.참조를 값으로 전환 Change Reference to Value

정의 : 작고, 불변성이고, 관리하기 어려운 참조객체가 있는 경우, 그것을 값 객체로 바꾼다.

동기

  • 참조 객체로 작업하는 것이 복잡해지면 참조에서 값으로 바꿀 이유가 될 수 있다.
  • 값 객체의 중요한 특징 중의 하나는 불변성이어야 한다는 것이다.
  • 하나의 대해서 질의를 호출하면 언제나 같은 결과를 얻어야 한다.(불변성)
  • 만약 가변성이라면 어떤 객체의 속성을 바꾸었을 때 같은 것을 나타내는 모든 객체를 업데이트 해야 한다.

절차

  • 바꿀 객체가 불변성인지 불변성이 될 수 있는지 확인한다.
  • Equals 메소드와 HashCode 메소드를 만들어라.
  • 컴파일 및 테스트
  • 팩토리 메소드를 제거하고 생성자를 public으로 하라.
Before
class Currency
{
    public string Name { get; private set; }

    private Currency(string name)
    {
        Name = name;
    }

    public static Currency Create(string name)
    {
        return new Currency(name);
    }
}

Example 클래스에서 Sample 메서드를 호출했을때, Currency객체에 값을 셋팅하고 또 Currency 객체에 값을 세팅한 것이 같은가??????

After
public class Currency
{
   public string Name { get; private set; }

   public Currency(string name)
   {
       Name = name;
   }

  public override bool Equals(object obj)
  {
      return Name.Equals(((Currency)obj).Name);
  }

  public override int GetHashCode()
  {
      return Name.GetHashCode();
  }
}

public class Example
{
  public bool Sample()
  {
      return new Currency("USD").Equals(new Currency("USD"));
  }

class Program
    {
        static void Main(string[] args)
        {
            var ex = new Example();
            Console.Write(ex.Sample());
        }
    }
    // 실행결과: True