次のコードブロックでdoSomethingCommon()
の重複使用を回避するにはどうすればよいですか?
doSomething();
if (conditionA) {
doSomethingSpecificToConditionA();
doSomethingCommon();
}
else if (conditionB) {
doSomethingSpecificToConditionB();
doSomethingCommon();
}
doSomethingElse();
NB: conditionAとconditionBの計算は負荷が高くなる可能性があります。
2つの条件付きブロックからのdoSomethingCommon()
の呼び出しは問題なく、技術的には[〜#〜] not [〜#〜]コードの複製です。条件付きブロックの1つだけが実行されるためです。いつでも。
ただし、doSomethingCommon()
が別のメソッドになっていない場合は、それをメソッドにリファクタリングし、同じものを再度呼び出す必要があります[〜#〜] not [〜#〜]コードの複製。
特別な条件ハンドラー関数を導入します。
doSomething();
handleSpecialConditions();
doSomethingElse();
...
void handleSpecialConditions()
{
if (conditionA)
doSomethingSpecificToConditionA();
else if (conditionB)
doSomethingSpecificToConditionB();
else
return;
doSomethingCommon();
}
メソッドで複数の条件を回避するために継承の使用を検討する
public class SomethingA : Something
{
public override void DoSomething()
{
base.DoSomething() //all the common things
this.SpecialForASomethings();
}
}
したくない場合 抽出handleSpecialConditions()
Eternal21の提案のように (おそらくそうするべきです)、メモすることを検討してください:
doSomething();
bool flagA;
if (((flagA = conditionA)) || conditionB) {
if (flagA)
doSomethingSpecificToConditionA();
else
doSomethingSpecificToConditionB();
doSomethingCommon();
}
doSomethingElse();