【问题标题】:Good reasons for static methods?静态方法的充分理由?
【发布时间】:2013-06-26 11:40:44
【问题描述】:

我使用静态方法来处理我真正想要的静态方法。我使用 ReSharper 以获得更好的代码质量。有时 ReSharper 建议可以将方法设为静态。

当我得到以下课程时:

public class WhatEverClass {
    private string DoSomethingFancy(string input) 
    {
       string fancyStuff;
       // Fancy Stuff here
       return fancyStuff;
    }

    public WhatEverClass() {
       string awesome=DoSomethingFancy("some fancy string");
    }
}

ReSharper 可能会说“DoSomethingFancy 可以设为静态”。

我知道它可以设为静态,但真的有充分的理由这样做吗?还是我应该忽略这些建议?

【问题讨论】:

标签: c# static resharper static-methods


【解决方案1】:

通过定义一个静态方法,即一个计算某些东西的过程,你API的消费者表达了一个关于你的函数的无状态性的意图

当我们使用static 函数时,我们不期望它会在其内部static private 变量的某处保存计算状态或一些计算的内部值,因此下一次调用该函数可能即使在第一次调用期间传递的参数相同,也会产生不同的结果。

简而言之:每当你看到一个函数只对参数执行一个操作而不保留某些状态时,它是一个很好的候选者,可以将其设为static

【讨论】:

  • +1 实际上提供了一些有用的推理,而不仅仅是“如果您不明确需要其他东西,请使用静态......”的变体。
【解决方案2】:

如果您的方法不需要说明或更改实例化对象的状态,那么它应该是静态的。

【讨论】:

  • TypeMock 具有对静态方法进行测试的能力。但是,是的,静态方法是单元测试的一个大问题。
  • 如果我错了,请纠正我,但私有静态方法根本不应该(消极地)影响单元测试?
  • 如果静态方法不改变其他类的状态,那么单元测试不会有任何问题。如果该方法是从其他类调用的,则它不是单元测试,它更像是集成测试。
【解决方案3】:

通常的概念是,如果您不创建任何实例,则可以将其声明为静态。至于应该在哪里使用,ReSharper 会根据标准编程实践为您提供建议。但是,我对“标准编程实践”持保留态度。对于某些人来说,这是个人编程偏好的问题。以下是有关该主题的详细参考:

http://msdn.microsoft.com/en-us/library/79b3xss3.aspx

【讨论】:

    【解决方案4】:

    因为您将通过创建WhatEverClass 实例从类外部调用WhatEverClass() 方法。所以每个实例的值都会不同,因为变量是本地的,每次创建类的实例时都会创建。

    但是,如果您想为所有实例保持相同的值,则可以将其设为static,这样它将在内存中创建一次,所有实例都会使用它。

    【讨论】:

    • 对不起。但这与这里的静态值无关。
    【解决方案5】:

    注意将方法设为静态的后果!

    通过使您的方法静态化,您可以让消费者更难存根您的算法实现并将其替换为他们自己的一种(显然,如果方法是private,您就不必担心)。

    您的静态方法的使用者将您的实现嵌入到他们的代码中 - 他们不能使用依赖注入来解析您的算法的特定实例(没有一点工作)。这使得他们的系统更难测试,并且通常适用于可扩展性较差的代码库。

    【讨论】:

    • 我不想提供框架或类似的东西。这是一个客户项目,我和团队成员拥有源代码,但“外部”没有人将其用作其他东西的源代码
    • 你总是有消费者——不管你是否认为他们是外部的。主要应用程序以及测试工具是具有不同要求的两个消费者。如果您的测试工具想要在不使用算法的特定实现的情况下测试系统的某个方面怎么办?您团队的其他成员将使用您的代码 - 是吗?
    【解决方案6】:

    如果方法DoSomethingFancy 没有使用对象WhatEverClass 中的任何内容,那么在我的书中,它应该被设为静态,因为它实际上与使用它的对象没有任何关系。

    【讨论】:

    • 问题是您无法测试使用静态函数的方法。不能模拟静态函数,这是个大问题。
    猜你喜欢
    • 2011-06-08
    • 2010-10-13
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2011-01-17
    相关资源
    最近更新 更多