На ум приходят два очевидных рефакторинга:
- Удалите
else
: теперь символы if можно упростить.
- Переставьте if, чтобы
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);
}
}
}
Теперь у вас есть длинный список маленьких if-блоков. Это может быть преобразовано в 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
и т. Д.