一贴搞懂E3的流程线(程序运行流程)

看懂了流程线(下图中红框所示),就等于看懂了程序的运行逻辑,本贴我们针对流程线给大家展开详细的论述

首先,流程线决定了各个功能模块的先后结算次序
开发者在链接流程线的时候,脑海所想是“这个程序我要先运行什么,后运行什么……”
可见流程线的控制和编辑,就是在控制这个程序的主体逻辑。

流程线的结算次序逻辑有以下几种常见形态:

第一种,常规顺序结算


从左往右依次运行结算,这种很常见也容易理解。
当然如果你很不性遇见了这样的流程连线,也可以通过检查流程线确定程序运行的次序:)

第二种,分步骤结算

日常开发中,Sequence的运用非常重要,它意味着开发者在给程序设计框架,也就是运行的步骤。


从Sequence分流出来的流程输出端有明确的运行步骤顺序,先执行S1、再执行S2……最后执行SE,我们可以利用这个功能让程序的流程更加清晰,每个步骤独立成一个功能组团和其他组团不发生流程上的交叉。

比如下面这个ncf,就是我开发LSO时用的一个惯用结构:
S1:主要用户创建变量容器,提前创建好这些变量
SE:用于链接display、print、Return这些程序末端的功能块
剩下中间部分的S(S2、S3等):逐步编写程序的主体。

【功能】此外,利用Sequence还用一个好处,就是可以在S端口上右键Disable(临时关闭这个步骤的运行)这给检查程序bug带来了极大的方便。

【技巧】面对复杂的案例,我们也可以通过多个Sequence的串联建立每个步骤下的次一级步骤。

【技巧】当一个ncf中想管理多个运行程序时,也可以用Sequence作为一个头部,需要运行哪个时,直接把程序起点模块与之相连就可以。

第三种,循环结算

循环是编程建模中的重要工具,几乎所有的重复、批量计算中都存在循环计算的流程。以下图中For循环模块为例,Loop输出端之后的所有【存在连线的】流程,都会被纳入这个Loop循环之内,根据For循环的参数决定这个Loop之后的循环流程要循环多少次。

触发循环的模块有如下几个:
1、For:指定循环次数的循环,i 输出目前执行循环的次数
2、While:输入端得到 true 的时候结束循环,一般用于条件判断
3、Foreach:输入一个List列表后,每个循环逐次发放一个Item元素参与运算。常用于把List运算转换为Item循环计算,直到列表数据发放结束。
4、MultiEach:输入多个List列表后,每个循环对应多个列表逐次发放一个对应的Item元素参与运算,一般用于多个列表之间的交叉运算,直到列表数据发放结束。

前文提到了每个Loop管理的循环务必是与自己【存在连线的】流程。所以下图循环流程的结束,就在Append的空白输出端这里。这里流程线断掉了,意味着每轮循环在此结束。每轮循环结束后,程序的运行流程会自动回到Loop端重新开始下一轮循环,直至N多轮的循环彻底结束。

那么当所有的循环结束之后,流程结算会去哪里呢?我们可以看到所有的Loop下方都有对应的Done。没错,当全部循环结束后,就会结算对应Loop下Done之后的流程。

【实操】理解了上述这些基本常见的流程控制,我们通过下面这个例子来总体复习一下,如果下面这个实例能够读懂的话,基本上流程线方面的事也就理解了80%了。
搭建可以按照0 - 1 - 1.1 - 2 - 2.1- 2.2 - 2.3 - 2.4 - 3 - 3.1 的循序逐一解读理解。

第四种,分岔结算

分岔结算和之前最大的区别就是分支上的流程有可能不被结算。前面三种不论流程输出端链接什么,都一定会被结算触发,只是触发的先后有所不同,但分岔结算时,分支上的流程是一定有可能不被发的。

如条件判断If,当判断条件是True时,结算True之后的流程。当判断条件是Flase时,结算Flase之后的流程。

流程的分岔逻辑上并不难理解,但从编程逻辑的角度讲需要额外注意一个非常重要的事情:就是岔路上的不能防止程序必要的模块,比如一些全局变量的创建、或者ncf模块出口Return。因为岔路上的模块在一定条件下不会被触发,而当这些模块又是程序必要的模块时,就会形成程序错误。

第五种,跳出结算

有些程序的执行过程中,可能需要我们临时跳出这个流程,以下几个模块在特殊的环境下会被用到。

以下并不常用,但当大家对程序编辑产生了这种需求时,就会感觉它们也会重要。
1、Continue,在循环内,被条件触发时可跳出当前本轮循环,直接接入下一循环


2、Break,和Continue用法类似,只是触发Break时,直接跳出所有循环,进入Done

3、TryCatch,主要用于提示或跨过一些程序错误,尤其是在循环算法中,因为每轮输入的数据都有不同,有些模块无法保证所有的数据都能够正确运行,但通常程序遇到错误后,又会停止,所以这个时候就会用到TryCatch,把它串联在容易出问题的模块前,用Try链接,如果Try的流程没有得到正常执行,TryCatch就会自动执行Catch后的流程。

后续举几个例子带大家复习一下这些知识点
未完待续……

跳出,还有一种情况,ncf包内在循环中接一个判断条件+return,这种感觉稍有一些“邪修”:rofl: 。但确实有用,比如我想在循环中找到第一个满足条件的就停止,并输出该次的值,就可以用这个办法。它比break有趣的地方就是一旦从循环中return了,就不会走done,那么如果走done,就可以判断循环的列表中没有任何一个值满足我上面的预设条件。对比来看如果用break,done这条流程一定会走,那么就需要外部加isnull 或者 isempty来再判断是否有满足的值。

1 个赞