Запустить один раз код: за пределами логического? - PullRequest
2 голосов
/ 06 августа 2010

Я борюсь за образец здесь.У меня есть довольно много задач, которые нужно запускать, но нужно запускать только один раз, если они еще не выполнялись.Все прямо сейчас обрабатывается if / then, логическими значениями и хеш-таблицей.Существуют также вложенные дочерние элементы с таким же эффектом (if / then, boolean), поэтому их родительский параметр if / then, boolean не устанавливается в true до самого конца.

В .NET есть какой-то типшаблон кода или класс для этого, который делает его проще / понятнее / меньше кода, или я слишком обдумываю это, и это именно то, что нужно сделать?

PS не стесняйтесь добавлять лучшие тегик этому посту, я бы не знал, что добавить, чтобы сделать его более наглядным, если есть термин

Ответы [ 4 ]

6 голосов
/ 06 августа 2010

Я не знаю, как закодированы ваши задачи, но кажется, что они могут быть инкапсулированы в команды , которые затем будут помещены в очередь или в какую-либо другую структуру данных.Как только они сняты с производства, их логика проверяется.Если им нужно запустить, они выполняются, и они не возвращаются в очередь.Если их логика говорит, что они не должны запускаться, они просто возвращаются в очередь, чтобы иметь возможность запускаться позже.

Ваш интерфейс будет выглядеть примерно так:

public interface ITaskSink {
  void AddTask(ICommandTask task);
}

public interface ICommandTask {
  bool ShouldRun();
  void Run(ITaskSink sink);
}

Задачиможет также быть в состоянии добавить другие задачи в структуру данных (таким образом, Run принимает ITaskSink в качестве параметра), покрывая ваше требование создания подзадачи.Задача может даже добавить себя обратно в приемник, устраняя необходимость в методе ShouldRun и упрощая ваш класс процессора задач.

5 голосов
/ 06 августа 2010

Если вы используете .NET 4.0, Lazy<T> generic может быть решением для того, что вы описываете, потому что оно оценивает свое значение не более одного раза.

Я не уверен, что точно понимаю ваш вариант использования, но нет никаких причин, по которым вы не могли бы вложить Lazy s для решения проблемы вложенных детей.

2 голосов
/ 06 августа 2010

Создайте личную статическую переменную, создайте свойство только для чтения, чтобы проверить наличие нулевой переменной в частной переменной, если переменная равна нулю, создать / инициализировать и просто вернуть значение закрытой переменной. В вашем коде реализации ссылка на свойство, а не на закрытую переменную.

2 голосов
/ 06 августа 2010

Я не точно уверен, что вы говорите, но полезный шаблон для сложной логики - это механизм правил .Они действительно просты в коде и могут управляться простыми таблицами истинности, которые либо компилируются в ваш код, либо сохраняются как данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...