인터페이스를 이용해서 객체를 기능별로 잘 분리해야 한다는 원칙이다. 솔리드의 첫번째 규칙이었던 객체는 하나의 기능을 가지고 있어야 한다는 것과 의미적으로 보면 같은 맥락이 될 수 있다. 하지만 여기서의 의미는 인터페이스를 통해서 기능을 세부저긍로 분리하는 것이다. 바로 앞의 예제가 완벽하지 않은 이유는 일반 고객은 할인이 불가능함에도 불구하고 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 } }
이렇게 각자의 기능들을 인터페이스를 통하여 분리하였다. 향후에 원하는 기능을 수행하기 위해서 객체들을 손쉽게 분리할 수 있으며 또한 쓸모없는 기능을 가지고 있는 것을 방지할 수 있다.