通信人家园

标题: 优先考虑continue,慎用break  [查看完整版帖子] [打印本页]

时间:  2009-7-30 21:38
作者: ghh_bigpan     标题: 优先考虑continue,慎用break

         最近,接受了项目组的一项安排,给俺们的终端产品利用USB多映射出一个端口。心中惶惶然~USB技术这辈子还没有接触过,它的技术基础,实现方式等更是一点不懂!但任务在此,还是要赶鸭子上架啦。努力的复制粘贴外加一些小小的创新工作,修改了18个分散的源代码文件之后,代码工作初步完成。调试还算顺利,编译通过。
         狂喜!接下来用PC端串口工具做测试,问题就来了:PC端映射出来的端口只能接受广播来的消息,但不能主动发送消息!先怀疑自己的代码N遍,看了又看,想了又想,没有发现问题。利用usb通信抓取工具,也没有发现任何可疑之处(可能有,不过,我对USB协议一知半解都谈不上)。接近三天极度郁闷的调试工作,让人崩溃,但始终没有找到原因。更变态的是,这个端口偶尔还能正常发送命令。
         Bug必有因,代码里自有其逻辑。只是看你能不能敏锐发现那个藏匿极深能够让你脱离苦海的陷阱一个原程序中的初始化代码无意中闯入了视野:
  for (iface = FIRST_IFACE;
       iface < MAX_IFACE_NUM;
       iface++)
  {
    if (iface == BREW_NOTIFICATION_IFACE)
      break;
         ……………………
}
     原来代码中,BREW_NOTIFICATION_IFACE接口是在一个枚举中最后的,但这个接口又不需要初始化,所以当初开发的人员冒昧的选择了break,退出循环。而我加的接口在这个接口之后,所以我的接口完全没有初始化。也就没有注册上USB端口的中断。所以造成了产品终端不能检测外来的任何输入!!!
S*H*I*T,在心里尽量文明的狂骂了代码提供商N遍,把break改成了continue,重新编译,下载,验证。一切OK!!!从地狱升入天堂!

这个故事告诉我们:在循环里,要优先考虑continue,慎用break,除非有绝对的理由

谨以此文,纪念一个break抹杀掉的我的三天青春!!!!!
时间:  2009-8-3 15:27
作者: truelance

结论不正确。continue和break逻辑不一样,没有什么优先考虑的问题。
而且我怀疑你现在的代码仍有bug,如果你没有用break, 实际使用的接口数又没有到MAX_IFACE_NUM,不是浪费了N多资源?不知道在最大流量下是否影响性能?
时间:  2009-8-3 16:33
作者: shenhqi

从软件工程的角度讲,是不允许用Break的。
时间:  2009-8-3 16:46
作者: fahab0b

强烈同意,continue和break逻辑不一样,怎么叫优先考虑,
我觉得楼主应该再走读一下代码,肯定有问题!
时间:  2009-8-4 16:48
作者: lewy

退出循环用continue还是可以的,但是啊~~捏,小白不乱说话
时间:  2009-8-5 13:44
作者: ghh_bigpan

原帖由 truelance 于 2009-8-3 15:27 发表
结论不正确。continue和break逻辑不一样,没有什么优先考虑的问题。
而且我怀疑你现在的代码仍有bug,如果你没有用break, 实际使用的接口数又没有到MAX_IFACE_NUM,不是浪费了N多资源?不知道在最大流量下是否影响 ...


言之有理!
如果我表达成:慎用break,慎用continue可能大家更容易接受,呵呵!

break,continue这种语句,使用确实需要慎重,你要考虑到当前使用背景,
以及尽可能考虑到兼容以后代码各种扩展的可能性。
代码小,可能没什么感觉。如果代码多了,相当复杂了,就会造成难以解决难以复现的bug。

你后面说的,其实可以说是另外一个问题:
即:理论上可以支持的接口数,实际上使用的接口数;而我接触的代码中,MAX_IFACE_NUM是指后者。
时间:  2009-8-5 15:07
作者: truelance

如果MAX_IFACE_NUM是实际使用的接口数,为什么BREW_NOTIFICATION_IFACE在原来的代码里又是最后一个接口呢?这两者之间是什么关系?

我们写代码时,通常在枚举中最后加一个不使用的XXX_BUTT,新增枚举值都要加载这个枚举之前。这样XXX_BUTT实际就表示枚举的个数了,循环中也不用break了。
for (iface = FIRST_IFACE;  iface < IFACE_TYPE_BUTT;  iface++)
时间:  2009-8-5 16:25
作者: ghh_bigpan

我表达不畅
代码编写实际上就是如你所言
所有接口定义在枚举里,最后一个不使用,表示接口数目。
时间:  2009-8-26 12:49
作者: huhuhu

屁股决定脑袋,LZ估计比较junior




通信人家园 (https://www.txrjy.com/) Powered by C114