史蒂夫麦康奈尔的一个清单项目是你不应该使用循环索引(第16章,第25页,循环索引,PDF格式).
这是直觉上的,并且是我一直遵循的练习,除非我学会了如何在当天编程.
在最近的代码审查中,我发现这个尴尬的循环并立即将其标记为可疑.
for ( int i=0 ; i < this.MyControl.TabPages.Count ; i++ ) { this.MyControl.TabPages.Remove ( this.MyControl.TabPages[i] ); i--; }
它几乎是有趣的,因为它设法通过将索引保持为零来工作,直到删除所有TabPages.
这个循环可以写成
while(MyControl.TabPages.Count > 0) MyControl.TabPages.RemoveAt(0);
而且由于控制实际上与循环几乎同时写入,它甚至可以写成
MyControl.TabPages.Clear();
我一直以来受到质疑有关代码审查问题,并发现我的关节为什么它是不好的做法,是没有那么强,因为我会很喜欢.我说很难理解循环的流程,因此难以维护和调试,并且最终在代码的生命周期内更加昂贵.
是否有更好的阐述为什么这是不好的做法?
好吧,这会增加混乱的目的很少 - 你可以轻松地写:
while(MyControl.TabPages.Count > 0) { MyControl.TabPages.Remove(MyControl.TabPages[0]); }
或(更简单)
while(MyControl.TabPages.Count > 0) { MyControl.TabPages.RemoveAt(0); }
或(最简单)
MyControl.TabPages.Clear();
在上述所有情况中,我不必眯眼并考虑任何边缘情况; 很清楚会发生什么事情.如果要修改循环索引,可以快速使其难以理解.
我认为你的表达很棒.也许它可以像这样措辞:
由于逻辑可以表达得更清楚,它应该.
这都是关于期望的.
当使用循环计数器时,您期望循环的每次迭代以相同的量递增(递减).
如果你使用循环计数器弄乱(或者你喜欢猴子),你的循环就不会像预期的那样.这意味着它更难理解并且增加了代码被误解的可能性,并且这引入了错误.或者(错误地)引用一个明智但虚构的角色:
complexity leads to misunderstanding misunderstanding leads to bugs bugs leads to the dark side.