一些函数式编程构造是否会降低可调性?

use*_*855 8 debugging functional-programming

我听说以下功能降低了可调试性(因为它们是匿名的,调试器无法很好地跟踪它)

  1. 匿名类
  2. 内在的类
  3. 闭包块/ Lambda函数

这是真的?

Bri*_*ian 7

关于您提到的特定功能,已经有一些很好的答案.

一般来说,我会说一些FP功能,以及更多FP风格的编程方面,至少与调试体验"互动".例如,使用高阶函数,可以采用无点样式编程.当您这样做时,这会留下更少的标识符,这意味着在调试器的"本地"窗口中可以轻松检查的内容更少.在你进入他们的身体之前,闭包通常是不透明的.

FP还使用了大量的控制反转构造(懒惰评估只是一个,'地图'或'iter'而不是'foreach'是另一个),这改变了控制流程并且可以影响"单步"的方式作品.

随着FP变得越来越普遍,我希望调试工具能够继续改进.我不清楚某些FP是否"固有地"更难以调试,但即使这是真的,也不要忘记FP会让你的代码首先不太可能需要调试.:)


Jar*_*Par 1

我想说这绝对是不真实的。是的,如果没有额外的调试支持,这些构造可能会更难以调试。在许多语言中,它们并不是真正的匿名,因为调试器不理解语言语义。相反,它理解程序的最终形式(.exe 和 PDB 组合)。大多数匿名构造最终在最终程序中采用具体形式(对于 .Net 实现来说非常如此)。

此外,实现这些功能的语言通常需要时间来为它们实现更好的调试支持。以C#和VB为例

  1. 两种语言都添加DebuggerDisplay属性并覆盖生成的匿名类型上的 .ToString 以增加调试支持。实现略有不同,但结果几乎相同。
  2. 内部类在调试方面并不是很特别,并且不需要太多(如果有任何额外的工作)
  3. VB 和 C# 在 Visual Studio 2008 中花费了大量时间来“展开”lambda 表达式,并将捕获的自由变量显示为原始局部变量列表的一部分。使调试功能变得更加容易