1 minute read


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_reportpresenter에 대한 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