깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ④ ~ 인터페이스 분리의 원칙 ~

이번은 SOLID의 인터페이스 분리의 원칙에 대해 정리했습니다.

그 외의 기사는 이하.
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ① ~단일 책임의 원칙~
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ② ~ 오픈 폐쇄 원칙 ~
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ③ ~리스코프의 대체 원칙~
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ⑤ ~ 의존성 역전의 원칙 ~

인터페이스 분리의 원칙



No client should be forced to depend on methods it does not use

직역하면, "클라이언트는 사용하지 않는 메소드에 의존하는 것을 강제해서는 안된다."라는 의미가 됩니다.

예를 들어, 복합기, 프린터 스캐너, 프린터를 사용하는 경우를 생각해 봅시다.
이러한 기기에는 각각 다음과 같은 기능이 있습니다.


각 기기의 클래스를 만들기 전에 인터페이스를 준비합니다.
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ② ~ 오픈 폐쇄 원칙 ~ 에서도 가볍게 설명했습니다만, 인터페이스란, 클래스에 포함되는 메소드의 구체적인 처리 내용을 기술하지 않고, 변수와 메소드의 형태만을 정의한 것입니다.
public interface IMultiFunction {
  public void print();

  public void scan();

  public void fax();
}

각 클래스에 이 인터페이스를 구현하면 다음과 같습니다.
public class MultiDevice implements IMultiFunction {
  public void print() {
    // 印刷処理
  }

  public void scan() {
    // スキャン処理
  }

  public void fax() {
    // FAX送信処理
  }
}

public class PrinterScanner implements IMultiFunction {
  public void print() {
    // 印刷処理
  }

  public void scan() {
    // スキャン処理
  }

  public void fax() {

  }
}

public class Printer implements IMultiFunction {
  public void print() {
    // 印刷処理
  }

  public void scan() {

  }

  public void fax() {

  }
}

이것은 좋은 구현입니다.
왜냐하면 PrinterScanner 클래스나 Printer 클래스를 보면, 구현한 인터페이스에 대해서, 사용하지 않는 메소드(빈 메서드)가 존재해 버리고 있기 때문입니다.

예를 들어, 누군가가 Printer 클래스의 메소드 이름만을 보고, 팩스 기능이 있다고 착각해 사용하려고 한다고 하는 문제가 발생합니다.


해결 방법: 인터페이스 분리



위의 문제를 해결하는 방법은 인터페이스를 분리하는 것입니다.
다음과 같이 기능별로 인터페이스를 제공합니다.
public interface IPrint {
  public void print();
}

public interface IScan {
  public void scan();
}

public interface IFax {
  public void fax();
}

인터페이스를 나누어 주는 것으로, 존재하는 기능에 관한 인터페이스만을 클래스에 구현시킬 수가 있습니다.
public class MultiDevice implements IPrint, IScan, IFax {
  public void print() {
    // 印刷処理
  }

  public void scan() {
    // スキャン処理
  }

  public void fax() {
    // FAX送信処理
  }
}

public class PrinterScanner implements IPrint, IScan {
  public void print() {
    // 印刷処理
  }

  public void scan() {
    // スキャン処理
  }
}

public class Printer implements IPrint {
  public void print() {
    // 印刷処理
  }
}

이제 처리 내용이 비어 있는 메소드를 작성할 필요가 없습니다.

단일 책임의 원칙을 의식하면 인터페이스를 분리할 수 있다



인터페이스를 분리하는 방법은 인터페이스의 응집도를 높이는 것입니다.
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ① ~단일 책임의 원칙~ 하지만 설명하고 있습니다만, 요점은 비슷한 성질의 메소드로 인터페이스를 만들어 봅시다! 그렇군요.

결론



메소드를 담은 큰 인터페이스를 만들면 어딘가에서 먼지가 나오는 것을 알았습니다. 가로 없이 인터페이스를 분리합시다.

참고서적・동영상



Crean Architecture Robert.C.Martin
SOLID Principles: Introducing Software Architecture & Design Sujith George

좋은 웹페이지 즐겨찾기