如何避免仅调试器变量?

时间:2009-11-19 04:16:50

标签: debugging refactoring yagni

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

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

return GetFoo();

但是这段代码确实:

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

这闻起来非常YAGNI -esque ,因为 foo 分配的功能将永远不会被使用直到某人需要调试其值,这可能永远不会发生。如果它不适用于仅仅预见的调试会话,则上面的第一个代码片段会使代码更简单。

您如何编写代码以在简单性和易于使用调试器之间做出最佳折衷?

5 个答案:

答案 0 :(得分:2)

我不知道其他调试器,但集成的Visual Studio调试器将报告从“Autos”窗口中的函数返回的内容;一旦你跳过return语句,返回值就会显示为“[function name] return”,其值为返回的值。

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

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

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

答案 1 :(得分:1)

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

如果您需要调试优化的可执行文件,此技能非常有用。优化器可以生成与您编写代码的方式明显不同的代码,这样符号调试就没有用了。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我认为这不值得担心。鉴于典型案例中没有运行时开销,请坚持下去。我认为将复杂语句分解为多个简单语句通常会提高可读性。

答案 4 :(得分:1)

我会遗漏作业直到需要。如果您从未碰巧遇到过这段代码,想要查看该变量,那么您就不会不必要地填充代码。当你遇到需要时,把它放进去(它应该是一个微不足道的提取变量重构)。当你完成调试会话时,摆脱它(内联变量)。如果你发现自己调试了这么多 - 而且在那个特定点上 - 你厌倦了来回重构,那就想办法避免这种需要;也许更多的单元测试会有所帮助。