繁体   English   中英

仅创建采用该类型实例的静态方法是不明智的做法

[英]Is it bad practice to only create static methods that take instances of that type

以此类为例:

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()方法都将执行相同的操作,但是如您所见,它们的调用方式有所不同。 一种方法比另一种更好吗? 有写这样的代码的术语吗?

在这种情况下,我建议您不要使用静态方法,因为您应该创建很多帐户,并且每个帐户都有其自己的不同属性。 但是我认为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()...
}

因此,继续演讲不是坏习惯,而是使用静态方法,但只有在适当时才使用它们。

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

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

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

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

除了这些,从技术上讲,这没有天生的“错误”。 但是,它以其他方式影响您的设计(例如,由于它不是实例,因此无法访问实例成员)。

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

如果该方法的静态版本和实例版本都将执行相同的操作,那么我肯定会使用实例方法版本。 有几个原因:

  1. 编写更少的代码 您是否愿意不断编写Account.Create(accountObj); 或仅仅是accountObj.Create();
  2. 智能感知 当我有一个自定义对象时,我不记得自己使用的所有方法,通常可以帮助我键入accountObj. 并从下拉菜单中查看使用的方法。 如果使用静态版本,则该方法将不会显示,并且可能需要花费几秒钟的时间来记住如何使用/查找Account.Create()方法。
  3. 这是有道理的 如果您有一个可用于自定义对象的单个实例的方法,则它是一个实例方法。

以我的拙见,在实例上使用静态版本的唯一原因是,您是否需要使Create()方法不能访问帐户对象的私有成员。

我可以想到使用诸如Create之类的静态方法的唯一原因是,您将默认构造函数设为私有,并希望仅通过helper方法来控制实例的创建。
这种设计实际上是由Microsoft表达式树框架使用的,其中您是通过表达式类的静态方法创建实例的,但是它们之间还具有更复杂的抽象类层次结构

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM