KoreanFoodie's Study

디자인 패턴 (GOF) #4 - Interface Segregation Principle (인터페이스 분리 원칙) 본문

Game Dev/Design Patterns

디자인 패턴 (GOF) #4 - Interface Segregation Principle (인터페이스 분리 원칙)

GoldGiver 2022. 6. 8. 08:33

GoF 의 디자인 패턴강의를 참고하여 디자인 패턴에 대한 내용을 정리하고 있습니다.

Interface Segregation Principle (인터페이스 분리 원칙)

인터페이스 분리 원칙, ISP 는 각 인터페이스가 사용하지 않는 메서드만 지원해야 함을 의미한다. 예를 들어, 프린트와 스캐너 기능을 하는 기계를 인터페이스로 구현했다고 하자.

struct IMachine
{
 virtual void print(Document& doc) = 0;
 virtual void fax(Document& doc) = 0;
 virtual void scan(Document& doc) = 0;
};

struct MFP : IMachine
{
 void print(Document& doc) override;
 void fax(Document& doc) override;
 void scan(Document& doc) override;
};

하지만 이런 식으로 코드를 짜게 되면, 분리되어서 관리되어야 할 print 기능과 scan 기능, 그리고 fax 기능이 섞여 분리하거나 조합( 예 : print 와 fax 만 되도록 ) 만들 수 없다.

대신 다음과 같이 의미를 명확히 함과 동시에, 인터페이스르 분리해주면 추후 재사용이 용이해진다.

struct IPrinter
{
  virtual void print(Document& doc) = 0;
};

struct IScanner
{
  virtual void scan(Document& doc) = 0;
};

struct Printer : IPrinter
{
  void print(Document& doc) override;
};

struct Scanner : IScanner
{
  void scan(Document& doc) override;
};

struct IMachine: IPrinter, IScanner
{
};

struct Machine : IMachine
{
  IPrinter& printer;
  IScanner& scanner;

  Machine(IPrinter& printer, IScanner& scanner)
    : printer{printer},
      scanner{scanner}
  {
  }

  void print(Document& doc) override {
    printer.print(doc);
  }
  void scan(Document& doc) override;
};

// IPrinter --> Printer
// everything --> Machine

 

Comments