Есть некая операция, которое состоит из последовательности действий.
void MyOperation
{
Action1();
Action2();
Action3();
}
Потребовалось повесить на это просмотр текущего прогресса. Причем на случай изменения действий (добавления, удаления, изменения цены действия), управление прогрессом не должно быть сложным и требовать пересчеты на калькуляторе.
void MyOperation
{
[CostAttribute(30)]
Action1();
[CostAttribute(40)]
Action2();
[CostAttribute(30)]
Action3();
}
А в самих функциях должен посчитаться общий прогресс (30 + 40 + 30) и текущий для действия (общий/текущий).
То есть если программист добавляет новое действие (Action4), он примерно оценивает, сколько оно будет выполняться и выставляет свою цену, например 100, не меняя остальные цены и соотношения.
Как такое можно сделать?
UPD:
Сначала мне пришло в голову сделать так. Поставить атрибут с ценой над каждым определением действия. Но действие может иметь разную цену в зависимости от контекста. Например, действие копирует файлы. В этом случае оно может использоваться в операции несколько раз, и цена его будет разная. Программист примерно представляет, сколько файлов имеется для копирования, а потому в одном случае это действие будет стоить 10 (примерно 1000 файлов), а в другом - 20 (примерно 2000 файлов). Короче не знаю как это сделать красивее и удобнее в понимании и программировании.
Ответ
Как вариант, можно обернуть MyOperation и Action в классы. В этом случае MyOperation хранит набор Action и выполняет их поочередно. После выполнения действия можно пересчитать прогресс выполнения, используя параметр action.Weight (он же цена).
public class MyOperation
{
List
public void Run()
{
foreach(var action in actions)
{
action.Execute();
this.ResearchProgress(action.weight);
}
}
}
Комментариев нет:
Отправить комментарий