重構改善既有代碼的設計:簡化條件表達式

轉載自:http://blog.csdn.net/linsheng9731/article/details/39637323#comments


一、簡化條件表達式

這個是幾乎所有的工程都會存在的問題,不當的條件表達式造成代碼的冗餘。

下面我們列出普遍的問題,並給出一般的應對方法。

【1】條件判斷過長,表達不清晰。

  1. if((i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0]))  
  2.   {   ....   }  
 解決辦法:將很長的判斷式子封裝成函數或者定義成宏。並以一個清晰表達意圖的名字命名,這種做法在現代oop語言中很常見,比如 java c# 中就大量使用這種手法。

  1. #define  TrangelPos  (i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0])  
  2.   
  3. if(TrangelPos)  
  4.  ..................  

【2】檢查條件不同,最終處理的行爲一致。

  1. if (header == "業務操作日誌")  
  2.          {  
  3.              OperationLog operationLog = new OperationLog();  
  4.              operationLog.Show();  
  5.              this.Close();  
  6.           }  
  7.          else if (header == "就業幫扶")  
  8.           {  
  9.              JobHelp jobhelp = new JobHelp();  
  10.              jobhelp.Show();  
  11.              this.Close();  
  12.           }  
  13.          else if (header == "統計報表")  
  14.          {  
  15.             ReportStatistics reportStatistics = new ReportStatistics();  
  16.             reportStatistics.Show();  
  17.             this.Close();  
  18.           }  
 解決辦法:將代碼中相同的部分抽取出來。

  1.    private UserControl ItemFactory(String header)  
  2.         {  
  3.             if (header == "就業協議書鑑證")  
  4.                 return new JobCertificationShow();  
  5.   
  6.             else if (header == "畢業生就業調整")  
  7.                 return new EmploymentAdjustShow();  
  8.   
  9.             else if (header == "成教生業務")  
  10.                 return new AEStudentsCheckInShow();  
  11.   
  12. }  
  13.   UserControl SelectedItem=ItemFactory(header);  
  14.   if(SelectedItem!=null)  
  15.       SelectedItem.Show();  
  16.   this.close();  


【3】大量使用控制標記。

  1. for(int i=0;i<len;i++)  
  2. {  
  3.   if(!found)  
  4.   {  
  5.        if(...)  
  6.         {  
  7.             found=true;   
  8.          }  
  9.    }  
  10.   
  11. }  

 解決辦法:用break或者是continue來取代標記。

  1. for(int i=0;i<len;i++)  
  2. {  
  3.        if(...)  
  4.         {  
  5.            break;  
  6.          }  
  7. }  

【4】大量的判斷條件的嵌套

  1. if(...)  
  2.      result=...;  
  3. else if(...)  
  4.        result=...;  
  5. else  
  6. {  
  7.      if(...)  
  8.          result=...;  
  9. }  
  10.   
  11. return result;  

 解決辦法:大量的嵌套導致表達不清,用衛語句去除嵌套。

  1. if(....) return ....  
  2. else if(...) return...  
  3. else  return ....  

【5】使用類型碼區分不同的類型

  1. switch(type){  
  2.   
  3.       case 1: return getBase1();  
  4.         
  5.       case 2: return getBase2();  
  6.   
  7.       case 3: return getBase3();  
  8.   
  9.       case 4: return getBase4();  
  10.   
  11. }  
 解決辦法:之所以或有類型碼是因爲在一些場合某個對象的一些特性有稍許的不同,比如說我想將一些繪圖操作封裝到一個draw類中。剛開始的時候可能我的業務邏輯不是很複雜,這個類只用來畫圓。但是後來的情況變了,它在某個情況下要能畫正方形,在另一種情況下要能畫三角形。那麼就會有人用類型碼去判斷 draw 類該畫什麼。但是這樣的做法可能會導致會面的邏輯很複雜,所以最好的辦法就是用多態來替換類型碼。對於正方形,三角形,圓形實現不同子類。

  1. shape{  
  2.    draw();  
  3. }  
  4.   
  5. Trangel extends shape{  
  6.   
  7.     draw()  
  8.    {  
  9.      .....  
  10.     }  
  11. }  
  12.   
  13. Rectangel extends shape{  
  14.   
  15.     draw()  
  16.    {  
  17.      .....  
  18.     }  
  19. }  
  20.   
  21. Circel extends shape{  
  22.   
  23.     draw()  
  24.    {  
  25.      .....  
  26.     }  
  27. }  
  28.   
  29. shape b;  
  30.   
  31. b=new Trangel(0;  
  32. b.draw();//三角形  
  33.   
  34. b=new Rectangel();  
  35. b.draw();//矩形  
  36.   
  37. b=new Circel();//圓形  
  38. b.draw();  

【6】對null對象的大量判斷

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

 解決辦法:定義一個object 對應的 null 對象。使得null 對象和object 對象的行爲統一。

  1. getobject()  
  2. {  
  3.    if(this==null)  
  4.       return nullobject;  
  5.    return object;  
  6. }  
  7.   
  8. nullobject{  
  9.    action()  
  10.      {  
  11.       ........  
  12.       }   
  13. }  

  1. object = getobject();  
  2. object.action();  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章