我越深入到函数式编程,我就读到了支持静态方法而不是非静态方法的建议。例如,您可以在这本书中阅读有关该建议的内容:
http://www.amazon.de/Functional-Programming-Techniques-Projects-Programmer/dp/0470744588
当然,如果你考虑到功能的纯洁性,这是有意义的。一个静态函数站在那里说:“我不需要任何状态!”
然而,这如何影响可测试性呢?我的意思是,一个拥有大量静态方法的系统不是很难测试吗(因为静态方法很难模拟)?或者模拟在函数式编程中扮演次要角色,如果是的话:为什么?
编辑
因为有人怀疑这本书是否真的提出了这个建议。我再引用一点。我希望这对奥利弗·斯托姆来说没问题。
使用静态方法
静态方法是一个值得考虑的基本思想之一。许多面向对象的程序员都支持它,从功能的角度来看,大多数情况下函数都是静态的。任何纯函数都可以是静态的。(...)
有些人可能会认为,总是传递所有参数的想法意味着您没有尽可能多地利用面向对象的思想。这可能是事实,但可能是因为面向对象的概念没有考虑到并行执行的问题。(...)
最后,推荐一个指南:当您编写了一个不需要访问它所在类中的任何字段的方法时,请将其设置为静态的!
顺便说一句,到目前为止已经有了很好的答案。谢谢你这么说!
发布于 2011-11-29 09:39:19
对于函数式编程,您只需模拟特定函数所需的状态(通过提供适当的输入)。对于OO编程,您需要模拟类内部工作所需的所有状态。
函数程序还有一个副作用,即您可以保证用相同的输入重复相同的测试将得到相同的结果。在经典的OO中,您不仅要保证输入相同,而且要保证相同的整体状态。
在架构良好的OO代码中,差异将是最小的(因为类有明确的责任),但功能测试的需求仍然是等量OO测试的严格子集。
(我意识到函数式编程风格可以通过不可变的对象来使用OO --请阅读上面提到的OO是“具有可变状态的面向对象编程”)
编辑:
正如Fredrik所指出的,函数方法的重要部分不是它们是静态的,而是它们的不改变程序的状态。“纯”函数是从一组输入到一组输出的映射(相同的输入总是给出相同的结果),没有其他效果。
发布于 2011-11-29 09:39:00
我认为静态方法本身不是问题,问题是当它们开始对静态数据进行操作时。只要静态方法将输入作为参数,对其进行操作并返回结果,我就不会发现测试它们有什么问题。
即使在代码中没有追求功能方法的时候,我也倾向于尽可能地使方法是静态的。但在引入静态或静态类型之前,我非常仔细地思考。
发布于 2011-11-29 09:36:56
纯函数编程中的所有“状态”都来自输入。对于单元测试功能程序,您可以创建测试输入并观察输出。如果您的方法无法通过提供测试输入和观察输出来进行测试,则它们的功能不够。
https://stackoverflow.com/questions/8308483
复制相似问题