懒惰的加载问题

时间:2010-09-12 14:12:19

标签: c# coding-style

哪种方法更好

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
  }
}

或包含类似这样的类

public class Account
{
  private UserAccount userAccount; //contain UserAccount class
  private UserOtherDetails userOtherDetails;

  public UserAccount GetUserDetails(string acctId)
  {
    return userAccount.GetDetails(); //invoke the method from UserAccount class
  }

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

或任何其他方法的人?

编辑:如果我在方法上添加参数怎么办?

补充:我的观点是当我调用GetUserDetails方法时,我不想实例化UserOtherDetails类

5 个答案:

答案 0 :(得分:4)

由于userAccount必须以某种方式初始化[至少通过帐号],我宁愿使用第二个。

答案 1 :(得分: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;
  }

  ...
} 

答案 2 :(得分:1)

我不使用C#,但我个人并不完全支持这种聚合。当您需要除UserAccount :: GetDetails()之外的其他实现或者您希望Account为不同类型的更具体帐户的工厂时,您会使用类似的东西。

回到这个问题,如果能以某种方式帮助你,我更喜欢第二种方法。

答案 3 :(得分:1)

Getters和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);

答案 4 :(得分:1)

一如既往:取决于。

第一个示例为每个调用创建一个新UserAccount实例,而第二个示例重用先前创建的实例。如果不知道UserAccount表示什么以及它的构造函数是什么,就不可能回答哪个选项更好。

您是否正在考虑选项1,因为如果从未调用该方法,您希望避免创建UserAccount对象?在这种情况下,延迟加载可能是你想要的:

private UserAccount userAccount;

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