还有些设计就没有公布出来了,大致按照这个设计,并结合我在博客里面发布的其它文章,应该可以初步设计出流程自动跳跃模型的结构了.... 我们做开源项目的,虽然平时比较自由散漫,但是写代码之前,还是应该做点结构设计和写点文档的吧..要不然,大家怎么交流呢? 简要说明 在经过上一层次的总体设计之后,落实到具体的问题上面,我们还是从代码中来,从代码中去文字层面的设计与代码层面的开发之间,需要找到一个切合点 实现自由流的设计和开发,我们已经找到一个具体的代码和数据落实点 由于我们的系统都是建立在自动化机制基础上的,在流程运行过程中,不太可能手工来进行节点设置,这就是难点 我们开源爱好者不做,不等于竞争对手不做 所以即使面临困难也要继续做下去 并抓紧这段时间的有利机会 尽快向外界公布这个设计 ===================================================================== JWFD开源工作流跳跃模型 初步总体设计 嵌入代码如果是逻辑运算,就用RunLogicScript()函数,如果是数值计算就用RunLineScript()函数 NID nodeid 节点标志号 GID graphid 流程图标志号 if(判断节点中是否存在嵌入代码段){ {详细设计 stm.CodeExistINNode(Nid,Gid) } if( 判断当前流程状态是否可以进行跳转 ){详细设计} ASKJump() 对流程数据进行暂存 and 对数据流进行暂存 {详细设计} 寄存器操作 MicroCodeset.RegGetStatusOperation() if(实时编译器的计算结果==某个值){{详细设计 RT001 }RunLineScript() 或者 RunlogicScript() 指定跳转Nid节点 或者自由跳转随机节点 {详细设计 RT001 } Jumper(GID,NID) or Tjumper(GID,NID) } } 判断跳转处理过程是否结束 || 判断跳转点是否是流程图最后一个节点{详细设计} 跳转过程结束的标志是什么? 启动跳转恢复过程{详细设计} JumperRecovery() 回到递归处理状态{详细设计} {跳跃过程和递归过程的NID必须严格分离,不能够搞混} 跳转处理模块结束{详细设计} ===================================================================== 从后面的节点跳转到前面的节点-叫做反馈 从前面的节点跳到后面的节点叫做跳跃 什么情况下,流程可以进行跳转? 什么情况下,流程不能够进行跳转? 什么情况下,流程可以进行反馈? 什么情况下,流程可以进行跳跃? 判断的条件是什么? 流程运行中的几种状态,几种传递的数据?详细设计过程 1:流程图的整个实例状态? 流程正在运行过程中 且 当前运行节点不是第一个节点也不是最后一个节点??? 为什么不能够在最后一个节点进行跳跃? 2:流程图的单个节点的状态? 节点运行状态正处于处理过程中..节点如果无法传递数据到下一个节点,不会导致引擎运行失败? 3:流程图节点中的计算模块的情况? 跳跃的时候,计算模块需要获取的参数在跳跃过程中仍然能够得到? 关键问题:跳跃点的选取? 首个节点,末节点,为什么不能够跳跃? 这个函数用来判断当前流程是否能够实现跳跃或者反馈 public boolean ASKIFJump(String Gid ,String Nid){ boolean isjump = true ; return isjump; } ============================================ 设计这个算法的目的是为了让流程引擎在进行了条件跳转或者自由跳转之后,能够让引擎能够继续处理跳转点下面的线性拓扑流程,因为跳转本身是一个非线性的过程,在完成这个过程之后,系统必须回到严格的递归流转状态中,这就涉及到一个状态保存和恢复的过程,所以有必要认真考虑这个设计 在进行这个算法的详细设计之前,FRR寄存器设计和代码必须先出来.... 现在有一个问题:如果在跳转之后,处理节点要回到递归前进之前的节点,系统要做什么处理? 恢复流程状态的过程分为如下几个子过程 读取原有流程图 读取寄存器数据,读取计算数值寄存器数据(寄存器的状态必须非常正常,必须判断寄存器并没有受到任何攻击和篡改) 重新载入流程状态参数和计算数据参数(保证读取出来的存储器中的每个状态参数和数据都和原来的状态和数据完全一致) 恢复跳转前状态 (这个过程必须100%的精确,差一个状态参数值不对,整个跳转都将失败) public void JumperRecovery(String Gid,String JumpNid,String RecoveryNid){ } ============================================ 嵌入式代码计算函数(逻辑推理段) public boolean RunlogicScript(String prop) { boolean result = false; try { if(gii.ScriptAnalysis(prop).equals("true")){ result = true; }else if(gii.ScriptAnalysis(prop).equals("false")){ result = false; } } catch (Exception e) { System.out.println("嵌入脚本计算失败"); } return result; } 嵌入式代码计算函数(线性方程段) public int RunLineScript(String prop){ int result = 0 ; ...........未完成 return result; } ===================================================================== 详细设计 RT001 if RunLineScript(code X) = X SET 当前节点 = NODEIDX (详细设计){如何根据计算返回的数值参数X,生成一个确定跳跃节点ID号 } THEN JUMPER(NODEIDX ) (详细设计){根据传递进来的节点ID号,进行流程跳跃} if RunlogicScript(code Y) = Y SET 当前节点 = NODEIDY (详细设计){如何根据计算返回的数值参数Y,生成一个确定跳跃节点ID号 } THEN JUMPER(NODEIDY) (详细设计){根据传递进来的节点ID号,进行流程跳跃} 详细设计 RT002 根据计算代码的计算返回值,设置当前节点为跳跃节点 略..... ===================================================================== 具体代码落实点 (数据结构基础点) 获得传递进来的流程图ID和节点ID之后,在整个流转序列中应该出现一个跳转节点的插入的过程 那么或者这样做,把这个跳转节点的ID直接送入ARC中的待处理节点序列中 把ARC中的LLN数组中插入一个跳转节点,形成新的流转节点序列 那么如果形成新的流转节点序列,反馈过程启动之后,下一次递归循环开始,序列不一样,该怎么实现? 输出节点序列 N01,N02,N04,N05 指定节点跳跃 在NO2和N03之间插入一个节点 N08 节点序列变成 N01,N02,N08,N04,N05,现在的问题是:在我们处理N08之后,如果N08本身就在N05之后,那么势必会导致引擎重复处理N08节点。。。 是否在跳跃模式完成之后,把插入序列的节点全部从整个流程图序列中删除? public void Jumper(String Graphid,String Nodeid){}