소프트웨어에 대한 모든 것

[디자인패턴][SOLID] 인터페이스 분리 원칙 본문

시스템 설계 및 디자인/객체지향 SOLID

[디자인패턴][SOLID] 인터페이스 분리 원칙

앤테바 2022. 3. 23. 20:00
반응형

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

OOP에서 인터페이스는 object가 반드시 가져하는 methods의 집합입니다. 파이썬은 abstract classes를 인터페이스로 사용합니다. 인터페이스 분리 원칙에 따르면 인터페이스는 가능한 작게 만들며 한 가지만 수행해야 합니다.

인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜서 리팩토링, 수정, 재배포를 쉽게 할 수 있습니다.

 

인터페이스 분리 원칙 예제

운송수단 aircraft, car 클래스가 있다고 합시다.

이 둘의 추상 클래스 vehicle를 만듭니다.

from abc import ABC, abstractmethod


class Vehicle(ABC):
    @abstractmethod
    def go(self):
        pass

    @abstractmethod
    def fly(self):
        pass


class Aircraft(Vehicle):
    def go(self):
        print('Taxiing')

    def fly(self):
        print('Flying')


class Car(Vehicle):
    def go(self):
        print('Going')

    def fly(self):
        raise Exception('not supported')

위 디자인의 문제는 Car 클래스는 Vehicle 클래스를 상속 받았기 때문에 fly() 메소드를 반드시 구현해야 합니다. fly() 메소드는 Car에게 전혀 필요가 없습니다. 그렇기 때문에 이 디자이는 인터페이스 분리 원칙을 위반하였습니다.

 

인터페이스 분리 원칙을 지키기 위해서 Vehicle 클래스를 작은 작은 클래스로 나누고 이를 Aircraft와 Car 클래스에서 상속 받도록 디자인을 변경하겠습니다.

 

from abc import ABC, abstractmethod


class Movable(ABC):
    @abstractmethod
    def go(self):
        pass
    
    
class Flyable(Movable):
    @abstractmethod
    def fly(self):
        pass


class Aircraft(Flyable):
    def go(self):
        print('Taxiing')

    def fly(self):
        print('Flying')


class Car(Movable):
    def go(self):
        print('Going')

위 디자인에서 Car 클래스는 go() 함수만 구현하면 됩니다. 불필요한 fly()는 더 이상 사용하지도 않습니다.

요약

  • 인터페이스는 최대한 작게
  • 클라이언트별로 세분하된 인터페이스를 만들고, 클라이언트가 사용하지 않는 인터페이스를 강제로 구현하면 안 됨

참고 자료:

Python Interface Segregation Principle

반응형
Comments