2010-09-12 76 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