静态方法的函数式编程建议如何影响可测试性?

Chr*_*oph 13 c# unit-testing functional-programming

我越是深入研究函数式编程,我就读到了支持静态方法而不支持非静态方法的建议.您可以在本书中阅读有关该建议的示例:

http://www.amazon.de/Functional-Programming-Techniques-Projects-Programmer/dp/0470744588

当然,如果你考虑功能纯度,这是有道理的.一个静态函数站在那里说:"我不需要任何状态!"

但是,这对可测试性有何影响?我的意思是,不是一个有很多静态方法的系统变得很难测试(因为静态方法难以模拟)?或者模拟在函数式编程中扮演次要角色,如果是这样的话:为什么?

编辑

因为怀疑书是否真的提出了这个建议.我会再引用一点.我希望Oliver Sturm没问题.

使用静态方法

静态方法是一般值得考虑的基本思路之一.许多面向对象的程序员都支持它,从功能的角度来看,函数可以在大多数时候保持静态.任何纯函数都可以是静态的.(......)

有些人可能会争辩说,总是传递所有参数的想法意味着你并没有尽可能多地利用面向对象的思想.事实上这可能是真的,但也许是因为面向对象概念并没有像他们应该那样多地考虑并行执行问题.(......)

最后,建议的一个指导原则:当你编写了一个不需要访问它所在类中任何字段的方法时,请将其设置为静态!

顺便说一下,到目前为止一直有很好的答案.感谢那!

mav*_*vnn 11

一种看待这种情况的方法是,对于函数式编程,您只需要模拟特定函数所需的状态(通过提供合适的输入).对于OO编程,您需要模拟类的内部工作所需的所有状态.

功能程序还有一个附带的好处,即您可以保证使用相同的输入重复相同的测试将得到相同的结果.在经典的OO中,您必须保证不仅仅是相同的输入,而是相同的整体状态.

在架构良好的OO代码中,差异将是最小的(因为类将具有明确定义的责任),但功能测试的要求仍然是等效OO测试的严格子集.

(我意识到函数式编程风格可以通过不可变对象来使用OO - 请将上面提到的OO读作'具有可恢复状态的面向对象编程')

编辑:

正如Fredrik所指出的,关于功能方法的重要部分并不是它们是静态的,而是它们不会改变程序的状态."纯"函数是从一组输入到一组输出的映射(相同的输入总是给出相同的结果),并且没有其他影响.


Alb*_*nbo 5

纯函数式编程中的所有"状态"都来自输入.要对功能程序进行单元测试,您可以创建测试输入并观察输出.如果无法通过给出测试输入并观察输出来测试方法,则它们的功能不够.


Fre*_*örk 5

我认为静态方法本身不是问题,问题是当它们开始对静态数据进行操作时出现的。只要静态方法将输入作为参数,对其进行操作并返回结果,我认为测试它们没有问题。

即使在我的代码中不追求功能性方法时,我也会尽可能地使方法静态化。但是在引入静态或静态类型之前,我会非常仔细地考虑。