본문 바로가기

.Net Technology/.NET TDD

(14) TDD를 위한 객체지향 - 인터페이스의 분리 (Interface segregation)

인터페이스를 이용해서 객체를 기능별로 잘 분리해야 한다는 원칙이다. 솔리드의 첫번째 규칙이었던 객체는 하나의 기능을 가지고 있어야 한다는 것과 의미적으로 보면 같은 맥락이 될 수 있다. 하지만 여기서의 의미는 인터페이스를 통해서 기능을 세부저긍로 분리하는 것이다. 바로 앞의 예제가 완벽하지 않은 이유는 일반 고객은 할인이 불가능함에도 불구하고 GetDiscount라는 메서드를 가지고 있기 때문이다. 필자는 이 기능을 분리하기 위해서 아래와 같이 인터페이스를 추가해보도록 하겠다. 
 
public interface IDiscount
{
    double GetDiscount(double totalSales);
}
 
이제 위의 소스를 아래와 같이 변경해보도록 하자. 
public interface IDiscount
{
    double GetDiscount(double totalSales);
}

public interface ISpecialService
{
    void SetSpecialService(string order);
}

public class Customer
{
}

public class SilverCustomer : Customer, IDiscount, ISpecialService
{
    public double GetDiscount(double totalSales)
    {
        return totalSales - 50;
    }
    public void SetSpecialService(string order)
    {
        //Save to Database
    }
}

public class GoldCustomer : Customer,IDiscount, ISpecialService
{
    public double GetDiscount(double totalSales)
    {
        return totalSales - 100;
    }
    public void SetSpecialService(string order)
    {
        //Save to Database
    }
}
 
이렇게 각자의 기능들을 인터페이스를 통하여 분리하였다. 향후에 원하는 기능을 수행하기 위해서 객체들을 손쉽게 분리할 수 있으며 또한 쓸모없는 기능을 가지고 있는 것을 방지할 수 있다.