Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如果我不';你不会花很多时间调试吗?_Debugging_Haskell_F#_Tdd - Fatal编程技术网

Debugging 如果我不';你不会花很多时间调试吗?

Debugging 如果我不';你不会花很多时间调试吗?,debugging,haskell,f#,tdd,Debugging,Haskell,F#,Tdd,我试图为自己提供一个使用TDD的理由,通常的妙处是如果你使用TDD,你就不会花太多时间调试。我用F#编程,发现我花很少时间调试,代码通常第一次就可以运行 所以问题是TDD的妙语是否在另一个方向上起作用——如果我不经常调试,那么我就不需要测试了?您对F#或Haskell使用TDD有何经验?在F#或Haskell中有没有使用TDD的好的开源项目?防止过度工程等其他好处是否超过了成本?当您的代码大幅增长时,当有多人在处理代码时,当您希望确保更改不会破坏代码的功能并且不会导致性能下降时,当您想确保下一个

我试图为自己提供一个使用TDD的理由,通常的妙处是如果你使用TDD,你就不会花太多时间调试。我用F#编程,发现我花很少时间调试,代码通常第一次就可以运行


所以问题是TDD的妙语是否在另一个方向上起作用——如果我不经常调试,那么我就不需要测试了?您对F#或Haskell使用TDD有何经验?在F#或Haskell中有没有使用TDD的好的开源项目?防止过度工程等其他好处是否超过了成本?

当您的代码大幅增长时,当有多人在处理代码时,当您希望确保更改不会破坏代码的功能并且不会导致性能下降时,当您想确保下一个版本/发行版不会与上一个版本/发行版不兼容时,当您想确保代码在操作系统的多个版本和配置上工作时,当一个错误的成本很高并且可能导致严重的财务或法律问题时,等等,您需要进行测试。

调试所花费的时间与代码的复杂性成正比。TDD是一种在设计时和维护时降低代码复杂性的方法,因此,如果您正在编写非常简单的代码,那么第一个问题的答案是否定的

你的代码是有效的,你不需要证明它是有效的,没有人会改变你的代码?如果这是真的,那么你不需要测试

对我来说,函数式编程在设计和实现上都不太容易出错,所以我发现TDD的价值较小。(再看第一段)

防止过度工程是一件好事。然而,大多数项目并没有将其作为一项要求,而且确实需要时间。过度工程化很有趣。任何告诉你相反的人都在否认他们的内在工程师


我认为TDD是你需要练习的东西,在你能够欣赏它的价值之前。为测试用例编写函数签名通常足以让我解决任何设计问题。我很少填写所有的测试代码,因为我也很少有要求强迫我回去修改代码。根据您的需要,您的里程可能会有所不同。

这里有一篇关于TDD的好处的好帖子。这有点开玩笑,写得有点讽刺意味,但它展示了先测试的价值:

你花更少的时间调试F#程序,因为类型系统和对不可变数据结构和纯函数的强调消除了所有类型的无效程序

因此,“如果您使用TDD,您就不会花太多时间调试”这句话的相反说法在一定程度上是成立的,但应该是“如果您的编程语言具有需要较少调试的功能,那么这可能意味着您需要较少的单元测试”。也就是说,单元测试被用来证明代码的正确性,但是像F#这样的一些语言有编译器,它们可以“免费”证明比动态语言更多的代码

话虽如此,单元测试仍然是ML系列语言(如F#)中一个非常强大的工具,用于证明代码的正确性,但您可以关注功能的正确性,而不是语言使用的正确性

我所有的F#开源项目都有严格的单元测试套件(我认为它们非常好:),它们给了我无价的平静,并多次保护我免受回归问题的影响


代码通常是第一次使用
您确定已经涵盖了所有功能性边缘案例吗?或者它只是“看起来”在第一次单次执行运行中起作用,所以你耸耸肩喊“完成!”?@LightnessRacesinOrbit-你会惊讶于这句话在ML家族的函数式编程语言中是多么真实(这并不是说边缘案件不应该被覆盖,但是没有考虑的案例,语言也会给你更少的机会错过留下的案件)投票重新开放:我不相信这个问题是“不具有建设性的”。.在F#中的单元测试体验确实不同于一般社区。此外,你可以围绕这个问题进行科学研究(不确定是否有,但潜力是存在的)。+1表示“否认他们的内部工程师”,并同意您关于函数签名的观点。编写测试有助于确定特定签名是可用的还是痛苦的,通过练习,只需思考您将编写哪些测试就足以发现问题。使用fsi,您可以在不编写测试的情况下获得类似的见解-但在REPL会话结束时,effor将代码转换为测试的难度很小,所以您不妨这样做……非常感谢您提供的链接!我认为语言正确性/功能正确性的区别是一个很好的框架,可以用于比较不同语言中使用TDD的方式。