一些函数式编程结构减少了可调试性吗?

20 浏览
0 Comments

一些函数式编程结构减少了可调试性吗?

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

  1. 匿名类
  2. 内部类
  3. 闭包块/lambda函数

这是真的吗?

0
0 Comments

有一些关于你提到的特定功能的好答案。

我认为一些FP功能以及以更FP风格编程的一些方面至少会“干扰”调试体验。例如,使用高阶函数,可以以点无样式编程。这样做会留下较少的标识符,这意味着例如在调试器的“locals”窗口中可以轻松检查的东西更少。闭包通常是不透明的,直到您进入它们的主体。

FP还使用了许多控制反转的结构(惰性评估只是其中之一,使用“map”或“iter”而不是“foreach”是另一个),这会改变控制流并影响“单步执行”的工作方式。

随着FP变得更加普遍,我预计调试工具将继续改进。我不确定是否有一些FP在调试方面本质上更难,但即使如此,不要忘记FP的许多方面使您的代码更不容易需要调试。 🙂

0
0 Comments

有些函数式编程构造可能会降低调试的可行性,虽然这是难以确定的。如果一个匿名函数抛出异常,仍然可以打印出调用栈。DrScheme在代码上绘制红色箭头来表示调用栈,这对于处理匿名函数没有问题。然而,与Java(例如Eclipse)相比,调试Scheme或Haskell等语言的工具投入的努力要少得多,因此调试工具很可能更差。而且,正如JaredPar所说,Visual Studio在这方面与C#很好地配合。

0
0 Comments

有些函数式编程的构造确实会降低代码的可调试性,但这种说法是不准确的。在许多语言中,这些构造并不是真正的匿名,因为调试器无法理解语言的语义,而是理解程序的最终形式(.exe和PDB文件的组合)。大多数匿名构造最终在最终程序中会变成具体形式(在.NET实现中非常明显)。

此外,实现这些特性的语言通常会花费时间来提供更好的调试支持。以C#和VB为例:

1. 这两种语言都会添加DebuggerDisplay属性,并重写匿名类型的.ToString方法,以增加调试支持。这两种实现的方式略有不同,但结果基本相同。

2. 内部类在调试方面并没有太多特殊之处,不需要太多额外的工作。

3. 在Visual Studio 2008中,VB和C#花了很多时间来“展开”lambda表达式,并将捕获的自由变量显示为原始局部变量列表的一部分。这样可以更轻松地调试函数。

因此,虽然函数式编程的一些构造可能会降低代码的可调试性,但许多语言都提供了针对这些构造的调试支持,以解决这个问题。

0