출처 :https://www.pythontutorial.net/python-oop/python-interface-segregation-principle/
Introduction to the interface segregation principle
SOLID는 Uncle Bob에 의한 5 가지 소프트웨어 디자인 원칙을 나타내는 약어입니다.
- S – Single responsibility Principle
- O – Open-closed Principle
- L – Liskov Substitution Principle
- I – Interface Segregation Principle
- D – Dependency Inversion Principle
인터페이스는 개체가 수행할 수 있는 동작에 대한 설명입니다. 예를 들어, TV 리모컨의 전원 버튼을 누르면 TV가 켜지므로 사용 방법에 대해 신경 쓸 필요가 없습니다.
객체 지향 프로그래밍에서 인터페이스는 객체가 반드시 가져야 하는 메서드 집합입니다. 인터페이스의 목적은 클라이언트가 인터페이스를 통해 개체의 올바른 메서드를 요청할 수 있도록하는 것입니다.
파이썬은 소위 duck typing principle(오리 타이핑 원칙)을 따르기 때문에 추상 클래스를 인터페이스로 사용합니다. 오리 타이핑 원칙은 "오리처럼 걷고 오리처럼 꽥꽥 거리면 오리여야합니다"라고 말합니다. 즉, 클래스의 메서드는 클래스의 형식이 아니라 객체가 무엇인지 결정합니다.
인터페이스 분리 원칙은 인터페이스가 응집력 측면에서 가능한 한 작아야 한다고 명시합니다. 즉, 한 가지 일을해야합니다.
인터페이스에 하나의 메서드가 있어야한다는 의미는 아닙니다. 인터페이스는여러 응집력있는 방법을 가질 수 있습니다.
예를 들어, 데이터베이스 인터페이스는 connect() 및 disconnect() 메서드를 함께 사용해야 하므로 둘 일 수 있습니다. 데이터베이스 인터페이스가 두 가지 방법을 모두 사용하지 않으면 불완전합니다.
SOLID 용어의 창시자인 Uncle Bob은 "클라이언트에 따라 지정된 인터페이스를 만드십시오. 클라이언트는 사용하지 않는 인터페이스를 구현하도록 강요받지 말아야 한다"
Interface segregation principle example
다음 예제를 고려하십시오.
먼저 두 개의 추상 메서드인 go()와 fly()가 있는 Vehicle 추상 클래스를 정의합니다.
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def go(self):
pass
@abstractmethod
def fly(self):
pass
둘째, Vehicle 클래스에서 상속되는 Aircraft 클래스를 정의하고 go() 및 fly() 메서드를 모두 구현 합니다.
class Aircraft(Vehicle):
def go(self):
print("Taxiing")
def fly(self):
print("Flying")
셋째, Vehicle 클래스에서 상속되는 Car 클래스를 정의합니다 . 자동차는 날 수 없기 때문에 fly() 메서드에서 예외를 발생시킵니다.
class Car(Vehicle):
def go(self):
print("Going")
def fly(self):
raise Exception('The car cannot fly')
이 디자인에서 Car 클래스는 Car 클래스가 사용하지 않는 Vehicle 클래스에서 fly() 메서드를 구현해야 합니다 . 따라서 이 디자인은 인터페이스 분리 원칙을 위반합니다.
이 문제를 해결하려면 Vehicle 클래스를 작은 클래스로 분할하고 Aircraft 및 Car 클래스에서 이러한 클래스를 상속해야 합니다.
먼저 Vehicle 인터페이스를 두 개의 작은 인터페이스( Movable 및 Flyable)로 분할하고 Flyable 클래스에서 Movable 클래스를 상속합니다.
class Movable(ABC):
@abstractmethod
def go(self):
pass
class Flyable(Movable):
@abstractmethod
def fly(self):
pass
둘째, Aircraft 클래스는 Flyable 클래스를 상속됩니다.
class Aircraft(Flyable):
def go(self):
print("Taxiing")
def fly(self):
print("Flying")
셋째, Car 클래스는 Movable 클래스를 상속합니다.
class Car(Movable):
def go(self):
print("Going")
이 디자인에서 Car는 필요한 go() 메서드만 구현하면 됩니다. 사용하지 않는 fly() 메서드를 구현할 필요가 없습니다.
Summary
- 인터페이스 분리 원칙은 인터페이스가 응집력 측면에서 작아야 한다고 조언합니다.
- 클라이언트별 지정된 인터페이스를 만듭니다. 클라이언트는 사용하지 않는 인터페이스를 구현하도록 강요해서는 안 됩니다.
'Python Object-oriented Programming' 카테고리의 다른 글
descriptors (0) | 2023.04.04 |
---|---|
Multiple inheritance (0) | 2023.04.04 |
Liskov Substitution Principle (0) | 2023.04.04 |
Open-closed Principle (0) | 2023.04.04 |
Single Responsibility Principle (0) | 2023.04.04 |
댓글