首页 > 代码库 > 重构改善既有代码的设计--简化条件表达式

重构改善既有代码的设计--简化条件表达式

一 简化条件表达式

这个是几乎所有的工程都会存在的问题,不当的条件表达式造成代码的冗余。

下面我们列出普遍的问题,并给出一般的应对方法。

【1】条件判断过长,表达不清晰。

 if((i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0]))
   {   ....   }
 解决办法:将很长的判断式子封装成函数或者定义成宏。并以一个清晰表达意图的名字命名,这种做法在现代oop语言中很常见,比如 java c# 中就大量使用这种手法。

#define  TrangelPos  (i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0])

if(TrangelPos)
 ..................

【2】检查条件不同,最终处理的行为一致。

if (header == "业务操作日志")
         {
             OperationLog operationLog = new OperationLog();
             operationLog.Show();
             this.Close();
          }
         else if (header == "就业帮扶")
          {
             JobHelp jobhelp = new JobHelp();
             jobhelp.Show();
             this.Close();
          }
         else if (header == "统计报表")
         {
            ReportStatistics reportStatistics = new ReportStatistics();
            reportStatistics.Show();
            this.Close();
          }
 解决办法:将代码中相同的部分抽取出来。

   private UserControl ItemFactory(String header)
        {
            if (header == "就业协议书鉴证")
                return new JobCertificationShow();

            else if (header == "毕业生就业调整")
                return new EmploymentAdjustShow();

            else if (header == "成教生业务")
                return new AEStudentsCheckInShow();

}
  UserControl SelectedItem=ItemFactory(header);
  if(SelectedItem!=null)
      SelectedItem.Show();
  this.close();


【3】大量使用控制标记。

for(int i=0;i<len;i++)
{
  if(!found)
  {
       if(...)
        {
            found=true; 
         }
   }

}

 解决办法:用break或者是continue来取代标记。

for(int i=0;i<len;i++)
{
       if(...)
        {
           break;
         }
}

【4】大量的判断条件的嵌套

if(...)
     result=...;
else if(...)
       result=...;
else
{
     if(...)
         result=...;
}

return result;

 解决办法:大量的嵌套导致表达不清,用卫语句去除嵌套。

if(....) return ....
else if(...) return...
else  return ....

【5】使用类型码区分不同的类型

switch(type){

      case 1: return getBase1();
      
      case 2: return getBase2();

      case 3: return getBase3();

      case 4: return getBase4();

}
 解决办法:之所以或有类型码是因为在一些场合某个对象的一些特性有稍许的不同,比如说我想将一些绘图操作封装到一个draw类中。刚开始的时候可能我的业务逻辑不是很复杂,这个类只用来画圆。但是后来的情况变了,它在某个情况下要能画正方形,在另一种情况下要能画三角形。那么就会有人用类型码去判断 draw 类该画什么。但是这样的做法可能会导致会面的逻辑很复杂,所以最好的办法就是用多态来替换类型码。对于正方形,三角形,圆形实现不同子类。

shape{
   draw();
}

Trangel extends shape{

    draw()
   {
     .....
    }
}

Rectangel extends shape{

    draw()
   {
     .....
    }
}

Circel extends shape{

    draw()
   {
     .....
    }
}

shape b;

b=new Trangel(0;
b.draw();//三角形

b=new Rectangel();
b.draw();//矩形

b=new Circel();//圆形
b.draw();

【6】对null对象的大量判断

object=getobject();
if(objct!=null) object.action();
else ...

 解决办法:定义一个object 对应的 null 对象。使得null 对象和object 对象的行为统一。

getobject()
{
   if(this==null)
      return nullobject;
   return object;
}

nullobject{
   action()
     {
      ........
      } 
}

object = getobject();
object.action();


重构改善既有代码的设计--简化条件表达式