当前位置:  开发笔记 > 编程语言 > 正文

为什么"带有循环索引的猴子"不好?

如何解决《为什么"带有循环索引的猴子"不好?》经验,为你挑选了3个好方法。

史蒂夫麦康奈尔的一个清单项目是你不应该使用循环索引(第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();

我一直以来受到质疑有关代码审查问题,并发现我的关节为什么它是不好的做法,是没有那么强,因为我会很喜欢.我说很难理解循环的流程,因此难以维护和调试,并且最终在代码的生命周期内更加昂贵.

是否有更好的阐述为什么这是不好的做法?



1> Marc Gravell..:

好吧,这会增加混乱的目的很少 - 你可以轻松地写:

while(MyControl.TabPages.Count > 0)
{
    MyControl.TabPages.Remove(MyControl.TabPages[0]);
}

或(更简单)

while(MyControl.TabPages.Count > 0)
{
    MyControl.TabPages.RemoveAt(0);
}

或(最简单)

MyControl.TabPages.Clear();

在上述所有情况中,我不必眯眼并考虑任何边缘情况; 很清楚会发生什么事情.如果要修改循环索引,可以快速使其难以理解.



2> PEZ..:

我认为你的表达很棒.也许它可以像这样措辞:

由于逻辑可以表达得更清楚,它应该.



3> Toon Krijthe..:

这都是关于期望的.

当使用循环计数器时,您期望循环的每次迭代以相同的量递增(递减).

如果你使用循环计数器弄乱(或者你喜欢猴子),你的循环就不会像预期的那样.这意味着它更难理解并且增加了代码被误解的可能性,并且这引入了错误.或者(错误地)引用一个明智但虚构的角色:

complexity leads to misunderstanding

misunderstanding leads to bugs

bugs leads to the dark side.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有