2008-10-01 6 views

답변

10

몇 가지 이유가 있습니다이 아니다 일반적으로 좋은 설계로 간주되는데, 그 중 일부는 어려운 단위 테스트와 오류 처리의 어려움과 같은 것이 이미 언급되었습니다.

제가 선택하지 않는 주된 이유는 객체와 데이터 액세스 레이어가 매우 밀접하게 결합되어 있습니다. 즉, 원래 디자인을 벗어난 객체를 사용하면 상당한 재 작업이 필요합니다. 예를 들어, 그 클래스의 새로운 인스턴스를 유지하기 위해 값을 할당하지 않고 그 객체를 사용해야하는 인스턴스를 발견했다면 어떻게 될까요? 이제 생성자를 오버로드하고 다른 모든 논리가이 새로운 케이스를 처리하는지 확인하거나 상속 및 대체해야합니다.

개체와 데이터 액세스가 분리 된 경우 인스턴스를 만든 다음 수화 할 수 없습니다. 또는 동일한 엔티티를 사용하지만 다른 지속성 계층을 사용하는 다른 프로젝트가있는 경우 해당 객체는 재사용 할 수 있습니다.

내가 과거 :

+0

"과거에 프로젝트에서 쉽게 커플 링 할 수있는 길을 택했다고 말했지 만 :)"나는 그 상황이 매우 중요하다고 제안합니다. – Sully

1

나는이 방법은 DB 초기화에서 오류가 생성자에서 예외로 전파 될 것입니다으로 생각할 수있는 유일한 문제.

11

음 .. 나는 그렇지 않습니다. 하지만 다시 내 접근 방식은 일반적으로 자신의 데이터를 검색에 대한 책임을지지 않는 클래스를 포함합니다.

4

그래, 할 수는 있어도 최고의 디자인이 아니며 생성자의 오류 처리가 다른 곳보다 깔끔하지 않습니다.

7

클래스의 모의/스텁 버전을 사용할 수 없으므로 클래스의 단위 테스트를 작성하기가 어려울 수도 있습니다. 여기를 참조하십시오 : 당신은 DB 연결을 참조하는 경우 가 http://en.wikipedia.org/wiki/Dependency_injection

7

당신은 일회용 패턴을 사용할 수 있습니다

public class MyClass : IDisposable 
{ 
    private Database db; 
    private int? _id; 

    public MyClass() 
    { 
     db = new Database(); 
    } 

    public int Id 
    { 
     get 
     { 
      if (_id == null) _id = db.GetIdFor(typeof(MyClass)); 
      return _id.Value; 
     } 
    } 

    public void Dispose() 
    { 
     db.Close(); 
    } 
} 

사용법 :

using (var x = new MyClass()) 
{ 
    /* ... */ 

} //closes DB by calling IDisposable.Dispose() when going out of "using" scope 
-3

왜 사람이 진짜 대신 모의 객체/스텁을 사용하고자하는 것에 프로젝트에 커플 링의 쉬운 경로를 촬영했다고 말해 두 겠는데? 자동차 제조업체가 크래시 테스트에 판지 모델 을 사용해야한다는 것에 동의하십니까?

+2

통합 테스트의 경우 절대적으로 전체 레이어를 사용합니다. 단위 테스트의 경우, 객체가 자신이 말하는대로 호출하는지 확인하기 만하면됩니다. 다른 단위 또는 통합 테스트를 사용하여 자원이 자신이 말하는대로 작동하는지 확인할 수 있습니다. –