5

我正在编写一个控制台应用程序,该应用程序通过 N 个步骤的算法。N在执行step 之前正确完成 step很重要N+1。否则程序应该停止工作并显示错误消息。

if当然可以使用嵌套语句来做到这一点并使用try-catch-finally(在 finally 中使用 continue 标志来决定程序是否应该处理)。但我正在寻找一种更好的结构化设计模式或方法来做到这一点。有什么建议吗?

4

6 回答 6

9

流水线设计模式正是关于这一点:以严格的步骤顺序执行复杂的过程。谷歌“管道设计模式”,你会发现很多资源。

是MSDN上的一篇面向编程的介绍文章,也是一篇比较理论的文章。

于 2013-10-31T14:42:51.077 回答
6

责任链

http://www.codeproject.com/Articles/455228/Design-Patterns-3-of-3-Behavioral-Design-Patterns#Chain

或状态模式

http://www.codeproject.com/Articles/455228/Design-Patterns-3-of-3-Behavioral-Design-Patterns#State

可能是您问题的解决方案。

对于责任链模式,当您检测到错误时,只需将“错误消息(处理)”流程设置为链中的下一个流程即可。

对于状态模式,需要在遇到错误时将状态更改为“错误”,并在错误状态下处理所有错误。

希望这会有所帮助。

于 2013-11-27T23:45:31.300 回答
3

我曾经创建了一个控制自动化的流程,并且我使用了包含所有步骤的枚举

enum AutomationStep{Requested, Started, Waiting, Processing, Terminating};

后来我创建了一个开关/案例来不同地处理每个步骤

switch (currentStep)
{
  case AutomationStep.Requested : InitializeProcess(); currentstep = AutomationStep.Started; break;
  case AutomationStep.Started : StartTheEngines(); currentstep = AutomationStep.Waiting; break;
  case AutomationStep.Waiting : //etc
   break;
   default:
}

您可以稍后使用 While 来运行每个步骤

于 2013-10-31T14:48:52.483 回答
1

您可以使用:

  1. 责任链。或者
  2. 维护一个进程列表并循环通过它们来处理您的任务。或者
  3. 使用函数组合并链接你的函数。在 java 8 中,您可以使用 Java 8 功能接口来实现这一点。

Java 8 API 的一个例子是使用比较器接口。

下面是使用函数组合链接函数的示例:

Comparator.comparing(name).thenComparing(age).

单击此处查看有关此内容的详细文章。

于 2020-05-05T16:26:34.150 回答
0

我喜欢的一种模式是在对象从一个步骤进行到下一步时更新对象的状态,以指示它在过程中的位置。

我不是从头到尾处理一个对象,而是让算法的每个步骤选择处于给定状态的所有对象,处理它们,并更新它们的状态以准备下一步。

我将流程的每个步骤都设为事务,以便对象完全进入下一步,或者回滚到其先前状态并准备再次执行此步骤。

这样,如果您的程序在中间中断,您可以重新启动它,并且所有对象都可以从它们在过程中中断的地方重新开始。

于 2013-10-31T14:37:00.693 回答
0

当您遇到错误的步骤时,使用递归并返回或停止

public void Process(int n)
{
 if( n % 23 != 0 )return;
 Process(n+1);
}

n您的工作数据集或当前设置项将在哪里。由您决定用于此目的的数据结构。此外,23 的模数检查用于显示何时中断递归检查。

于 2013-10-31T14:37:24.150 回答