【发布时间】:2015-12-06 14:12:37
【问题描述】:
我有一个流程,从文件导入数据开始,然后执行一系列程序,但它随时可能发现问题,应该停止执行其余程序并运行另一组程序。
这是我的示例,其中每个过程都设置了全局 gStop 变量以指示停止该过程。如果它被停止了,我需要在最后运行一些代码。
var gStop:boolean;
procedure Run;
begin
gStop:=False;
Import; // imports data from file
If Not gStop Then
AfterImport1;
If Not gStop Then
AfterImport2;
If Not gStop Then
AfterImport3;
If Not gStop Then
AfterImport4;
If Not gStop Then
If fTypeOfData = cMSSQL Then // function returns type of imported data
begin
ProcessMSSQLData1;
If not gStop Then
ProcessMSSQLData2;
If not gStop Then
ProcessMSSQLData3;
If not gStop Then
If fObjectAFoundInData Then // function checks if ObjectA was found in imported data
ProcessObjectA;
If not gStop Then
ProcessMSSQLData4;
end;
If Not gStop Then
AfterImport5;
...
// If stopped at anytime
If gStop then
begin
LogStoppedProcess;
ClearImportedData;
...
end;
end;
在我的例子中,它实际上超过了 200 行代码,所以当我维护这部分代码时,我必须上下滚动。
我有什么方法可以改进这个过程,使其更具可读性、更易于维护,或者有没有其他方法可以在没有所有 IF 的情况下停止该过程?
编辑 1:
每个程序都可以找到错误的数据并可以设置gStop := True;,并且该进程应该跳过所有其余的程序,只执行gStop = True;时的最后部分代码
编辑 2:
我希望通过主程序(运行)控制工作流,这样我就可以看到在主导入之后运行的所有任务。如果我将执行分解为许多较小的过程,我只会看到更多的混乱和更少的可读性和可维护性。然后我可以:
procedure Run;
begin
gStop:=False;
Import; // imports data from file
RunEverytingAferImport; // execute ALL tasks after import
// If stopped at anytime
If gStop then
begin
LogStoppedProcess;
ClearImportedData;
...
end;
end;
此工作流程似乎设计不正确。我想知道导入后运行的主要任务是什么,而不是每次需要查看它时都进行发现之旅。所有任务都已按目的、它们做什么、如何做以及结果分组到程序中。
结论:
即使不是最好的选择,我还是决定在需要停止进程时使用引发异常。我“有点”理解这种方法带来的影响(一旦我实施它就会知道更多),但这似乎是朝着有一天更好地实施整个过程的合乎逻辑的一步。现在我不会看到每个任务执行的所有这些 IF。好的!代码将更具可读性、可维护性。
我阅读了提供的链接来解释使用异常停止工作流执行的陷阱,但是,正如 Dalija Prasnikar 在 cmets 中解释的那样,这不是任务的性能相关部分;每次应用程序运行时进程只执行一次;任务已经由他们所做的事情来结构化了;任务已经包含多个 IF 语句,其中检查了停止的进程等等,所以我认为异常不会落入对我的问题的非常糟糕的解决方案中。
另外,如果我将任务转换为返回结果的函数,我想我会遇到同样的问题,检查每个任务的值并以此为基础停止或继续进程。
所以,引发异常是我的选择。
【问题讨论】:
-
如果你想中止,你可以使用
try...finally并引发异常。 -
只是在你调用的函数中引发异常?
-
@AndreasRejbrand。 whosrdaddy 是的,似乎引发异常很容易适应我当前的代码,没有太多的变化。 Dailija 向我展示了如何有效地做到这一点。我现在正在研究解决方案。
-
也许使用 Abort 例程来引发静默异常...
-
你的整个设计真的很糟糕。试图让它变得更好而不面对它不会产生任何值得拥有的东西。你最好什么都不做,因为三心二意的改变不会带来长期的好处,而且可能会破坏你的计划。您不能继续让程序中的每一方都可以写入的全局布尔值确定控制流!这就是我们在 1960 年代做事的方式!
标签: delphi delphi-xe7