0

何かを行い、さらに情報をログに記録するメソッドがある場合、ログを記録したりフラグを使用したりしたくない場合は、新しいメソッドを作成する必要がありますか?

public void MethodA(string myMessage, bool logIt)
{
  if(logIt)
  {
    //do stuff with logging
  }
  {
    //don't need to log
  }
}

...対...

public void MethodA(string myMessage)
{
  //do stuff with logging
}

public void MethodANoLogging(string myMessage)
{
  //don't need to log
}

私のシナリオは単純で、主に flag パラメーターに関心があります。これは、同じメソッド内で多くの if...else if...else if シナリオを作成する列挙型である可能性があります。別の名前で新しいメソッドを作成するだけではありません。メソッドが 1 つの責任を持つことができるので、私は 2 番目の解決策 (新しい方法) を支持します。基本的に、それはより単純なソリューションです。

フラグ バージョンを使用する理由は何ですか?

4

4 に答える 4

3

ない。ロギング構成は、ビジネスメソッドから完全に独立している必要があります。それがAOPの目的です。

于 2009-08-26T00:11:21.280 に答える
2

ブール値フラグを使用してメソッドをオーバーロードすることは (ほとんど) すべきではありません。さまざまな理由があります。

  1. 混乱を避けるために、メソッドは 1 つのことだけを行う必要があります。ブール値フラグは、メソッドが複数のことを行うことを明確に示しています ( Robert C. Martinから)。

  2. このようなメソッドのコードを読むと、何が起こっているのか正確にわかりません。コードが初めての場合は、次のように表示されます。

    MethodA("これはメッセージです", false);

    false が何を意味するのかは、コードを見ない限り完全には明らかではありません。これは、メソッドの意図はその名前だけで明確でなければならないという原則に反しています。

  3. 後で複数の選択肢を追加する必要がある場合に、バイナリ選択肢に不必要にバインドすることがあります。例:メソッドがあるとしましょう:

    public UpdateCustomer(String name, boolean isPremiumCustomer);

後で別のカテゴリの顧客を追加することにした場合は、このメソッドを呼び出すすべてのコード行をリファクタリングする必要があります。あなたの状況のより良い例は、デバッグフラグがオンになっている場合にのみログに記録するようなメソッドが必要な場合です。

代替アプローチは、おおよそ次のとおりです。

  1. 別の名前で関数を作成します。これはあなたが取ったアプローチであり、おそらく私が好むアプローチです。ほとんどの場合、例のように a: doSomething と doSomethingADifferentWay があれば十分です。ただし、フラグを取る 2 番目のメソッドが必要な場合は、オプション 2 を検討する必要があります。

  2. オプションを説明する列挙型を作成します。あなたの場合、これは次のようになります: enum EnableLogging { ENABLE_LOGGING, DISABLE_LOGGING } 次に、コードを次のように記述します。

    MethodA("メッセージ", DISABLE_LOGGING);

これは少なくとも明示的です。(注: この解決策は、Joshua Bloch による『 Effective Java 2nd Edition』の項目 40 に由来しますが、他の言語にも同様に適用できます)。

于 2009-10-21T01:49:43.270 に答える
1

通常、それを考えすぎないようにするために、デフォルトで「false」にオーバーロードします

public void MethodA(string myMessage)
{
    MethodA(myMessage, false);
}

public void MethodA(string myMessage, bool logIt)
{
  if(logIt)
  {
    //do stuff with logging
  }
  {
    //don't need to log
  }
}

それは私の個人的な好みです、私は他の人が同意しないと確信しています。ただし、すべての状況を網羅しているわけではありません。

于 2009-08-26T00:10:35.353 に答える
0

この種のことは際限なく議論されてきました (そして今後も議論される予定です) が、有名な答えは「場合による」です。

ログを記録するかどうか (つまり、アプリケーション内で副作用がないことを意味します) のようなものについては、新しいメソッドを作成することは絶対にありません。ロジックを複製する必要があります。これは、実際の理由もなく、将来的に 2 つの場所でロジックを維持することを意味します。次のようなことをする方が理にかなっています...

if(logIt) // log information

// do something

if(logIt) // log other info

// do more

....etc

ログを記録するかどうかに関係なく、コア ロジックは同じであり、1 か所にしかありません。

于 2009-08-26T00:00:15.420 に答える