3

我通常将在赋值后只使用一次的变量值放入。我这样做是为了让以后的调试更方便,因为我可以将值悬停在稍后使用它的一行上。

例如,此代码不允许您悬停 GetFoo() 的值:

return GetFoo();

但是这段代码确实:

var foo = GetFoo();
return foo; // your hover-foo is great

这闻起来很YAGNI的,因为foo的赋值的功能在有人需要调试它的值之前永远不会被使用,这可能永远不会发生。如果不是为了仅仅预见到的调试会话,上面的第一个代码片段会使代码更简单。

您将如何编写代码以在简单性和调试器易用性之间取得最佳折衷?

4

5 回答 5

2

我不知道其他调试器,但集成的 Visual Studio 调试器会报告“自动”窗口中的函数返回的内容;一旦您越过 return 语句,返回值就会显示为“[function name] returned”,其值是返回的任何值。

gdb 也支持相同的功能;“完成”命令执行当前函数的其余部分并打印返回值。

这是一个非常有用的功能,如果大多数其他调试器不支持此功能,我会感到惊讶。

至于“仅限调试器的变量”这个更普遍的“问题”,它们真的只有调试器吗?我倾向于认为使用命名良好的临时变量也可以显着提高代码的可读性。

于 2009-11-19T04:20:50.017 回答
1

在需要之前,我会忽略这项任务。如果您从未碰巧在那段代码中,想要查看该变量,那么您就没有不必要地弄乱您的代码。当你遇到需要时,把它放进去(它应该是一个微不足道的提取变量重构)。当您完成该调试会话时,请摆脱它(内联变量)。如果你发现自己调试了这么多——而且在那个特定的点——你已经厌倦了来回重构,那么想想避免这种需要的方法;也许更多的单元测试会有所帮助。

于 2009-11-19T17:12:53.523 回答
1

另一种可能性是学习足够的汇编编程,您可以阅读编译器生成的代码。借助该技能,您可以确定值的保存位置(在寄存器中,在内存中)并查看该值,而无需将其存储在变量中。

如果您需要调试优化的可执行文件,此技能非常有用。优化器可以生成与您编写它的方式大不相同的代码,因此符号调试没有帮助。

于 2009-11-19T04:49:32.753 回答
1

在 Visual Studio 调试器中不需要中间变量的另一个原因是,您可以在 Watch Window 和 Immediate 窗口中计算函数。对于监视窗口,只需突出显示要评估的语句并将其拖到窗口中即可。

于 2009-11-19T04:50:23.570 回答
1

我认为这不值得担心。鉴于在典型情况下没有运行时开销,请发疯。我认为将复杂语句分解为多个简单语句通常会增加可读性。

于 2009-11-19T14:39:09.873 回答