log 2022-03-19
blog
arb
python dip 조사
https://stackoverflow.com/questions/31678827/what-is-a-pythonic-way-for-dependency-injection
일단 직접 상속 구현 패턴을 해보면서 확인해 보고 싶다. 관건은, 의존성을 분리할 수 있는가이다. 결국 역전되지 않고 이름을 참조하는 것이 남아 있다면 해당 패턴의 효용성이 떨어진다는 의미다.
class IFinancialReportPresenter:
def get_report(self, data):
raise NotImplementedError()
class FinancialReportController:
def show_report(self, presenter, data):
report = presenter.get_report(data)
print('report loaded, ', report)
class ConsolePresenter(IFinancialReportPresenter):
def get_report(self, data):
print('console presenter called: ', data)
return data
위와 같은 예제에서는, FinancialReportController - show_report
가 presenter
에 대한 type hint를 얻을 수 없다.
좀더 구체적 예제를 생각해 보자.
테스트 가능성도 생각.
view는 데이터 앞뒤 <>
를 추가.
기본 데이터는 dictionary형식
console presenter는 key:val 형식으로 행별로 변경
아래와 같이 typing.Type 사용하면 클래스에 대한 타입 힌트 얻을 수 있다.
## Controller Component
class IFinancialReportPresenter:
def get_report(self, data):
raise NotImplementedError()
class FinancialReportController:
def show_report(self, presenter: Type[IFinancialReportPresenter], data):
report = presenter.get_report(data)
print('report loaded, ', report)
## Presenter Component
class ConsolePresenter(IFinancialReportPresenter):
def get_report(self, data):
print('console presenter called: ', data)
return data
fake 거래소 (시세와 오더북 제공)를 만드는건 어떤가? 굳이 필요없을 가능성이 높긴하다..
단위테스트, fail위치, 통신, 동기화, 로깅, …
현재 구조도는 기능과 통신 기준으로 나타내어져 있는데, clean architecture에 의하면 배포와 유지보수 측면으로 나뉘어야 한다고 한다. 그리고, ca에서는 인터페이스와 구현이 보통 컴포넌트간 경계가 되었다.
그러면, 어떻게 해야 하나?
Comments