翻译《有关编程、重构及其他的终极问题?》——12.当使用拷贝黏贴,一定要特别注意最后一行
标签(空格分隔): 翻译 技术 C/C++
作者:Andrey Karpov
翻译者:顾笑群 - Rafael Gu
最后更新:2016年12月23日
12.当使用拷贝黏贴,一定要特别注意最后一行
这次这个bug是在Source SDK项目中发现的。PVS-Studio的诊断是这么描述这个而错误的:V525 The code containing the collection of similar blocks. Check items ‘SetX’, ‘SetY’, ‘SetZ’, ‘SetZ’(译者注:大意是代码中包含了一些近似的块,请检查’SetX’,’SetY’,’SetZ’,’SetZ’)。
inline void SetX( float val );
inline void SetY( float val );
inline void SetZ( float val );
inline void SetW( float val );
inline void Init( float ix=0, float iy=0,
float iz=0, float iw = 0 )
{
SetX( ix );
SetY( iy );
SetZ( iz );
SetZ( iw );
}
解释
我可以100%确认这段代码是复制黏贴的。其中一行被复制了多次,其中只有部分字母改变了。最后,这种方式让程序员犯错了:他的注意力减弱了,然后忘记了把最后一行的‘Z’改成‘W’。
在这个例子中,我们不会把焦点放在程序员如何犯错这点上,我们要注意的是在单调的行为的最后,错误发生了。
我非常建议大家读一读“最后一行的影响”这篇文章,因为大家对这篇文章的关注,一个更系统的版本已经发布了。
在这篇文章中,简单的来说,主要通过统计的数据阐明了用拷贝黏贴的方式,非常有可能在最后一行犯错。
正确的代码
{
SetX( ix );
SetY( iy );
SetZ( iz );
SetW( iw );
}
建议
我希望你已经读了我前面提到的文章,这样,我们可以再次处理接下来的现象。当我们写一些近似的代码块时,程序员经常会复制黏贴有轻微改变的代码。当这么做时,他们容易忘记改变一些特定的单词或字母,而且因为注意力的减弱,这最容易在这些单调反复的动作的最后发生。
为了减少类似的错误,这里有一些技巧:
- 把你的近似代码块放在“列表”中:这样就可以使得错误更明显。我们将会在下小节讨论“列表”代码布局。也许这种列表代码布局在这个例子中不是特别有效,但依然对编程是很有帮助的。
- 当使用复制黏贴是,务必保持小心和谨慎。集中注意力,并且重复检查你写的代码——特别是最后几行。
- 已经知道了最后几行的影响;尝试把这些记在心里,并且告诉你的同事们。当你明确知道是什么导致你容易犯下这个错误时,就更容易避免犯这个错误。
- 和你的同事们分享“最后一行的影响”这篇文章。