2011-10-14 3 views
5

나는 다양한 초기화 작업을 수행하는 오랜 시간이 걸리는 생성자를 가지고 있기 때문에이 작업 중 일부를 일부 기능으로 제외하려고합니다. 이 말은 저에게 함수 인스턴스 나 정적 메소드를 만들어야하는지 궁금합니다. 생성자에서 가상 함수를 호출하는 위험을 이해하지만 100 % 인스턴스화되지 않은 객체에 인스턴스 메서드를 호출하는 것이 옳지 않다고 생각합니다. 분명히 이것은 모순이다.C#의 생성자에서 인스턴스 메서드 호출하기

나는이 문제에 대한 국민들의 의견에 관심이있다. 또한 초기화 된 변수를 반환하는 정적 메서드를 사용하여 멤버 대상을 읽기 전용으로 만들 수 있음을 발견했습니다. 여기 내 시나리오를 간략하게 보여줍니다.

public class A 
{ 
    private readonly string _foo; 

    public A() 
    { 
     _foo = InitialiseFoo(); 
    } 

    private static InitialiseFoo() 
    { 
     // Do stuff 
     return new string ("foo"); 
    } 
} 
+1

왜 긴 생성자가 있습니까? 그것이 생성자가되어야하는 방법이 아닙니다. 긴 작업을 수행하는 메소드를 사용해야합니다. 당신이 어떤 API를 소비하려고 할 때 항상 좌절감을 느낍니다. 그리고이 API는 데이터베이스 액세스와 생성자에서 물건을 가져다가 잠재적으로 예외와 물건을 던집니다. 해라. 정말 짜증나. 생성자는 단순해야합니다. –

+0

전적으로 이것에 동의하지만, 먼저 구성 파일에서 서비스 이름을 가져와야하는 Windows 서비스를 코딩하고 있습니다. 그것의 생성자 내에서만 서비스 이름을 설정할 수 있기 때문에 나는 이것에 매달렸다. – user738134

답변

4

이것은 초기화 메소드를 호출하는 생성자에서 인스턴스 메소드를 호출하는 것이 일반적입니다. 그래서 기본적으로 이것은 일종의 Extract Method refactorig로 생성자 메서드 본문을 줄이기 위해 초기화의 일부를 별도의 메서드로 추출하고 생성자는 입력 인수 등을 저장하는 것으로 인식합니다.

static 수정 자 .. 때로는 (믿을 수 없기 때문에 리팩터링 할 수있는 다른 방법이 없다고 생각합니다.) 내 기본 관점에서 결과를 전달하는 메소드를 호출해야합니다.이 경우에는 호출 할 정적으로 표시해야합니다. 다른 경우에는 정적 컨텍스트 만 생성자, BECA에 정적 멤버를 사용하려면 내가 욕망을 이해할 수

public A() 
: base(GetLogger()) 
{ 
} 

private static ILog GetLogger() ... 
+0

+1은 추출 방법을 언급하는데, 이것은 모두 –

1

정적 수정없이 떠나 그것을 사용하면 초기화 된 내용과 그렇지 않은 내용을 추적하지 않고도 코드를 더 간단하게 만들 수 있지만, 불필요하게 복잡한 일을 스스로 할 수 있습니다. C#에서 인스턴스 메소드를 호출하는 것은 합당한 이유가있는 한 괜찮습니다. 예를 들어, 모든 일반적인 작업을 수행하는 여러 생성자가있는 경우 작업을 수행 할 단일 멤버 함수를 만드는 것이 각 생성자의 코드를 복사하여 붙여 넣는 것보다 유지 관리가 쉽습니다. 클래스를 초기화 된 상태로 다시 설정하는 것과 같은 방법으로 생성자 외부에서 메서드를 다시 사용할 수있는 경우를 상상할 수도 있습니다.

정적 메서드는 괜찮지 만 일부 고립 된 작업을 수행하고 결과를 멤버 변수에 넣는 경우에만 작동합니다. 그것은 매우 깨끗하고 기능적인 프로그래밍과 같은 느낌을줍니다. 그러나 클래스 상태를 포함하는 작업이 있으면 추한 것입니다.

+0

입니다.'일반적인 작업을 수행하는 많은 생성자가 있다면'- 보통 MyCTor : this (arg1, arg2)'를 호출하여 이들을 연결하는 것이 더 깔끔합니다. 생성자. – nicodemus13