2010-11-28 51 views
2

我工作的一个应用程序只做一件事,从外面看。以一个文件作为输入,并在~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

不知道这是否是最好的方法,但您可以有一个对象来存储所有结果,并且您将依次将其提供给每个方法。每个方法都会读取它需要的参数并在那里写出结果。然后,您可以收集一系列操作(作为委托或实现接口的对象)并在循环中调用它们。

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

首先,实施顺序工作流的,这个解决方案是远远不坏。如果这些行为是不连贯的,那么我的意思是不存在全局参数或不同行为之间或行为与环境之间的其他隐藏依赖关系,这是一个很好的解决方案。易于维护或阅读,并且当您需要扩展功能时,您只需添加新操作,当“数量”更改时,您只需添加或删除宏序列中的行。如果不需要经常更改流程链:不会移动

如果它是一个系统,其中动作的实现不会经常变化,但其顺序和参数是,您可以设计一个简单的脚本语言,并将宏类转换为该脚本。该脚本应该由您以外的其他人维护,他们熟悉您的“操作”级别中的问题域。所以,他/她可以在没有您的帮助的情况下使用脚本语言来组装应用程序

这种问题分裂的一个好方法是数据流编程(又名基于流程的编程)。在数据流编程中,预先编写了组件。组件是黑盒子(从应用程序开发人员的角度来看),它们具有消费者(输入)和生产者(输出)端口,可以将它们连接起来形成一个处理网络,这就是应用程序。如果某个域有一组好的组件,则可以在不编写新组件的情况下创建许多应用程序。另外,组件可以由其他组件构建(它们称为复合组件)。

维基百科(很好的起点): http://en.wikipedia.org/wiki/Dataflow_programming http://en.wikipedia.org/wiki/Flow-based_programming

JPM的网站(书,维基,一切): http://jpaulmorrison.com/fbp/

我想象一下,更大的系统必须有你描述为“宏观”的分界点。即使游戏也有这一点,例如FPS游戏具有3D引擎和游戏逻辑脚本,或者有SCUMM VM,这是相同的。