Pythhon3에서 학습한 SOLID 원칙~의존적 반전의 원칙~
송이경(신지현): 미안한데, 이번이 처음이야... 나 자신을 정리하기 위해서라도 정리하고 싶어서)
개요
의존성 역전의 원칙(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)을 추상적인 등급으로 변경하고 계승한다.따라서 디테일류는 추상류에 의존한다.추상류(인터페이스 의존)에 의존하면 식품 이외의 가게가 늘어나도 클래스만 추가할 수 있다.
Reference
이 문제에 관하여(Pythhon3에서 학습한 SOLID 원칙~의존적 반전의 원칙~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kalman/articles/cbaedb57862501텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)