如果一个方法没有访问"this"对象的属性或方法,我们是否应该总是将其声明为静态方法?

3

很多时候,我会遇到需要在类中定义一些辅助函数的情况。以下是一个示例:

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

在上面的例子中,“BeautifyOrValidate”可以被定义为静态方法。一个类中可以存在多个这样的函数。
我想知道是否应该始终对此类方法使用static关键字,或者是否有其他规则可遵循。

4
我看到有可能提取出 MyRequestBeautifierMyRequestValidator 两个类。 - CodeCaster
3个回答

3

对于私有成员而言,将其设置为静态的微小优化无关紧要。

对于公有成员,基本规则是:只要可能,就应该使用静态。这样可以明确BeautifyOrValidate(request)方法中没有涉及到MyClass实例。


那么,如果这是针对私有成员的优化,没有理由不去做对吧? - David S.
1
从来没有听说过这样的“基本规则”,有进一步的澄清的机会吗? - Wiktor Zychla
1
优化只是一个附带条件,不应该是主要决策点。 - H H
3
这不是优化方面的考虑,而是设计方面的考虑。通过将它设为静态,你告诉世界它不会修改类中任何非静态成员变量。 - Moo-Juice
4
嘲讽静态属性或方法是相当困难的。 - Marvin Smit
显示剩余2条评论

3
(我想这是一个面向程序员的问题,应该去程序员问答社区寻求帮助...)看看这个答案:https://dev59.com/EnE95IYBdhLWcg3wi-ee#2267438 正如其他人所说,你可能需要拥有 Resharper :). 如果可以将其设置为静态,则意味着:
  • 该方法不使用任何实例变量
  • 该方法不调用使用实例变量的任何其他方法
然后,根据代码,您有选择:
  • 如果有意义(代码正在使用MyRequest的非静态方法),则可以将BeautifyOrValidate(MyRequest request) 逻辑 移入 MyRequest中。那很酷,因为您已经找到了MyRequest的附加功能,还有哪里可以放置它呢? 对我来说,在其自己的类中将相同变量传递给函数是使其成为实例变量的迹象(无论是在“旧”类中还是在新类中,因为我已经确定了新类的新职责)。
  • BeautifyOrValidate(MyRequest request)是一个转换MyRequest的函数,但具有与MyRequest或更广泛用途无关的逻辑,可以将其提取为静态帮助类。将其视为转换MyRequest数据的工具包。
  • 您可以将其设置为静态,但如果MyClassMyRequest没有任何真正强烈的联系,人们会感到困惑,并且他们不知道在哪里搜索BeautifyOrValidate(MyRequest request)(最终他们将编写自己的版本,无论其他人找到您的代码还是他们的代码...),结果是不一致的行为。
我个人的偏好是,在确实需要之前不编写扩展方法,例如,MyRequest是第三方代码,或者您不能/不得修改它并且它是sealed等等。或者没有其他项目将需要该修改,而该功能特定于您的项目并且可以清除您的代码。
如果选择第一个版本,则可以删除该参数:
MyRequest myRequest = new MyRequest();
myRequest.BeautifyOrValidate();

我理解这个意思。

2

显然这没有实际影响。

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

或者,您可以将它们移动到静态类中并将它们变成扩展方法?

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

这个感觉很好,避免了你目前面临的深刻道德困境。

否则,我认为这归结于个人偏好。除了Resharper之外,我不喜欢将它们设为静态,因为这并不能真正反映我有意使方法静态的意图。

请放心,没有明确的答案,在总体方案中,这可能根本无关紧要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接