2009-12-24 4 views
12

테스트 가능한 C# 코드를 작성하기 위해 DI를 많이 사용합니다.동적 언어에 의존성 주입이 필요합니까?

그러나 최근에는 IronPython을 사용하고 있는데 어떤 메소드/클래스/함수 등을 조롱 할 수있는 것처럼 ... DI가 필요하다는 점을 알고 있습니다.

파이썬과 같은 동적 언어 학자의 경우입니까?

class Person(Address) { 
... 

당신은 할 수 있습니다 : 대신

동적 언어의

class Person() { 
... 
    // Address initialised in here. 

따라서 동적 langagues에 대한 manaual DI 다음은 간단하게 필요하지 않습니다.

이것에 대한 조언이 필요하십니까?

+0

유지 .. http://stackoverflow.com/questions/2273683/why-are-ioc-containers- 불필요한 동적 언어/2308494 # 2308494 –

답변

10

의존성 주입은 어떻게 사물을 연결하는지에 대한 것입니다. 의존성 객체의 모의 가능성에 대해서는 아무런 관련이 없습니다. 종류 직접 인스턴스화 Bar - 연결 일부 의를 필요로하는 Foo -instance을 가지고 있으며 가 연결 한 것이 을 가지고 같은 것을를 얻을 방법이 완전히 무시 가진 차이가있다.

종속성 주입을 사용하는 경우 은 더 나은 테스트 가능성을 얻습니다. 그러나 그 반대는 사실이 아닙니다. 아무 것도 덮어 쓸 수있게 됨으로써 쉽게 테스트 할 수 있다는 것은 의존성 주입의 다른 장점을 가져 오지 않습니다. 이러한 이유로 Python을위한 많은 컴포넌트/DI 프레임 워크가 제공됩니다.

+1

의존성 주입의 "다른 장점"은 무엇입니까? – asmaier

-2

저는 여러분이 모범 사례에 관한 것 같지만 실제로는 런타임 성능에 관한 질문을 제시한다고 생각합니다.

의존성 주입을 제거 하시겠습니까? 밤에는 소프트웨어 릴리스 관리자가 어떻게 잠을 자나요?

수행 할 기능에 대한 테스트는 프로그램을 한두 번 늦춰야합니다.

// my generic function entry point - IronPython 
if func="a": 
    ... 
if func="b": 
    ... 
if func="c": 
    ... 

표준 Python을 클래스와 함께 사용하거나 함수 포인터를 함수 포인터 멤버에 할당 할 수 있습니다. 그냥 짐승이 어떤 종류인지 ... ?? 내가 알지. 파이썬 생각하기는 어렵지만 생각합니다. 그리고 나는 의존성 주입을 좋아하고 생각합니다. 오랫동안 연습에 긴 이름을 할당 할 생각이었습니다.

+1

이것을 읽으면 혼란 스러웠습니다. –

9

동적 유형 언어에서 종속성 삽입이 필요 없다는 귀하의 주장에 동의하지 않습니다. DI가 유용하고 필요한 이유는 언어의 타이핑 규율과는 완전히 독립적입니다.

가장 큰 차이점은 동적 유형 지정 언어의 DI는 쉽고 간단하다는 것입니다. 중량이 많은 프레임 워크와 엄청난 양의 XML 구성이 필요하지 않습니다.

예를 들어 루비에서는 DI 프레임 워크가 두 개뿐입니다. 둘 다 Java 프로그래머가 작성했습니다. 두 프레임 워크 중 어느 것도 프로젝트에서 사용되지 않습니다. 이러한 프레임 워크 중 작성자조차도 아닙니다.

그러나 DI는 Ruby의 모든 곳에서 사용됩니다. 그 프레임 워크의 모두의 저자이다

Jamis 벅, 그는 그 프레임 워크를 작성하는 방법과 이유에 대해 RubyConf 2008에서 Recovering from Enterprise라는 이야기를주고 그보고 가치가 나쁜 생각을 왜. ("Ruby"라고 할 때마다 "Python"을 대체하면 모든 것이 유효합니다.)

+2

"gazillion"은 과장이 아닙니까? 나는 C#에서 DI를 많이 사용하며 XML 구성은 거의 사용하지 않습니다. – Darren

+1

예, 가장 명확하게 과장입니다. 또한 post-.NET2 및 post-Java5 DI 프레임 워크는 XML 대신 속성/주석을 사용하는 경향이 있기 때문에 구식입니다. 기본 아이디어는 다음과 같습니다. Java 나 C#으로 동적으로 연결하는 것은 어렵습니다. 그렇기 때문에 DI 프레임 워크를 사용하는 것이 타당합니다. XML 파싱이나 주석/속성 처리는 신경 쓰지 않습니다. 그래서 다른 사람들이 그 일을하고, 그런 일을 즐기게합니다. 그러나 파이썬이나 루비에서는 모든 것이 항상 동적으로 유선 화됩니다. * 어쨌든 *. * 언어 * 자체는 이미 DI 프레임 워크입니다. 다른 것을 위에 올려 놓을 필요가 없습니다. –

+2

그것에 대해 생각해 볼 또 다른 방법 : DI 프레임 워크는 무엇을합니까? 그것은 독립적 인 구성 요소를 함께 붙입니다. 그리고 우리는 일반적으로 독립적 인 구성 요소를 함께 붙이는 것을 무엇이라고합니까? 스크립팅! 그리고 어떻게해야 할 것인가가 결정됩니다. XML 파일 또는 주석 집합을 읽습니다. 그리고 우리는 보통 것들을 함께 붙일 방법을 알려주는 일련의 지시를 무엇이라고 부릅니까? 스크립트! 그리고 그 명령을 실행하는 것은 스크립트 인터프리터입니다. 따라서 DI 프레임 워크는 스크립팅 언어 (일반적으로 꽤 엉터리, 특히 XML을 사용할 때)에 대한 해석기 일뿐입니다. 그러나 파이썬에서 우리는 이미 그것을 가지고 있습니다 : 파이썬! –

0

다시 시도해 보겠습니다. 나의 마지막 대답은 한 마디로 질문을 놓쳤다. 의사 코드를 사용

, 의존성 주입 함께 말한다 :

class Person 
    def Chat() { 
    someOperation("X","Y","Z") 
    end 
end 
... 
Person.new().Chat() 

과에와 :

class Person 
    initialize(a,b,c) 
    @a=a 
    @b=b 
    @c=c 
    end 
    def Chat() 
    someOperation(@a,@b,@c) 
    end 
end 
... 
Person.new("X","Y","Z").Chat() 

, 일반적으로 객체와 다른 파일에 전화를 넣어와. SCM 목적.

"X", "Y"또는 "Z"가 조롱 할 수 있는지 여부 (... 대신 객체 ... (!) ... (!) ...)와 아무 관계가 없습니다. DI가 좋은지. 정말. :-)

DI는 다른 많은 작업과 마찬가지로 Python이나 Ruby에서 훨씬 쉽습니다. Jörg가 말한 것처럼 스크립팅 방식이 더 많기 때문입니다. 또한 문화와 모델 및 상수로 상수와 어댑터가 채워지는 경향이 적습니다.

실용적인면에서 DI는 이러한 응용 프로그램 매개 변수, API 상수 및 팩토리를 개별 파일로 분리하는 첫 번째 단계로, 리비전 추적 보고서가 스파게티처럼 보이지 않게 만드는 데 도움이됩니다 ("AppController의 추가 체크 인은 구성을 변경하십시오 .. 아니면 코드를 업데이트 하시겠습니까 ...? ") 더 많은 정보를 제공하고 더 쉽게 읽을 수 있습니다.

나의 추천 :이 질문의 중복 것 같다 :-) ... DI를 사용