-
Interface Segregation Principlepython/SOLID 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
'python > SOLID' 카테고리의 다른 글
Dependency Inversion Principle (0) 2023.12.06 Liskov Substitution Principle (0) 2023.12.06 Open-closed Principle (1) 2023.12.06 Single Responsibility Principle (0) 2023.12.05