Debugging 如何避免仅调试器变量?

Debugging 如何避免仅调试器变量?,debugging,refactoring,yagni,Debugging,Refactoring,Yagni,我通常将赋值后只使用一次的值放入变量中。我这样做是为了使以后的调试更加方便,因为我可以将值悬停在稍后使用它的一行上 例如,此代码不允许悬停GetFoo()的值: 但这一准则确实: var foo = GetFoo(); return foo; // your hover-foo is great 这闻起来很像,因为foo赋值的功能在有人需要调试它的值之前永远不会被使用,这可能永远不会发生。如果不是为了仅仅预见到的调试会话,上面的第一个代码段将使代码更简单 如何编写代码以在简单性和易用性之间达成

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

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

但这一准则确实:

var foo = GetFoo();
return foo; // your hover-foo is great
这闻起来很像,因为foo赋值的功能在有人需要调试它的值之前永远不会被使用,这可能永远不会发生。如果不是为了仅仅预见到的调试会话,上面的第一个代码段将使代码更简单


如何编写代码以在简单性和易用性之间达成最佳折衷?

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

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

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


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

另一种可能性是学习足够多的汇编编程,以便能够阅读编译器生成的代码。有了这项技能,您就可以找出值的存放位置(在寄存器、内存中)并查看值,而无需将其存储在变量中


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

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

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

我会把作业留到需要时再做。如果你从来没有碰巧在那一段代码中,想看看那个变量,你就没有不必要地把代码弄乱。当您遇到需要时,将其放入(它应该是一个微不足道的提取变量重构)。完成调试会话后,将其删除(内联变量)。如果你发现自己调试了太多——在那个特定的点上调试了太多——以至于你厌倦了反复重构,那么想想避免这种需要的方法;也许更多的单元测试会有所帮助。

非常好的提示。非常感谢。“return”的例子就是——只有一个例子。。。当我这样做的时候。但是,工具(例如IDE)越是能提供我所需的信息,而不必只为调试而编写代码。。。我就越不必编写只用于调试的代码!哦,这就是汽车的用途!!!!天啊,我们需要一个指南来发布所有的VisualStudio调试工具……“AutoOS”技术是C++的,不是C语言的。显然,它只适用于本机C++,对于.NET代码(CF.)来说根本不起作用。叹息
var foo = GetFoo();
return foo; // your hover-foo is great