2010-12-02 5 views
2

이 두 가지 방법 모두 저에게 효과적이지만 "권장 사항"의 관점에서 권장 사항이 무엇인지 확신 할 수 없습니다.무거운 생성자 또는 방법을 사용하십시오

내 라이브러리에서 다양한 제어 기능을 수행하는 클래스가 있으므로 모든 종류의 객체 및 속성을 초기화해야합니다.

이 논리를 모든 클래스의 생성자에 넣어도 괜찮습니까? 아니면 "초기화"메서드에 넣어야합니까?

public MyClass() 
{ 
    mSubObjectA = new mSubObjectA(); 
    mSubObjectA.DoStuff(); 
    mSubObjectA.DoMoreStuff(); 

    mSubObjectB = new mSubObjectB(); 
    mSubObjectC = new mSubObjectC(); 

    if (something) 
    { 
     DoStuff(); 
    } 
    else 
    { 
     MagicHappens(); 
    } 
} 

답변

0

얼마나 많은 생성자가 있다고 생각 하느냐에 달려 있습니다. 코드를 반복하지 마십시오. 이 모든 단계가 하나의 생성자에서만 발생하면 문제가되지 않습니다. 좀 더 멋진 작업을 원할 경우 코드를 지능적으로 정렬하십시오.

+0

팩토리 토론이 가장 유용했기 때문에 어떤 대답을 받아 들일지 확실하지 않았지만, 실제로이 경우에 사용하지는 않았지만 코드를 더 잘 배열 했으므로 이것이 맞는 것 같습니다. :) – Cylindric

1

모두에 대한 대안이는 - factory 클래스 또는 factory method를 사용합니다.

복잡한 객체 그래프를 만드는 것은 공장 패턴이 무엇인가하는 것입니다. 상황에 매우 적합한 것처럼 들립니다.

6

개인적으로 나는 그것을받을 때까지 완전히 작동 할 수있는 물건을 좋아합니다. 반면에, 생성자 에서 많은 작업을 수행하면 냄새가 다소 나옵니다.

하나의 대안은 정적 팩토리 메소드 (또는 팩토리 클래스 *) 생성자를 호출 전에 에 필요한 모든 작업을 수행 한 다음 생성자 자체가 매우 간단 할 수 있습니다 작성하는 것입니다. 요구 사항에 따라 단순 생성자를 노출할지 여부를 선택할 수 있습니다.

* 팩토리 클래스는 더 나은 테스트 용이성 있도록, 잠재적 다른 공장 구현을 가능하게 할 수 있습니다. 반면에, 그 시점에서 꽤 많은 양의 추상화가 발생합니다. 이는 혼란 스러울 수 있습니다.

+0

테스트 가능성은 정확히 어디에서 왔는가입니다. NUnit으로 시작했고 테스트를 위해 모든 부분을 분리하는 데 문제가있었습니다. 그다지 냄새가 나지 않으면 무슨 일이 일어날 지 모릅니다! 현재 수업을 진행하기 전에 많은 것들이 설정되어야합니다. – Cylindric

+0

@Cylindric : 부분적으로 누가 그 설정을 담당했는지에 달려 있습니다. 그게 그 수업이되어야합니까? 설치 부분에 액세스 할 수 있어야합니까? –

+0

@Jon Skeet 팩토리 클래스 100 %에 동의하지만, 추가 추상화가 산만 해지면 좋은 일이 될 수 있습니다. 그 이유는 뭔가 새로운 '새로운 것'이외의 일이 발생한다는 것을 알게하기 때문입니다. 우리는 일하는 곳에서 꽤 많은 CSLA를 사용합니다. 인스턴스 작성 중에 많은 일들이 진행되며 새로운 것을 부를 수는 없습니다. – msarchet

관련 문제