2010-12-27 4 views
2

쉽게 테스트 할 수있는 코드를 작성하려고합니다. 그 때문에 새로운 Class1()을 직접 호출하지 않아도됩니다. 대신 나는 보통이 인터페이스를 반환하는 GetObject() 메서드가있는 간단한 팩토리 인 인터페이스를 만듭니다.테스트 할 수있는 코드를 작성한 결과로 너무 많은 팩터 리

잘 작동합니다. 내가 발견 한 문제는 새로운 Class1() (또는 생성을 담당하는 클래스/인터페이스)을 호출하는 것을 제외하고는 기본적으로 아무것도하지 못하는 너무 많은 팩토리이다. 나는 그것이 테스트 할 수있는 코드를 가지고 있기 때문에 값을 치르는 데 큰 댓가라고 생각하지 않는다. 그러나 누구든지 더 나은 aproach를 사용하고 여전히 테스트 시간에 Class1의 다른 구현을 주입 할 수 있다는 목표를 달성 할 수 있을까?

속성으로 Class1 구현을 노출 할 수 있고 런타임에 기본값을 사용할 수 있다는 것을 알고 있지만 많은 인스턴스에서 해당 Class1이 필요할 때마다 한 인스턴스로 제한된다는 것을 의미합니다.

편집 :
저는 IoC를 사용합니다. 실제로 도움이됩니다. 그럼에도 불구하고 나는 보통 공장을 IoC 구성에 대한 의존성으로 갖게됩니다. 내 GetObject 메서드는 일반적으로 IoC.Resolve와 같은 것을 호출합니다. 나는 비즈니스 로직을 포함하고있는 도메인 클래스에 직접적으로 의존하지 않고 공장에서 고립 된 IoC 의존성을 선호한다.

+3

IoC 컨테이너가 필요한 것 같습니다. –

+0

@Martinho - 답변을 정교하고 답으로 쓸 수 있습니까? –

답변

2

내가 말하는 언어를 알면 쉽게 될 수 있지만 대부분의 언어에는 제네릭이나 기타의 개념이 있습니다. 그래서 당신은 당신의 공장은 일반적인 하나의 인터페이스 할 수 있습니다 :

Java 버전 :

public interface Factory<K>{ 
    K create(); 
} 

Guava Libraries 정확히이를 위해 Supplier<K> 인터페이스를 가지고있다. 비슷한 준 표준을 사용하는 것이 좋습니다. (다른 언어에서도 이와 유사한 것을 사용할 수 있습니다.)

+0

C#을 사용합니다. 실제로 IoC를 사용하는 제네릭은 갈 길일 수 있습니다. – trendl

3

이 작업을 수행하는 데 도움이되는 많은 프레임 워크가 있습니다. 이 기술은 반전 제어이라고합니다. 닷넷 세계에서 예 :

모든 프레임 워크의 공통점은 구성에 구성 요소 (클래스) 사이의 바인딩을 구체화 할 수있는 기능입니다 이는 구성 파일 (즉, XML) 또는 '부트 스트랩'코드로 표현됩니다. 그들은 자동으로 인스턴스에 종속성을 주입 할 수 있으며 클래스 인스턴스화 및 구성 문제를 대신 수행 할 수 있습니다. 기본적으로이 작업을 IoC 컨테이너에두고 사용자 지정 팩토리 클래스 만들기를 종료 할 수 있습니다.

관련 리소스는 ioc-container입니다.

Martin Fowler는 IoC와 종속성 삽입 및 서비스 위치 지정자와 같은 구현 기술을 설명하는 article을 가지고 있습니다.

관련 문제