python/SOLID
Interface Segregation Principle
wefree
2023. 12. 6. 23:20
정의
No client should be forced to depend on methods it does not use
위반코드
from abc import ABC, abstractmethod
class Phone(ABC):
@abstractmethod
def call(self, number):
pass
@abstractmethod
def swipe_to_unlock(self):
pass
class IPhone(Phone):
def call(self, number):
print(f"Calling Number: {number} from iPhone")
def swipe_to_unlock(self):
print("iPhone is unlocked")
- Phone interface 는 전화(call) 와 잠금 해제 (swipe_to_unlock) 두가지 기능이 있다.
위와 같은 상황에서 잠금 해제 기능이 없는 Nokia2720 피쳐폰을 Phone 인터페이스를 이용해 추가하려고 한다. Phone 인터페이스는 Nokia2720 피쳐폰에 까지 swipe_to_unlock() 기능을 강제하고 있는데, 이경우 어떻게 구현하지?
class Nokia2720(Phone):
def call(self, number):
print(f"Calling Number: {number} from Nokia2720")
def swipe_to_unlock(self):
raise NotImplementedError("Nokia2720 has no touch screen")
잘해봐야 위와 같이 구현하는 정도일텐데, Phone 인터페이스가 사용되는 코드에서는 Nokia2720 인지 체크해 따로 처리해야 하는 문제가 있다.
개선 코드
전화(call) 와 잠금 해제 (swipe_to_unlock) 두가지 기능을 분리해 인터페이스를 만들도록 한다.
from abc import ABC, abstractmethod
class Phonecall(ABC):
@abstractmethod
def call(self, number):
pass
class Touch(ABC):
@abstractmethod
def swipe_to_unlock(self):
pass
class IPhone(Phonecall, Touch):
def call(self, number):
print(f"Calling Number: {number} from iPhone")
def swipe_to_unlock(self):
print("iPhone is unlocked")
class Nokia2720(Phonecall):
def call(self, number):
print(f"Calling Number: {number} from Nokia2720")
이제 Nokia2720 는 인터페이스 때문에 불필요한 swipe_to_unlock() 구현 강제에서 벗어났다.
참고: https://www.udemy.com/course/solid-design-principles-with-python