控制流-检查例程是否可以在C#中运行(并运行它)的可能方法
本文关键字:运行 方法 例程 检查 是否 控制流 | 更新日期: 2023-09-27 18:00:39
我想知道如何在调用例程时检查其先决条件,以便它可以执行或通知其不可执行性。语言是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()
我想知道(在谷歌上没有发现)的是"规范的"/最常见的/"正确的"C#习语,它表示只有在满足某些先决条件的情况下才启动例程。
第一个例子是最常见的模式。对我来说,第二个只是第一个的变体,具有较少的语义命名约定。
第三个例子我会远离。不应使用异常来指导流量的正常控制。http://msdn.microsoft.com/en-us/library/vstudio/ms229030(v=vs.100).aspx
编辑:我收回它。第二个例子看起来很相似,但它要求控制器确定任务是否可以运行。如果"可运行性"仅基于任务对象的内容,而不是基于控制器的某些状态,那么我认为没有必要通过在控制器中进行检查来使事情复杂化。如果逻辑足够相似,我会使用一个基本任务类来保持干燥。
编辑:我不清楚你的确切用例,但这可能完全偏离了基础,但在我看来,控制器会询问任务是否准备好运行,如果准备好了,它会运行任务,如果没有,它会做其他事情。
if (task.CanRun)
{
controller.Run(task);
}
else
{
//Do whatver.
}
此外,如果逻辑被封装在控制器中,说明当任务无法运行时应该做什么,那么run方法可能应该返回一个布尔值,这样调用方就可以在需要时做一些额外的事情。在这种情况下,调用方只会将任务传给控制器run方法,在那里控制器会检查任务是否可以运行,并相应地采取行动。