2012-01-26 15 views
0

私はコレクションアイテムを取り出すことを目的としたメソッドを持っています。ブール型フラグを使用してメソッドを最適化する

コレクションには、アイテム、ペン、鉛筆、用紙などを混在させることができます。

最初のパラメータでは、私が渡したアイテムタイプ(たとえばペンや鉛筆)だけを取得するようにメソッドに指示できます。

第2パラメータは、コレクションのデフォルトアイテムタイプを使用する関数にフラグを付けます。奇妙な感じは何

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... 
      } 
     }  
    } 
} 

は、私がtrueに$ useCollectionDefaultItemTypesを設定した場合は、最初のパラメータを使用するための機能が必要でないということです。問題は方法がif文の地域を除いて重複したコードの多くを持っているということです

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

:私は、次のような二つにこのメソッドをリファクタリング検討していました。

これを最適化する方法がありますか?

+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. ので、このデザインが優れています。 3つの異なるものの間で決める必要があるときはどうなりますか?
  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値を使用するためのアイデアがあります良いものです)

関連する問題