2013-06-22 3 views
0

의 우리는 다음과 같은 클래스를 가지고, 가정하자 :필드를 읽기 전용으로 유지하는 방법은 무엇입니까?

class C 
{ 
    private readonly DataType data; 
    private readonly AdditionalType additional; 

    C(DataType newData) 
    { 
     data = newData; 
     // LONG code evaluating additional 
    } 

    C(OtherType newData) 
    { 
     // eval data from newData 
     // the same LONG code evaluating additional 
    } 
} 

모두 dataadditional 코드 냄새가있다, 그러나 C의 전체 인생을 그대로 유지 : 섹션이 모두 생성자에 두 배가됩니다 additional을 평가.

class C 
{ 
    private readonly DataType data; 
    private readonly AdditionalType additional; 

    private void EvalAdditional() 
    { 
     // LONG code evaluating additional 
    } 

    C(DataType newData) 
    { 
     data = newData; 
     EvalAdditional(); 
    } 

    C(OtherType newData) 
    { 
     // eval data from newData 
     EvalAdditional(); 
    } 
} 

그러나 (이 ctor에 초기화되지 beacuse)를 추가로 더 이상 읽기 전용 수 없다 : 자연 선택은 다른 방법에 압축을 해제 한 후입니다.

이 문제를 어떻게 우아하게 해결할 수 있습니까?

+1

'additional'의 평가는 생성자 인수에 의존합니까? 그렇지 않다면 평가를 다른 개인 생성자로 옮기고 공용 생성자에서 평가를 호출하면됩니다. – Lee

+1

* ... // LONG code ... * 생성자에서 아무 것도 평가하는 것은 그 자체로 코드 냄새입니다. MSDN에서 : 생성자는 생성자 매개 변수를 캡처하는 것 이외의 많은 작업을해서는 안됩니다. 다른 처리 비용은 필요할 때까지 지연되어야합니다. – inquisitive

답변

4

EvalAdditional 메서드는 additional 개체를 반환하십시오 (void 대신).

readonly DataType data; 
readonly AdditionalType additional; 

AdditionalType EvalAdditional() 
{ 
    // LONG code evaluating additional 
    return additional; 
} 

C(DataType newData) 
{ 
    data = newData; 
    additional = EvalAdditional(); 
} 

C(OtherType newData) 
{ 
    // eval data from newData 
    additional = EvalAdditional(); 
} 
2

additional의 평가가 다른 생성자에게 주어진 인수에 의존하지 않는 경우, 당신은 단지 개인 생성자로 이동하고 공개 생성자에서 해당 호출 할 수 있습니다 :

private C() 
{ 
    //long code evaluating additional 
} 

C(DataType newData) 
    : this() 
{ 
    data = newData; 
} 
0

당신은 할 수

C(DataType newData) 
    :this() 
{ 
    data = newData; 
} 

C(OtherType newData) 
    :this() 
{ 
    // eval data from newData 
} 

private C() 
{ 
    EvalAdditional(); 
} 

EvalAdditional이 수행하는 작업에 크게 의존하지만, 필요한 경우 매개 변수를 전달할 수 있습니다.

+0

질문은 '추가'필드를 '읽기 전용'으로 유지하는 방법이었습니다. –