2011-10-14 5 views
1

오브젝트를 작성하고 절대적으로 필요할 때만 오브젝트를 작성하는 데 필요한 데이터를 보유하는 것이 오브젝트 자체를 보유하는 것보다 낫고/더 효율적인 경우가 있습니까? 오브젝트 생성 유지하기

예제이다

: 일반적

class Bar 
{ 
    public string Data { get; set; } 
} 

class Foo 
{ 
    Bar bar; 
    readonly string barData; 

    public Foo(string barData) 
    { 
     this.barData = barData; 
    } 

    public void MaybeCreate(bool create) 
    { 
     if (create) 
     { 
      bar = new Bar { Data = barData }; 
     } 
    } 

    public Bar Bar { get { return bar; } } 
} 
+3

런타임까지는 아무 것도 생성되지 않습니다. :) –

+0

@Ilia -question edited. – Didaxis

답변

3

개체가 시스템 리소스를 할당하는 등의 복잡한 작업을 수행하는 것이 좋습니다.

개체의 인스턴스 생성을 지연시키는 데 도움이되는 Lazy<T>이 있습니다. 무엇보다도 필요한 경우 스레드 안전이 내장되어 있습니다.

+0

+1 게으른 의 경우이 상황에서 확실히 의미가 있습니다. – Didaxis

3

, NO. (귀하의 질문이 올바른지 이해한다면).

할당/구조는 성능면에서 저렴합니다. 미친 짓을하지 않는 한, 디자인을 자연스럽게 생각할 때 개체를 구성하십시오. 조기에 최적화하지 마십시오.

+0

예, 올바르게 이해하고 있습니다. 고마워요 – Didaxis

+0

동의합니다. 생성자에서 너무 많은 작업을하지 마십시오. 헤비급 강사가있는 수업을 재 설계하는 것이 훨씬 낫습니다. 다음 링크는 그것에 대한 구글의 재촉이다. 아주 좋은 설명. http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/ –

+0

@gmamaladze- "무거운 생성자"가 내 질문과 어떤 관련이 있는지 알 수 없습니다. 이 질문은 유연한 생성자를 만드는 방법보다 게으른 로딩에 대한 것입니다. 실제로 Foo 생성자가 링크에 설명 된 원칙을 따르는 것을 알 수 있습니다. – Didaxis

1

예를 만들면 개체를 채우는 것을 의미하고 채우려면 느린 작업이 필요합니다. 예를 들어

,

List<int> ll = returnDataFromDBVeryVerySlowly(); 

또는 당신이 그것을 필요로하지 않는 경우에도 returnDataFromDBVeryVerySlowly가 항상 호출됩니다 첫 번째 예에서

Lazy<List<int>> ll = new Lazy<List<int>>(() => 
{ 
    return returnDataFromDBVeryVerySlowly(); 
}); 

. 두 번째 경우에는 필요한 경우에만 호출됩니다. 예를 들어 ASP.NET에서 "준비된"많은 "표준"데이터 세트를 원하지만 필요한 경우가 아니라면 이들을 사용자의 구성원으로 지정하려는 경우가 아니라면 데이터를 채우고 싶지는 않습니다. 페이지, 여러 메서드가 액세스 할 수 있도록 ( returnDataFromDBVeryVerySlowly)

+0

+1 예 – Didaxis

관련 문제