2012-01-26 89 views
0

我有一個方法,其目的是檢索收集項目。使用布爾標誌優化方法

一個集合可以包含各種項目,比如說:鋼筆,鉛筆和紙張。

第一個參數允許我告訴方法只檢索通過的itemType(例如,只是鋼筆和鉛筆)。

第二個參數標記函數使用集合的默認項目類型。

getCollectionItems($itemTypes,$useCollectionDefaultItemTypes) { 
    foreach() { 
     foreach() { 
      foreach() { 
       // lots of code... 

       if($useCollectionDefaultItemTypes) { 
       // get collection's items using collection->itemTypes 
       } 
       else { 
       // get collection's items using $itemTypes 
       } 

       // lots of code... 
      } 
     }  
    } 
} 

什麼感覺奇怪的是,如果我設置$ useCollectionDefaultItemTypes爲真,就沒有必要爲函數使用的第一個參數。我正在考慮重構這個方法到這樣兩個:

getCollectionItems($itemTypes); // get the items using $itemTypes 
getCollectionItems(); // get the items using default settings 

的問題是,這些方法都會有很多重複的代碼除了if語句區域。

有沒有更好的方法來優化呢?

+1

用什麼語言? – SLaks

+0

這是最初的PHP,但我爲了說明的目的對它進行僞編碼。 – jexx2345

回答

1

當你不使用它時,通過$itemTypes作爲null。你的if聲明檢查是否$itemTypes === null;如果是,則使用默認設置。

如果這是PHP的,我以爲是這樣,你可以讓你的方法簽名function getCollectionItems($itemTypes = null),然後你可以調用getCollectionItems(),它會調用它,如果你輸入了getCollectionItems(null)

1

編寫使用這種標誌的方法通常是個壞主意。我見過寫在幾個地方(here#16,叔叔鮑勃here和其他地方)。它使得該方法難以理解,閱讀和重構。

另一種設計是使用closures。你的代碼可能是這個樣子:

​​

這樣的設計比較好,因爲

  1. 它更靈活。當你需要決定三種不同的事情時會發生什麼?
  2. 您現在可以更容易地測試循環內的代碼
  3. 現在更容易閱讀,因爲最後一行告訴您「正在使用特定的處理方式獲取收集項目」 - 它像一個英語句子。
+0

感謝您的回覆。我真的很喜歡這裏的組織重點。 – jexx2345

1

是的,有一個更好的方法來做到這一點 - 雖然這個問題不是一個優化問題,而是一個風格問題。 (重複的代碼對性能影響不大!)

沿着原來的想法的線條實現這個最簡單的方法是使getCollectionItems()不帶參數的形式定義默認參數,然後調用它的版本,需要一個參數:

getCollectionItems($itemTypes) { 
    foreach() { 
     foreach() { 
      foreach() { 
       // lots of code... 
       // get collection's items using $itemTypes 
      } 
      // lots of code... 
     } 
    }  
} 

getCollectionItems() { 
    getCollectionItems(collection->itemTypes) 
} 

根據您所使用的語言,你甚至可以用默認參數摺疊這些成一個單一的功能定義:

getCollectionItems($itemTypes = collection->itemTypes) { 
    foreach() { 
     foreach() { 
      foreach() { 
       // lots of code... 
       // get collection's items using $itemTypes 
      } 
      // lots of code... 
     } 
    }  
} 

這已清楚地表達自己原來的想法,這是個優勢如果提供,則使用$itemTypes;如果不使用,則使用collection->itemTypes

(這一點,當然,假設你在談論一個單一的「集合」,而不是那些foreach迭代一個是對集合迭代。如果你的想法使用null值是好的。)