如果功能是“纯”的,我认为没有问题。纯函数仅在输入参数中起作用,并基于此提供结果。它不依赖于任何全局状态或外部上下文。
如果我看您自己的代码示例:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
此函数不带任何参数。因此,它可能不是纯粹的(此函数的唯一纯粹实现将是返回一个常量)。我假设该示例不能代表您的实际问题,我只是指出这可能不是一个纯函数。
让我们举一个不同的例子:
public static bool IsOdd(int number) { return (number % 2) == 1; }
这个函数是静态的没有什么错。我们甚至可以将其作为扩展功能,以使客户端代码更具可读性。扩展功能是基本上只是一种特殊的静态函数。
Telastyn正确地提到并发是静态成员的潜在问题。但是,由于此函数不使用共享状态,因此这里没有并发问题。一千个线程可以同时调用此函数,而没有任何并发问题。
在.NET框架中,扩展方法已经存在了一段时间。LINQ包含许多扩展功能(例如Enumerable.Where(),Enumerable.First(),Enumerable.Single()等)。我们不认为这些不好,是吗?
当代码使用可替换的抽象时,单元测试通常可以从中受益,从而允许单元测试将测试代码替换为系统代码。静态函数禁止这种灵活性,但这在体系结构层边界非常重要,在这种情况下,我们想用伪造的数据访问层代替实际的数据访问层。
但是,当为一个行为不同的对象编写测试时,根据某个数字是奇数还是偶数,我们实际上并不需要能够IsOdd()
用替代实现替换该函数。同样,我看不到何时需要Enumerable.Where()
出于测试目的提供其他实现。
因此,让我们检查一下此功能的客户端代码的可读性:
选项a(将函数声明为扩展方法):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
选项b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
静态(扩展)功能使第一段代码更具可读性,并且可读性很重要,因此请在适当的地方使用静态功能。