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