참조 유형 인 속성이있는 객체에 대해 C#에서 빌더를 어떻게 작성합니까?

StackOverflow https://stackoverflow.com/questions/1402975

문제

작성중인 단위 테스트에 대한 테스트 데이터를 쉽게 만들 수 있도록 빌더를 구성하기 시작했습니다.

빌더의 기본 구조는 다음과 같습니다.

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

이 패턴의 사용은 다음과 같습니다.

MyClass mc = new MyClassBuilder().WithId(5).Build();

나는 그것에 대해 편안하지만 ... 질문이있는 곳은 언제입니다 MyClass 사소한 속성이 있습니다 .... 나는 기본값으로 그것을 구성하는 방법에 대해 조금 확실하지 않습니다.

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //do I construct the default value using a MySecondClassBuilder?
    public MySecondClass mySecondClass;

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClassBuilder WithMySecondClass(MySecondClass mySecondClass)
    {
        this.mySecondClass = mySecondClass;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

내 가정은 내가 빌더를 만들 겠다는 것입니다. MySecondClass 이를 사용하여 기본 구현을 만듭니다.

내 가정이 정확하고 모범 사례임을 확인할 수 있습니까?

나는 현재 내 가정을 테스트하는 과정에 있지만 Google을 사용하여 찾을 수있는 건축업자 패턴의 유일한 예는 참조 유형이 아닌 값 유형 인 속성만으로 찾을 수있는 빌더 패턴의 유일한 예 이후 StackoverFlow 에이 아이디어를 문서화 할 것이라고 생각했습니다.

도움이 되었습니까?

해결책

대부분의 것들과 마찬가지로 - 그것은 달라집니다.

MySecondclass 필드에서 참조 의미를 원한다면 (예 : 다른 클래스에 대한 참조를 저장하려면) 정수와 똑같습니다. 기본값을 null로 만드는 것은 완벽하게 허용 될 수 있습니다.

그러나 항상 값을 보장하려면 두 번째 클래스를 위해 새 개체를 구축하거나 구성해야합니다.

또한 참조 사본 대신 복제를 원한다면 새 개체를 구성하여 참조에 할당해야합니다.

즉, 많은 경우 전통적인 생성자는 유창한 빌드 스타일 인터페이스를 시도하는 것보다 더 적합합니다. 전통적인 생성자보다 사용자에게 더 의존하기 때문에 이와 같은 구축을위한 유창한 인터페이스를 "엉망"하는 것은 정말 쉽습니다.

예를 들어, 코드에서 사용자가 빌드를 호출하지 않으면 어떻게됩니까? 여전히 무언가를 반환하고 있습니다 (각 방법이 객체를 반환하기 때문에) 유효합니까? 나는 당신의 수업의 소비자로서 확신하지 못할 것입니다. 반면에 오버로드가있는 전통적인 생성자는 유효한 내용과 유효하지 않은 것을 정확하게 보여주고 컴파일 타임이 시행됩니다.

다른 팁

더미가 단위 테스트에서 사용하기를 원하는 복잡한 물체가 있으면 일반적으로 조롱/가짜/격리 프레임 워크로 전환 할 것입니다. C#에서는 내가 선호하는 것이 MoQ이지만 Rhino Mocks, TypeMock 등과 같은 몇 가지가 있습니다.

이점은 일반적으로 기본 값과 빈 개체가있는 원래 유형에 존재하는 모든 속성을 스텁 할 수있는 기능이 있다는 것입니다. 동시에 테스트에 중요한 특성의 값에 대해 원하는 값을 반환하기 위해 객체를 쉽게 구성 할 수 있습니다. 또한, 대부분의 이러한 프레임 워크는 재귀 적으로 가짜를 지원하므로 유형 내부의 복잡한 물체도 가짜 등이됩니다.

별도의 프레임 워크를 사용하고 싶지 않은 이유가 있습니다.이 경우 Reed Copsey의 제안은 수동적 인 방법이라고 생각합니다.

조롱 프레임 워크 추가를 피할 이유가 없다면 (테스트를 분할한다고 가정 할 때 테스트 프로젝트에만 의존하는 경우) 복잡한 유형에 대해 진심으로 권장합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top