2010-06-17 3 views
2

우리 데이터베이스에는 각 집계에 대한 리포지토리를 반환하는 데이터 공급자 클래스가 있습니다.새 개체를 반환하거나 생성자에서 멤버를 초기화 하시겠습니까?

의 시나리오 다음을 고려하자

public class DataProvider { 
    public IBookRepository Books { get { retun new BookRepository(); } } 
    public IAuthorRepository Authors { get { retun new AuthorRepository(); } } 
} 

당신이 볼 수 있듯이, 우리는 우리가 회원 호출 지정된 객체의 새로운 인스턴스마다 시간을 반환 : DataProvider.Books.DoBANANAS();

public class DataProvider { 
    public IBookRepository Books { get; } 
    public IAuthorRepository Authors { get; } 

    public DataProvider() 
    { 
     Books = new BookRepository(); 
     Authors = new AuthorRepository(); 
    } 
} 

`DataProvider.Books.BANANAS();를 호출 할 것인가? 더 적은 CPU/메모리가 필요합니까?

나는 방금 두 버전을 구현했는데 놀랍게도 효과가있었습니다.

하지만 내 경험에 의하면 그게 Version 1 Sucks입니다. 그러나 최종 제품을 완벽하게 최적화하고 구현할 수있는 충분한 시간을 가지고 있습니다. (연구 그룹에서 일하는 것이 이점입니다)

+3

두 예제는 의미 상으로 동일하지 않습니다. 그것들은 메모리 사용량이나 속도면에서 약간의 차이 만있는 것이 아니라 매우 다른 행동을합니다. 나는 당신이 첫 번째 것이 무엇을 의도하지 않고있는 것 같아요. – dtb

+1

두 버전 모두 다른 행동을합니다 (최소한 예제가 제공하는 수준에서). 아마도 다른 일을하는 두 가지 솔루션을 비교하는 것이 아닙니다. 성능 및 (실제 문제 인 경우에만) 고려해야 만 정확한 동작 및 의미를 먼저 결정해야합니다. –

답변

3

표시된 구현은 객체를 작성하고 관리하는 방법이 다릅니다. 첫 번째 예에서는 속성이 DataProvider에서 호출 될 때마다 새 저장소가 만들어집니다. 저장소가 어떤 상태 (예 : 가져온 객체의 캐시)를 보유하고 있다면,이 상태는 매번 기본값으로 재설정되므로 두 번째 예제와 다른 동작을 보입니다.

당신이 두 버전 작업을했다는 사실 때문에 저장소 개체가 상태를 유지하지 않고 데이터베이스 호출에 대한 프록시 일뿐입니다. 이 경우에는 별 차이가 없을 것입니다.

그러나 성능과 두 가지 접근 방식의 메모리 프로필은 매우 다릅니다. 조기 최적화는 나쁜 일이고 종종 낭비이지만, 각 속성 호출에 대해 새로운 저장소를 만드는 것이 나중에 성능 문제가 될 수 있으므로 소개하지 않으면 버그를 추적하기가 어렵습니다. 상태로 리포지토리에 저장합니다. 적은 객체를 생성하면 궁극적으로 가비지 컬렉터에 부담을 덜 주지만 수백만 개의 객체를 작성하지 않으면 무시할 수있는 차이가 없습니다.

요약하면 두 번째 예가 앞으로 나아갈 것이므로 실제로 고려하면 문제는 없습니다.

+0

답장을 보내 주셔서 감사합니다.내 짐들은 전혀 옳지 않은 것 같아. 또 다른 질문 : DataProvider를 '정적으로'설정하면 차이가 있습니까? 데이터베이스 또는 다른 공급자에서 일부 데이터에 액세스해야 할 때마다 DataProvider를 만들고 인스턴스화 할 필요가 없습니다. –

+0

다릅니다. 'DataProvider'를 더 쉽게 잡을 수는 있지만, 정적 인 인스턴스로 사용하면 테스트하기가 더 어려워 질 것입니다. – adrianbanks

+0

그 주제에 더 많은 것을 읽은 후 (연휴가 있었기 때문에 늦은 응답이었습니다), 나는 무의식적으로'UnitOfWork' 원칙을 구현하려고 시도한다는 것을 알게되었습니다. 그것이 내가 원하는 것을 정확히 연구 한 후에 원했던 것입니다. 정확히 제가 찾고있는 것이 었습니다. 멋진 답변을 보내 주셔서 다시 한 번 감사드립니다. –

2

첫 번째 예에서는 매번 XXXRepository 개체의 새 인스턴스를 만들고 두 번째 인스턴스는 이미 존재하는 개체로 핸들을 반환하므로 두 번째 인스턴스가 더 나은 작업을 수행해야합니다 새로운 메모리를 할당 할 필요가 없으므로 더 적은 CPU를 사용하십시오.

더 큰 문제는 저장소 클래스가 완전히 정적이거나 뭔가가 아니라면 두 시나리오가 완전히 다른 결과를 생성한다는 것입니다. 리포지토리 클래스가 데이터베이스에 대한 일종의 인터페이스 인 경우 옵션 1은 옵션 2에서 스레드로부터 안전 할 필요는 없습니다.

관련 문제