ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Interface Segregation Principle
    python/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

    댓글

Designed by Tistory.