つを持つべきであるように明白なリファクタリングが頭に浮かぶようだ:
else
を削除します。今、IFSは、より簡単に再配置することができます。
if (phase == ...)
が常に外側になるようにifを並べ替えます。
あなたがしたい場合は、私はif (phase == 1)
複数回、次のステップのために準備することを繰り返すことと思いますが、if (phase == 1)
ブロックを組み合わせることであれば、ブロックを並べ替えることができます。
これらのリファクタリングにより、以下のようなリファクタリングが簡単に適用できます。
internal void Configure(ButtonEventArgs args, IBroker broker, FunctionEntry entry)
{
int phase = broker.TradingPhase;
if (phase == 1)
{
if (args.Button == ItemType.SendAutoButton)
{
entry.SetParameter("ANDealerPrice", -1);
entry.SetParameter("ANAutoUpdate", 4);
}
}
if (phase == 2)
{
if (args.Button == ItemType.SendAutoButton)
{
entry.SetParameter("ANDealerPrice", -1);
entry.SetParameter("ANAutoUpdate", 2);
}
}
if (phase == 1)
{
if (broker.IsCashBMK)
{
entry.SetParameter("Value", 100);
}
}
if (phase == 1)
{
if (broker.IsCross)
{
entry.SetParameter("Value", 200);
}
}
}
今あなたが小さな場合、ブロックの長いリストを持っています。これは、List<MyAction>
にリファクタリングすることができます。どこかで、あなたはこのリストを移入する必要がありますが、それを横断することは非常に簡単です:
internal void Configure(ButtonEventArgs args, IBroker broker, FunctionEntry entry)
{
foreach(var action in MyActions)
{
action(args, broker, entry);
}
}
internal void PopulateMyActions()
{
// Hopefully I have not made a syntax error in this code...
MyActions.Add((ButtonEventArgs args, IBroker broker, FunctionEntry entry) =>
{
if (broker.TradingPhase == 1)
{
if (args.Button == ItemType.SendAutoButton)
{
entry.SetParameter("ANDealerPrice", -1);
entry.SetParameter("ANAutoUpdate", 4);
}
}
});
// And so on
}
代替は、位相== 1と位相== 2のための別々のリストを作成し、呼び出しからaction
にブローカーを除外することです:
internal void Configure(ButtonEventArgs args, IBroker broker, FunctionEntry entry)
{
int phase = broker.TradingPhase;
foreach(var action in MyActions[phase])
{
action(args, entry);
}
}
internal void PopulateMyActions()
{
// Hopefully I have not made a syntax error in this code...
MyActions[1].Add((ButtonEventArgs args, FunctionEntry entry) =>
{
if (args.Button == ItemType.SendAutoButton)
{
entry.SetParameter("ANDealerPrice", -1);
entry.SetParameter("ANAutoUpdate", 4);
}
});
// And so on
}
phase
の特別な役割をより明確にするため、私は後者を好むと思います。
追加のリファクタリングはaction(args, entry)
をaction(args.Button, entry)
に置き換えることができますが、それが適切かどうかは判断できません。
今後、リストを作成することは動的に行うことができます。アセンブリをロードするとき。どのアセンブリをロードするかは、構成設定によって制御できます。 Presto:コアコードを再コンパイルせずに動作を切り替えましょう!
PS:現時点でコンパイラから離れているので、コードはテストされていません。私の答えを編集して構文エラーを削除し、MyActions
などの宣言を追加してください。
+1は、ソリューションの簡素化(および可読性)のためです。これまでのところ、これは私にとって最も受け入れられる答えです。ありがとう。 –