0

我想知道在调用例程时如何检查例程的先决条件,以便它可以执行或通知其不可执行性。语言是 C#。

我正在使用一个 Controller 对象、一个 DataContainer 对象和一些 Task 对象来实现一个Pipeline 设计模式。当控制器要求执行任务时,每个任务都有责任检查其适用性。具体来说,它应该检查 DataContainer 对象的可用数据。

我可以想象一些在 Python 中做到这一点的方法:

# 
if Task.can_run():
    Task.run()
else:
    Task.notify_controller()

# 
if Controller.check_runnability(Task):
    Task.run()
else:
    Controller.do_something_else()

# Task.can_run() throws exception instead of returning boolean:
try:
    Task.can_run();
except:
    Controller.do_something_else()  # or maybe Task.notify_controller()
else:
    Task.run()

# not sure about syntax for the following assertion, but you get the idea
assert (Task.can_run(), Task.notify_controller())
Task.run()

我想知道(但在 Google 中没有找到)是“规范”/最常见/“正确”的 C# 习惯用法,仅在满足某些先决条件时才开始例程。

4

1 回答 1

1

第一个例子是最常见的模式。对我来说,第二个只是第一个的变体,具有较少的语义命名约定。

第三个例子我会远离。不应使用异常来指导正常的流程控制。http://msdn.microsoft.com/en-us/library/vstudio/ms229030(v=vs.100).aspx

编辑:我收回了。第二个示例看起来很相似,但它要求控制器确定任务是否可以运行。如果“可运行性”仅基于任务对象的内容而不是基于控制器的某些状态,那么我认为没有必要通过在控制器中进行检查来使事情复杂化。如果逻辑足够相似,我会使用基本任务类来保持干燥。

编辑:我不清楚你的确切用例,但所以这可能完全不符合要求,但对我来说,控制器似乎会询问任务是否准备好运行,如果是,它将运行任务,如果不是,它会做点别的。

if (task.CanRun)
{
    controller.Run(task);
}

else
{
    //Do whatver.
}

此外,如果逻辑封装在控制器中,即当任务无法运行时应该做什么,那么 run 方法可能应该返回一个布尔值,以便调用者可以在需要时做一些额外的事情。在这种情况下,调用者只需将任务传递给控制器​​运行方法,然后控制器在其中检查任务是否可以运行并采取相应措施。

于 2013-02-22T16:56:01.800 回答