2010-07-12 2 views
1

"year"를 매개 변수로 사용해야하는 DataProvider 클래스 (DAL)가 있습니다. 구성예외 생성 가능 생성자 및 초기화입니다. 모범 사례

using (var provider = new DataProvider(year)) 
{ 
    provider.SomeRepostitory.DoSomethingUsefull(); 
} 

DataProvider를 생성자 코드 거래 - 그래서 예외를 던질 수 있습니다 : 그것은 다음과 같이 사용된다. 예외 생성 가능 생성자는 권장되지 않습니다. 그래서 초기화 방법을 추가하고이 모든 던질 수있는 코드를 넣어 :

var provider = new DataProvider(); 
provider.Init(year); 

하지만 지금은 하나가 아닌 및 공급자가 코드에 걸쳐 여러 번 생성으로, 내가 직물 정적 방법으로이 두 줄을 넣어 두 줄의 코드가를 :

using (var provider = DataProvider.Create(year)) 
{ 
    ... 
} 

괜찮습니까? 아니면 더 좋은 해결책이 있습니까?

미리 감사드립니다.

답변

4

DataProvider 생성자는 구성으로 코드를 처리하므로 예외가 발생할 수 있습니다. 그리고 예외 throwable 생성자는 권장되지 않습니다.

왜 "권장하지 않는"이유가 무엇입니까? Microsoft 기본 클래스 라이브러리를 살펴보면 모든 단일 생성자가 전달 된 인수를 확인하고 인수가 유효하지 않은 경우 일종의 인수 예외를 throw합니다. 왜 당신은 누군가가 무의미한 상태의 객체를 그들에게 말하지 않고 인스턴스화하게할까요? 일찍 실패하고, 열심히 실패하십시오.

예외를 throw하는 생성자는 별도의 초기화 메서드 (개인적으로 2 단계 초기화를 싫어하므로 두 번째 호출을 잊어 버리기 쉽습니다)를 사용해야하는 것보다 프로그램하기에 훨씬 좋은 API입니다. 그것을 피할 강력한 이유가 없다면, 나는 단지 생성자에서 검사를 할 것입니다.

정적 팩토리 메서드를 사용하려는 경우 (느슨하게 결합해야하는 경우를 제외하고는 아무 것도 잘못하지 않음) 기본 생성자가 비공개인지 확인하여 사용자가 적절한 팩토리 메서드를 사용해야합니다.

2

개체에 초기화를하는 팩토리 메서드를 사용하는 것이 합리적이라고 생각합니다. 초기화하지 않고 객체를 사용하지 않으려면 클래스 내의 정적 메소드 만 생성자를 호출 할 수 있도록 생성자를 private (또는 protected)로 만듭니다.

0

호출을 함께 연결하려면 Init 메서드가 this을 반환 할 수 있습니다. 마찬가지로 : 당신이 .Init() 전화를이 경우

var provider = new DataProvider().Init(year); 

그러나, 다음 팩토리 메소드 스타일이 더 도움이 될 수 있습니다.

0

게으른 인스턴스화로 벗어날 수 있습니까? 생성 할 때 전달하지만 실제로 사용되기 전까지는 초기화하지 마십시오. 이렇게하면 예외가 건설보다는 첫 번째 호출로 이동하지만 요구 사항을 충족하는 것으로 보입니다.

+0

즉, "작업자"방법을 사용할 때마다 잠재적 인 예외를 잡아야한다는 것을 의미합니다. 이는 상당히 오버 헤드가 될 수 있습니다. 또한 메서드에 대한 첫 번째 호출이 좋은 API 디자인과 상반되는 나머지만큼 예측할 수 없다는 것을 의미합니다. –