2010-09-12 75 views
1

哪個是更好的方法延遲加載問題

public class Account 
{ 
    public UserAccount GetUserDetails(string acctId) 
    { 
    return new UserAccount().GetDetails(); //call method from class UserAccount 
    } 

    public UserAccount GetUserDetails(string acctId) 
    { 
    return new UserOtherDetails().GetDetails(); //call method from another class 
    } 
} 

或包含這樣

​​

或任何其他方法傢伙類?

編輯:如果我在方法上添加參數怎麼辦?

附加:我在這裏的觀點是我不想當實例化我打電話的GetUserDetails方法

+2

這裏沒有足夠的信息讓我感覺舒服的回答。 – 2010-09-12 14:20:37

+0

我很困惑,'userAccount.GetDetails()'返回一個'UserAccount'類型的對象。 GetDetails做什麼? – Heinzi 2010-09-12 14:26:57

+0

請更改您的問題的主題,使其更有意義 – abatishchev 2010-09-12 14:28:15

回答

2

你第二種方法更好。第一種方法是令人討厭的,因爲每次調用GetUserDetails時都會創建一個UserAccount類的新實例。

你也可以只下,這種屬性

public class Account 
{ 
    public UserAccount Details {get; private set;} 
} 

下面是一個例子以上

public class Account 
{ 
    public UserAccount UserDetails {get; private set;} 
    public UserOtherDetails OtherDetails {get; private set;} 

    public Account (UserAccount userDetails, UserOtherDetails otherDetails) 
    { 
    this.UserDetails = userDetails; 
    this.OtherDetails = otherDetails; 
    } 
} 

假定您已經加載的UserDetails和UserOtherDetails。如果你想按需加載細節,那麼你可以做這樣的事情。

public class Account 
{ 
    private UserAccount _userDetails; 
    private UserOtherDetails _otherDetails; 

    public GetUserAccountDetails(string accountId) 
    { 
    if (_userDetails == null) 
    { 
     // This could be a nice place to look at various factory patterns. 
     _userDetails = new UserAccount(); 
     _userDetails.Load(accountId); 
    } 
    return _userDetails; 
    } 

    ... 
} 
+0

GetUserDetails是法,什麼如果我把方法參數.. GetUserDetails(字符串帳戶ID)和帳戶ID不是UserAccount的屬性? – CSharpNoob 2010-09-12 14:23:57

+0

@CSharpNoop,我想我的第二個例子解決了這個問題。我還更新了它,以包含accountId的傳遞。 – 2010-09-12 14:26:37

+0

如果我調用GetUserAccountDetails方法,這是否也實例化UserOtherDetails? – CSharpNoob 2010-09-12 14:53:14

4

由於userAccount UserOtherDetails類將不得不以某種方式初始化[至少傳遞帳號] ,我寧願使用第二個。

1

我不使用C#,但是我個人並不完全支持這種聚合。當您需要除UserAccount :: GetDetails()提供的其他實現之外,或者您希望Account成爲不同種類的更具體帳戶的工廠時,您會使用類似的東西。

回到問題,我更喜歡第二種方法,如果這有助於你。

1

getter和setter方法是最簡單的方式去:

public class User 
{ 
    public string Name { get; set; } 
    public string TagLine { get; set; } 
} 

public class Account 
{ 
    public User Owner { get; set; } 
} 

// then... 
Console.WriteLine(account.Owner.Name); 
Console.WriteLine(account.Owner.TagLine); 
+0

我不能這樣做,如果GetUserDetails有參數呢? GetUserDetails(字符串userid) – CSharpNoob 2010-09-12 14:21:58

1

一如往常:這要看情況。

第一個示例爲每個調用創建一個新實例UserAccount,而第二個示例重用先前創建的實例。如果不知道UserAccount代表什麼以及它的構造函數是什麼,回答哪個選項更好。

您是否正在考慮選項1,因爲如果該方法從未被調用,您希望避免創建UserAccount對象?在這種情況下,延遲加載可能是你想要的:

private UserAccount userAccount; 

public Details GetUserDetails() 
{ 
    if (userAccount == null) 
     userAccount = new UserAccount(); 
    return userAccount.GetDetails(); 
} 
+0

「您是否正在考慮的選項1,因爲要避免創建UserAccount對象」 - 究竟是..所以即時通訊思想選項1在性能方面較好,但選擇2看起來不錯.. – CSharpNoob 2010-09-12 14:26:04

+0

@CSharpNoob:不一定:如果GetUserDetails被調用3次,則選項1創建三個對象,而選項2始終使用相同的對象。在我的答案中提出的延遲加載選項會創建零個對象,如果該方法從未被調用,那麼只有一個對象被調用一次或多次。 – Heinzi 2010-09-12 14:29:08

+0

這是一個非常模糊的模式....我不是說延遲加載,而是隻返回細節。你打算在所有返回userAccount屬性的屬性中實現延遲加載嗎? – 2010-09-12 14:34:48