Pythhon3에서 학습한 SOLID 원칙~의존적 반전의 원칙~

8677 단어 solid 원칙tech
이번에는 SOLID 원칙에 대한'의존적 반전 원칙'이다.
송이경(신지현): 미안한데, 이번이 처음이야... 나 자신을 정리하기 위해서라도 정리하고 싶어서)

개요

  • 소프트웨어 개발자 로버트 C.Martin이 2000년논문에 발표한 디자인 사상을 바탕으로 한다.
  • 로버트 C. Martin은 유명한 프로그래머이자 클린 시리즈 서적의 저자(거리마다 밥 아저씨라고 부른다)
  • 다음은 다섯 가지 원칙의 머리글자를 따서 SOLID(고체상태) 원칙이라고 한다.이것은 프로그램의 확장성, 유지보수성, 가독성을 높이기 위해 만들어진 것이다.
  • 단일 책임 원칙(Single Responsibility Principle)
  • 개방폐쇄원칙(Open/Closed Principle)*개방폐쇄원칙이라고도 부른다.
  • 다람쥐의 치환원칙(Liskov Substition Principle)
  • 인터페이스 분리 원칙(Interface Segregation Principle)
  • 의존적 반전의 원칙(Dependency Inversion Principle)
  • 의존성 역전의 원칙(Dependency Inversion Principle)


    한마디로 추상류(인터페이스가 있는 류)에 의존해야 하며, 추상류를 계승한 류(상세류)에 의존해서는 안 된다.의존 관계를 역전시키지 마라.
    아래Wikipedia에서 인용하다.
    대상 방향에서의 전통적인 의존 관계는 상부 모듈에서 하급 모듈로의 방향성이며, 규범>의를 담당하는 상부 모듈과 상세한 실시를 담당하는 하급 모듈을 독립시키고 각 하급 모듈을 각각 저장한다>이에 비해 의존성 역전 원칙은 다음과 같은 두 가지를 제창한다.
    어떤 상급 모듈도 하급 모듈에서 가져올 수 없다.둘 다 추상적(예를 들어 인터페이스)에 의존해야 한다.
    "High-level modules should not import anything from low-level modules. Both >should depend on abstractions (e.g., interfaces)."[3]
    추상은 세부 사항에 의존해서는 안 된다.세부 사항(구체적 실시 내용)은 추상에 의존해야 한다.
    "Abstractions should not depend on details. Details (concrete >implementations) should depend on abstractions."[3]

    보호하면 뭐가 좋아요?

  • 기능 확장이 쉬워졌습니다.
  • 코드로 설명(Python 3)


    우선 의존성 반전 원칙에 부합되지 않는 코드를 쓴다.
    현재는 점포급(Store), 식품점급(GgroceryStore), 손님급(Customer)이 있다.
    class Store:
        def __init__(self, item):
            self.item = item
    
    class GgroceryStore:
        def sell(self, store: Store):
            print('{}を売る'.format(store.item))
    
    class Customer:
        def shopping(self, store: Store):
            grocery = GgroceryStore()
            grocery.sell(store)
    
    store = Store('ジャガイモ')
    customer = Customer()
    customer.shopping(store)
    
    식품점 등급은 점포 등급에 의존하지만 점포 등급은 추상적인 등급이 아니라 실제 상황 등급(상세한 등급)이다.
    또 식료품점 반을 객류로 다니다 보니 관계가 복잡하다.

    의존성 역전의 원칙을 준수하다


    from abc import ABCMeta,abstractclassmethod
    
    class Store(metaclass=ABCMeta):
        @abstractclassmethod
        def sell(self):
            pass
    
    class GgroceryStore(Store):
        def __init__(self,item):
            self.item = item
    
        def sell(self):
            print('店は{}を売る'.format(self.item))
    
    class Customer(metaclass=ABCMeta):
        @abstractclassmethod
        def shopping(self):
            pass
    
    class CustomerA(Customer):
        def __init__(self, store:Store):
            self.store = store
    
        def shopping(self):
            self.store.sell()
    
    grocery_store = GgroceryStore('ジャガイモ')
    customer = CustomerA(grocery_store)
    customer.shopping()
    
    점포급(Store)을 추상적인 등급으로 변경하고 계승한다.따라서 디테일류는 추상류에 의존한다.추상류(인터페이스 의존)에 의존하면 식품 이외의 가게가 늘어나도 클래스만 추가할 수 있다.

    좋은 웹페이지 즐겨찾기