运行一次代码:超越布尔值?

时间:2010-08-06 02:49:44

标签: .net design-patterns

我在这里努力争取一种模式。我有很多需要运行的任务,但如果以前没有运行,只需要运行一次。现在的所有内容都由if / then,booleans和hashtable处理。还有一些具有相同效果的嵌套子句(if / then,boolean)所以它们的父if / then,boolean在最后才设置为true。

在.NET中,是否存在某种代码模式或类,使其更简单/更清晰/更少代码,或者我是否过度思考它,这正是需要完成的方式?

<子> P.S。随意添加更好的标签到这篇文章,我不知道要添加什么,以使其更具描述性,如果有一个术语

4 个答案:

答案 0 :(得分:6)

我不知道您的任务是如何编码的,但似乎它们可以封装在commands中,然后将其放入队列或其他一些数据结构中。一旦它们出列,就会检查它们的逻辑。如果他们需要运行,则执行它们,并且它们不会被放回队列中。如果他们的逻辑说他们不应该运行,他们只是被放回队列中以便以后运行。

您的界面将是:

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

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

任务也可以将其他任务添加到数据结构中(因此RunITaskSink作为参数),涵盖您的子任务创建要求。任务甚至可以将自己添加回接收器,从而无需ShouldRun方法并简化任务处理器类。

答案 1 :(得分:5)

如果您使用的是.NET 4.0,那么Lazy<T> generic可能是您所描述内容的解决方案,因为它最多只评估一次值。

我不确定我是否完全理解您的用例,但是您无法将Lazy嵌套在一起以完成嵌套子问题。

答案 2 :(得分:2)

我不是确切地确定你在谈论什么,但复杂链式逻辑的一个有用模式是rules engine。它们非常易于编码,并且可以由简单的真值表驱动,这些真值表可以编译到代码中或作为数据存储。

答案 3 :(得分:2)

创建一个私有静态变量,创建一个只读属性来检查私有变量是否为null,如果变量为null,则实例化/初始化并返回私有变量值。在您的实现代码中引用属性,而不是私有变量。