代码之家  ›  专栏  ›  技术社区  ›  mezoid

Resharper的建议是让我的私有方法静态化吗?

  •  8
  • mezoid  · 技术社区  · 15 年前

    我最近注意到,当我创建私有方法,在传递给它们的对象中设置一些字段时,resharper会给出一个提示,说明可以将该方法设置为静态的。

    这里有一个非常简单的例子,是我可能使用的那种方法。

    private void MakeStatusTheSame(MyClass mc, MySecondClass msc)
    {
        mc.Status = msc.Status;
    }
    

    当我有这样一个方法时,Resharper提供了一个建议,可以使该方法成为静态的。

    我尽量避免使公共方法静态化,因为它们破坏了单元测试的破坏……但我不确定这同样适用于私有方法。

    Resharper的建议是有效的最佳实践,还是我应该关闭它?

    4 回复  |  直到 15 年前
        1
  •  11
  •   scottm    15 年前

    我认为这绝对是静态方法的主要候选者。它不会更改类的任何属性、字段等。

    下面是一个例子:

    class MyClass
    {
      public static void MakeStatusTheSame(MyClass mc, MySecondClass msc)
      {
         mc.status = msc.status;
      }
    
      private void MakeStatusTheSame(MySecondClass msc)
      {
        this.status = msc.status;
      }
    
      private int status;
    }
    

    此外,还可以将其设置为扩展方法(也可以是静态的):

    public static class Extensions
    {
      public static MyClass MakeStatusTheSame(this MyClass mc, MySecondClass msc)
      {
        mc.status = msc.status
        return mc; /* make the method chainable */
       }
    }
    
        2
  •  8
  •   Bugmaster    15 年前

    冒着听起来像逆向的风险,我不得不承认,我不喜欢将静态方法与实例方法混合在一起;而且我一般不喜欢静态方法。静态方法很难测试,很难重写,也很难维护。我更喜欢将处理foo对象的所有静态方法都放在一个footils类中——或者更好的是,放在一个foosomethingdoer类的单例实例中。

    当然,静态方法在某些情况下是完全有意义的——例如,在创建前面提到的单例或工厂等时。我并不是说所有静态方法都是由纯粹的邪恶构成的;我只是更喜欢在可能的情况下避免它们。

        3
  •  7
  •   overslacked    15 年前

    我想是的;看到一个方法是静态的,这就清楚地表明该方法应该 与任何实例成员交互。

    想象一下,调试一个非静态的方法,并意识到实例没有被触动。即时的气味,如果没有一条评论来解释这个功能的作用,你可能会从真正的问题上分心。

        4
  •  4
  •   TrueWill    15 年前

    我通常同意R的建议。这是一个私有方法,所以(希望)您没有针对它编写单元测试。使其静态显式地声明它不使用任何实例成员,这使得更容易检查副作用。