web-dev-qa-db-ja.com

他に条件がある場合にコードの重複を回避するにはどうすればよいですか?

次のコードブロックでdoSomethingCommon()の重複使用を回避するにはどうすればよいですか?

doSomething();

if (conditionA) {
    doSomethingSpecificToConditionA();
    doSomethingCommon();
}
else if (conditionB) {
    doSomethingSpecificToConditionB();
    doSomethingCommon();
}

doSomethingElse();

NB: conditionAとconditionBの計算は負荷が高くなる可能性があります。

2
Ehtesham Hasan

2つの条件付きブロックからのdoSomethingCommon()の呼び出しは問題なく、技術的には[〜#〜] not [〜#〜]コードの複製です。条件付きブロックの1つだけが実行されるためです。いつでも。

ただし、doSomethingCommon()が別のメソッドになっていない場合は、それをメソッドにリファクタリングし、同じものを再度呼び出す必要があります[〜#〜] not [〜#〜]コードの複製。

5
nikhil jhaveri

特別な条件ハンドラー関数を導入します。

doSomething();

handleSpecialConditions();

doSomethingElse();

...

void handleSpecialConditions()
{
   if (conditionA)
      doSomethingSpecificToConditionA();
   else if (conditionB)
      doSomethingSpecificToConditionB();
   else
      return;

   doSomethingCommon();
}
4
Eternal21

メソッドで複数の条件を回避するために継承の使用を検討する

public class SomethingA : Something
{
    public override void DoSomething()
    {
        base.DoSomething() //all the common things
        this.SpecialForASomethings();
    }
}
1
Ewan

したくない場合 抽出handleSpecialConditions() Eternal21の提案のように (おそらくそうするべきです)、メモすることを検討してください:

doSomething();

bool flagA;
if (((flagA = conditionA)) || conditionB) {
    if (flagA)
        doSomethingSpecificToConditionA();
    else
        doSomethingSpecificToConditionB();
    doSomethingCommon();
}

doSomethingElse();
0
Deduplicator