0

以这个类为例:

public class Account
{
    public string Code { get; set; }
    public string Description { get; set; }
    public DateTime CreatedOn { get; private set; }  

    public void Create()
    {
        // Invoke with new Account({...}).Create();
    }

    //Or

    public static void Create(Account account)
    {
        // Invoke with Account.Create(new Account({...}));
    }
}

这两种Create()方法都将做同样的事情,但正如您所见,它们的调用方式不同。一种比另一种更好的做法吗?有没有写这样的代码的术语?

4

4 回答 4

2

在这种情况下,我建议您不要使用静态方法,因为您应该创建很多帐户,并且每个帐户都有自己不同的属性。但是我觉得这个方法Create()没有意义,因为可以直接使用构造函数来设置账号。所以我会这样做:

public class Account
{
      public string Code { get; set; }
      public string Description { get; set; }
      public DateTime CreatedOn { get; private set; }  

      public Account()
      {
          Description = string.Empty;
          CreatedOn = DateTime.Now;
          //Code = ...
      }

      public Account(string Description)
      {
          this.Description = Description;
          CreatedOn = DateTime.Now;
          //Code = ...
      }
}

Ant 然后我将创建另一个类来管理帐户:

class AccountsManagement
{
      public List<Account> Accounts
      {
           get;
           set;
      } 

      public AccountsManagement()
      {
           Accounts = new List<Account>();
      }

      //...   

      public void Create()
      {
           Accounts.Add(new Account();
      }

      public void Create(string Description)
      {
           Accounts.Add(new Account(Description);
      }

      //Or

      public void AddAccount(Account account)
      {
           Accounts.Add(account);
      }

      //Find(), Delete()...
}

所以继续演讲使用静态方法是不错的做法,但只有在适当的时候才应该使用它们。

于 2012-06-04T07:30:04.347 回答
1

一般来说,我不知道这是好还是坏的做法。但是,在您给出的示例中,我倾向于“不良做法”(而且我想不出任何有用的理由将类型的实例传递给在该类型上声明的静态方法)。

当然,在您的示例中,您(IMO)正在创建一个不清楚的 API。我不确定是否;

  • Account.Create 旨在为帐户发出数据存储请求(当然属于您的对象模型中其他地方的功能)
  • 是使用一些默认参数集创建 Account 实例的某种“便利”方法(可以说在 Account 的构造函数中会更好)
  • 表示复制构造函数(在这种情况下,它应该是构造函数)
  • 是 AccountFactory 的廉价实现(在这种情况下,您应该创建一个工厂!)

另一个考虑因素是测试 - 在对调用它们的任何东西进行单元测试时,静态方法可能会带来困难,因为它们可能不容易模拟或存根。

除此之外,从技术上讲,这并没有任何本质上的“错误”。但是,它会以其他方式影响您的设计(例如;由于它不是实例,因此无法访问实例成员)。

因此,我认为这种方法可能会导致一些混乱,但是,它也可能完全适合您的情况!

于 2012-06-04T07:23:17.107 回答
1

如果方法的静态版本和实例版本都做同样的事情,那么我肯定会使用实例方法版本。有几个原因:

  1. 少写代码。你宁愿不断地写Account.Create(accountObj);还是只是accountObj.Create();
  2. 智能感知。当我有一个自定义对象并且我不记得我对它所做的所有方法时,它通常可以帮助我键入accountObj.并获取下拉菜单以查看它使用的方法。如果您使用静态版本,该方法将不会显示,您可能需要几秒钟来记住如何使用/查找该Account.Create()方法。
  3. 这很有意义。如果您有一个适用于自定义对象的单个实例的方法,那么它就是一个实例方法。

在我看来,在实例上使用静态版本的唯一原因是,如果您需要阻止该Create()方法访问帐户对象的私有成员。

于 2012-06-04T07:34:01.967 回答
0

我能想到使用像您的 Create 这样的静态方法的唯一原因是您将默认构造函数设为私有,并希望仅通过您的辅助方法控制实例的创建。
这种设计实际上被微软的表达式树框架使用,你通过表达式类的静态方法创建实例,但是它们之间也有更复杂的抽象类层次结构

于 2012-06-04T07:38:23.697 回答