【问题标题】:Should we always declare a method as static if it does not access "this" object properties or methods如果不访问“this”对象属性或方法,我们是否应该始终将方法声明为静态方法
【发布时间】:2013-11-25 23:17:09
【问题描述】:

很多时候我遇到过需要在类中定义一些辅助函数的场景。下面是一个例子:

public class MyClass
{
    private void BeautifyOrValidate(MyRequest request)
    {
        //Beautify or validate request
    }
    public void DoOperation(MyRequest request)
    {
        BeautifyOrValidate(request);
        //Do actual operation
    }
}

在上面的示例中,“BeautifyOrValidate”可以设为静态。一个类中可以同时存在许多这样的函数。
我想知道我们是否应该始终对此类方法使用 static 关键字,或者还有其他一些规则。

【问题讨论】:

  • 我看到extract 一个MyRequestBeautifierMyRequestValidator 类的可能性。

标签: c# oop static


【解决方案1】:

对于私有成员而言,这并不重要,将其设为静态是一个微小的优化。

对于公共成员,基本规则是当它可以是静态的时,它应该是。只是要清楚MyClass 实例不涉及BeautifyOrValidate(request) 的事实

【讨论】:

  • 那么如果是针对私人会员的优化,那没有理由不做对吗?
  • 从来没有听说过这样的“基本规则”,有没有机会进一步澄清?
  • 优化是一回事,它不应该是主要的决策点。
  • 这不是优化考虑,而是设计考虑。通过将其设为静态,您就是在告诉全世界它不会修改类中的任何非静态成员变量。
  • 模拟静态至少很难说。
【解决方案2】:

(我想这是程序员的问题。stackexchange ...)检查这个答案:https://stackoverflow.com/a/2267438/2018771

正如其他人所说,您可能应该拥有一个 resharper :)。 如果可以设为静态,则表示:

  • 方法不使用任何实例变量
  • 方法不调用任何使用实例变量的其他方法

然后您可以根据代码进行选择(这里没有一般规则!)

  • 你可以move BeautifyOrValidate(MyRequest request) logic 进入 MyRequest,如果这有意义的话(代码是使用MyRequest 的非静态方法)。这很酷,因为您发现了MyRequest 的附加功能,您还应该把它放在哪里? 对我来说,在函数之间传递相同的变量是使其成为实例变量的标志在它自己的类中(无论是在“旧”类中,还是在新类中,因为我已经确定了一项新职责新班级)。
  • BeautifyOrValidate(MyRequest request) 是一个转换 MyRequest 的函数,但它的逻辑与 MyRequest 或更广泛的用法无关,可以提取到静态帮助程序类。可以将其视为转换MyRequest 数据的工具包。
  • 您可以将其设为静态,但如果 MyClassMyRequest 没有任何真正牢固的联系,人们会感到困惑,他们将不知道在哪里搜索 BeautifyOrValidate(MyRequest request)(并且最终他们将编写自己的自己的版本,他们可以找到,从而导致不一致的行为,无论其他人是否找到您或他们的代码...)。

我个人的偏好是在真正需要之前不要编写扩展方法,例如MyRequest 是第三方代码,或者您不能/不得修改它是 sealed 等等。或者没有其他项目需要修改并且功能特定于您的项目它会清除您的代码。

如果你选择第一个版本,你可以去掉那个参数:

MyRequest myRequest = new MyRequest();
myRequest.BeautifyOrValidate();

对我来说很有意义。

【讨论】:

    【解决方案3】:

    显然它没有实际的区别。

    如果您使用像 Resharper 这样的代码分析工具,并且痴迷于神奇的零警告状态(嘿,这没什么错),那么您可能需要将这些方法设为静态,或调整您的规则。

    或者,将它们移到静态类并使其成为扩展方法怎么样?

    public static class RequestUtilities
    {
        public static void BeautifyOrValidate(this MyRequest request) 
        { 
            ... 
        }
    }
    

    这给人一种很好的感觉,并且避免了你目前面临的深刻的道德困境。

    否则,我认为这取决于个人喜好。撇开 Resharper 不谈,我的偏好是不要将这些设为静态,因为这并不能真正反映我故意将方法设为静态时的意图。

    请放心,没有明确的答案,在一般情况下,这可能一点也不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2011-10-24
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多