do while(false) :提高代码质量

do whilefalse)  :提高代码质量


经常会遇到这样的情况,一大段代码,中间遇到某种情况,比如someObj == null,需要跳出这段代码,但是又不在循环之中,只好处理成这样:


if(someObj != null){
  //doSomething
 
  if(someOther fit someCondition){
   
  }
}
最后造成一大堆括号,写起来不舒服,可读性也很差。

巧用do...while(false)可以解决这个问题,看下面的代码:

function LTrim(s){
  try{
    do{
      if(null==s||s.length<=0)
        break;
      var whitespace=" /t/r/n";
      if(whitespace.indexOf(s.charAt(0))>=0){
        var len=s.length;
        var index;
        for(index=0;index  if(whitespace.indexOf(s.charAt(index))<0)
            break;
        if(index s=s.substring(index);
        else s="";
      }
    }while(false);
  }catch(Ab){
  s="";
  }
  return s;
}

这个函数是用来去掉字符串前端的空白。使用do...while(false)的用意就在于在do{}的过程中可以break,使得函数唯一的出口就是最后一行的return。
嗯,这是一个不错的方法。以后可以采用,避免过多的嵌套括号。


 

 

另一个好处:

比如你想用一个宏,其中包括多行代码。怎么办?这样写?:
#define   mymacro(p)   statement1;   statement2
如果你需要将这个mymacro放到if里用:
if(cond)
        mymacro(p);
else
        something   else
那么我想各位都看出问题了吧?

好的,一种解决方案是用{}括住宏中的两句话:
#define   mymacro(p)   {statement1;   statement2;}
这回看上去是没问题了吧?试试看还是不行。在
mymacro(p);
这样的调用中会出现问题:}后面多了一个;。mymacro(p);被展开为:
{statement1;   statement2;};
尽管在C中;可以单独用作一行,但在}后面加;却是错误的。

这时候就是do-while大显身手的时候了:
#define   mymacro(p)   do   {   statement1;   statement2;   }   while(FALSE)
看,
mymacro(p);
被解释为:
do   {   statement1;   statement2;   }   while(FALSE);
这回就没问题了!在这里,我们说do-while“吸收”了多余的分号。

这里有两个问题:
1   因为while的条件是一个编译时常数FALSE,大多数编译器会对其进行优化(完全消除循环的结构),因此无需担心效率问题;
2   如果你因为担心用一个“循环”来取代代码会产生开销而问出了第一个问题,那么请不要告诉我用函数调用去取消宏。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值