한 줄 요약하면, 필요 없는 기능까지 구현하도록 강제하지 말라.
정도가 될 수 있다.
예를 들어, 어떤 센서 X
가 데이터를 요청(Request)하면, 응답(Response)로 데이터를 준다고 하자.
이제, 일련의 센서 데이터 수신을 위하여 아래와 같은 interface와 class를 정의하였다.
아래 설계를 마친 뒤에, 이제 센서 Y
가 시스템에 추가되는 상황을 가정해보자.
그런데, 애석하게도 이번에 추가된 센서 Y
는 요청을 하지 않아도 계속 응답을 뿌리고 있는 유형의 센서라서, Request
를 굳이 구현해줄 필요가 없다.
그럼에도 불구하고 interface 역할을 하는 Sensor
에 Request
가 존재하기 때문에 우리는 Y
에 대해서도 아무 일을 하지 않을 Request
stub를 만들어주어야 한다.
class Sensor
{
public:
virtual void Request(const RequestFrame& req) const = 0;
virtual void ReadResponse(ResponseFrame& res) const = 0;
};
class SensorX
{
void Request(const RequestFrame& req) const;
void ReadResponse(ResponseFrame& res) const;
};
반면, 아래와 같이 애시 당초 interface를 세분화 시켜 놓는다면 우리는 필요 없는 구현을 강제하지 않을 수 있다.
이와 같이 interface를 세분화해서 필요 없는 구현을 강제하지 않는 것이 Interface Segreagation의 핵심이다.
class Requester
{
public:
virtual void Request(const RequestFrame& req) const = 0;
};
class Reader
{
public:
virtual void ReadResponse(ResponseFrame& res) const = 0;
};
class SensorX : public Requester, Reader
{
public:
void Request(const RequestFrame& req) const;
void ReadResponse(ResponseFrame& res) const;
};
class SensorY : public Reader
{
public:
void ReadResponse(ResponseFrame& res) const;
};