我工作的一个应用程序只做一件事,从外面看世界。将文件作为输入,约5分钟后吐出另一个文件。
内部发生的事实上是一系列连续的动作。在我们看来,应用程序的结构很好,因为每个操作都像一个小盒子,没有太多的依赖。
通常一些后面的操作使用前一个操作中的一些信息,只有少数信息可以并行执行 - 为了简单起见,我们更喜欢执行顺序操作。
现在的问题是执行所有这些操作的函数就像一个批处理文件:一个包含不同参数的不同函数调用的长列表。所以,查看代码看起来像:
main
{
try
{
result1 = Action1(inputFile);
result2 = Action2(inputFile);
result3 = Action3(result2.value);
result4 = Action4(result1.value, inputFile);
... //You get the idea. There is no pattern passed paramteres
resultN = ActionN(parameters);
write output
}
catch
{
something went wrong, display the error
}
}
您如何为此应用程序的主要功能建模,因此不仅仅是一长串命令?
答案 0 :(得分:2)
并非所有东西都需要适合聪明的模式。表达一系列命令性陈述的优雅方式几乎没有,而是一系列强制性陈述。
如果您认为自己目前缺乏某种灵活性,请表达,我们可以尝试提出解决方案。
如果某些操作和结果的集群经常被重复使用,您可以将它们拉出新功能并从中构建“聚合”操作。
您可以查看数据流语言和库,但我希望增益很小。
答案 1 :(得分:0)
不确定这是否是最佳方法,但您可以拥有一个存储所有结果的对象,然后依次将其提供给每个方法。每个方法都会读取它需要的参数并在那里写出结果。然后,您可以拥有一组操作(作为实现接口的委托或对象)并在循环中调用它们。
class Results
{
public int Result1 { get; set; }
public string Result2 { get; set; }
…
}
var actions = new Action<Results>[] { Action1, Action2, … };
Results results = new Results();
foreach (var action in actions)
action(results);
答案 2 :(得分:0)
您可以考虑从Windows Workflow实施顺序工作流
答案 3 :(得分:0)
首先,这个解决方案还不错。如果操作是不相关的,我的意思是不同的操作之间或操作与环境之间没有全局参数或其他隐藏的依赖关系,这是一个很好的解决方案。易于维护或阅读,当您需要扩展功能时,您只需添加新操作,当“数量”更改时,您只需添加或删除宏序列中的行。如果不需要经常更改流程链:不要移动!
如果它是一个系统,其中动作的实现通常不会改变,但是它们的顺序和参数是,你可以设计一个简单的脚本语言,并将宏类转换为该脚本。此脚本应由您以外的其他人维护,该人员在您的“操作”级别中熟悉问题域。因此,他/她可以在没有您帮助的情况下使用脚本语言组装应用程序。
这种问题分裂的一个很好的方法是数据流编程(a.k.a.基于流程的编程)。在数据流编程中,有预先编写的组件。组件是黑盒子(从应用程序开发人员的角度来看),它们具有消费者(输入)和生产者(输出)端口,它们可以连接以形成处理网络,然后是应用程序。如果域中有一组良好的组件,则无需编写新组件即可创建许多应用程序。此外,组件可以由其他组件构建(它们称为复合组件)。
维基百科(良好的起点): http://en.wikipedia.org/wiki/Dataflow_programming http://en.wikipedia.org/wiki/Flow-based_programming
JPM的网站(书籍,维基,一切): http://jpaulmorrison.com/fbp/
我认为,更大的系统必须具有您描述为“宏”的分裂点。甚至游戏都有这一点,例如FPS游戏有3D引擎和游戏逻辑脚本,或者是SCUMM VM,它们是相同的。