不要轻易跳转程序控制流程——少用break、continue与return
最近调试程序时遇到一bug,花了近一天时间才找到原因。而这错误原本是完全可以避免的——如果写程序规范一点的话。
引起错误的代码逻辑大致如下:
while(true)
{
isoK = applyResource();
if (isOk)
{
// do some job
if (condition)
{
// ...
break;
}
}
if (something)
{
// ...
continue
}
// ...
releaseResource();
}
代码不长,但是里面有两处bug,这次被触发的就是其中一处。程序的本意是每次循环开始时申请资源,退出时释放资源。但是代码中的break和continue语句却导致流程的跳转,最终资源耗尽,引起程序错误。(applyResource的设计本身也有问题,另文讨论。)
总说写程序时尽量避免控制流程的跳转,尽量少用break、continue和return这些会改变流程的语句,甚至亏也吃了不止一次,可就是不当回事。不光这次,我在实际工作中看到、听到的大部分问题如果按照教科书上的规范做法去写代码都可以避免。可是大家宁愿一再地出bug也不愿规范的写代码:或者认为规范写法太复杂,或者认为规范写法多此一举。
这次又遇到这样的bug,对代码作者,我实在是无话可说了。唯一想做的是仰天长啸,但在公司的格子里这么做又未免太出风头了,只好憋着。