用dowhile0消除代码冗余一例

用dowhile0消除代码冗余一例

今天要改一个旧函数,其结构大致如下
    void   * =   new  xxxx; // 申请资源
   BOOL bRet  =  TRUE;

   
//  函数失败后错误处理
   bRet  =  fun1();
   
if ( ! bRet) 
   {
      delete p;   
      p 
=  NULL;
      
return  false ;
   }

   bRet 
=  fun2();
   
if ( ! bRet) 
   {
      delete p;   
      p 
=  NULL;
      
return   false ;
   }

   bRet 
=  fun3();
   
if ( ! bRet) 
   {
      delete p;   
      p 
=  NULL;
      
return   false ;
   }

   
// .......

   
//  最后释放资源并返回
    delete p;   
    p 
=  NULL;
    
return   true ;
这时候可以引入goto 改成
   bRet  =  fun1();
   
if ( ! bRet) 
   {
       
goto  errHandle;
   }
   
   
//.......

errHandle:
   delete p;
   p 
=  NULL;
   
return   false ;
但由于goto的特殊性,还是尽量避免。今天改函数时忽然想到可以利用while 中的break来实现第一段代码中相同的资源管理效果,上网查证后,改成如下:
do
{  
   bRet 
=  fun1();
   
if ( ! bRet) 
   {
       
break ; // 资源管理效果同第一段代码的方式
   }

   bRet 
=  fun1();
   
if ( ! bRet) 
   {
       
break ;
   }

   bRet 
=  fun1();
   
if ( ! bRet) 
   {
       
break ;
   }
   
   
// ......

}while(0)
   delete p;
   p 
=  NULL;
   
return  bRet;

你可能感兴趣的:(用dowhile0消除代码冗余一例)