面向流程框架的设计

2020-10-14  本文已影响0人  科研者

面向流程的编程思想有了 (详情见面向流程编程),那如何设计面向流程的框架呢?本文说细说面向流程框架的通用设计,其内容包含了面向流程框架的概念、模块生命周期等方面的设计,但并不包含具体的API,而面向流程框架中的具体模块、成员、API 以及 类图 的设计应由具体的面向流程框架 实现;

目录

内容

根据 面向流程编程 的思想,如果要做一个 面向流程编程 的框架,则需要框架实现以下功能

  1. 抽象好的节点,让用户(框架的使用者)可以自定义节点的业务逻辑,其它的所有节点共有的特性 和 功能 均由框架来实现;
  2. 抽象好的管道,让用户可以自定义数据的转换逻辑,其它的所有管道共有的特性 和 功能 均由框架来实现;
  3. 提供 元素 (管理 和 节点 统称元素) 互相连接的便捷方法;
  4. 提供 通过 配置化 或 形象化语言 或 可视化 的连接方式;

其中第1、2、3条是必须的,第4条 是加分项;

从上可以初步得出,框架中的核心概念包含 节点管道,接下来分别详细设计 框架中的各个重要模块。

1. 节点

节点 是 程序的流程结构中每一步的逻辑单元。

1.1. 生命周期

为了能够让使用者能够在适当的时候执行自定义的业务逻辑,节点需要提供生命周期钩子,经过思考,节点可能需要具备下面的生命周期钩子:

其中,聚焦失焦 这两个生命周期 最开始时 叫 激活失活激活失活 这两个名字也更形象,但后来考虑到一类情况:如果节点内的业务逻辑 如果有 定时 或者 多次触发激活下一个节点的情况,那么按照 激活失活 的逻辑,该节点在第一次激活下一个节点后,就是 失活 的状态了,但是它还会触发激活下一个节点,把这种节点状态定为 失活 ,有些不合 失活 语意,这种状态应该叫 聚焦失焦 更合理,因为 失焦 不一定意味着 失活,所以现在把 激活失活 的生命周期 改名为 聚焦失焦

有了聚焦失焦,那节点需要不需要 激活失活

仔细想了想,激活 的状态和界面是很明显的,但失活的状态似乎很难定了,就像刚才那种 “定时 或者 多次触发激活下一个节点” 的情况,你很难确定 节点的业务逻辑什么时候完全执行完;所以,目前来看,暂时不需要 激活失活 的生命周期钩子;

1.2. 特性

2. 管道

当连接两个节点 或 两个节点的端口时,被连接的两个目标可能有不同的数据要求,仅有这一点,还不能实现节点间的完全解耦;可让目标通过通过 管道 来连接,管道可以负责数据的转换,甚至也可以主动传递数据,如:上一个节点没有输出数据,但下一个节点需要输入数据时,这样可以让连接请求数据后,再传给目标;管道里也可以做延迟操作等等;

总之,管道 就是用来在节点之间起连接作用并可传递、转换数据的。

2.1. 特征

3. 包装元素

如果一个 流程F 中的 某个 元素E 的逻辑 也是一个流程(记为流程 S),当执行元素E时,则会执行 流程S,当流程S 执行完毕后,会继续沿着流程F执行元素E后面的元素;那么 就称 元素E 是一个 包装元素,流程S 记作 元素E的 包装流程

3.1. 特征

4. 模块

在通过给定的流程描述(如:配置、语言)创建元素实例时,当解析完描述之后,首先需要先查找到元素的类型的定义(如:元素的类、构造函数 等),然后再用定义创建对应元素的实例,然后再将实例连接成流程;

这样,对于同一个流程描述,如果应用不同的元素类型定义集合,则会生成具有不同程序逻辑的流程(如下图),这种效果提供了更多的可能性 和 扩展性;

描述与类型集合

像这种,在通过流程描述创建流程实例的过程中 提供所需的类型集合 及 其它相关环境的程序角色称之为 模块

4.1. 特征

5. 定义元素类型的方式

元素类型通常会被设计成类,在 JavaScript 中也有几种生成类的方式:

这几种方式各有优缺点,如下:

类继承:
通过语言提供的类继承的机制来定义类。

配置选项:
有个工厂方法 接收 配置选项,根据配置选项的描述 生成相应的类。

装饰器:
因为装饰器 可灵活应用在类 及 其成员上,又灵对类作灵活的定制,所以 装饰器 方案 具备 类继承配置选项 这两种方案的优点于一身。

6. 构建流程的方式

定义好 节点 与 管道 之后,接下来就可以连接搭建 节点、管道 等 之间的 有向关系

节点、管道、有向关系 的集合 就称之为 流程

构建流程的方式有以下几种:

这几种方式各有优缺点,如下:

手动连接实例:
通过连接API,将 节点、管道 等个连接起来。

配置对象:
通过一定格式的对象来描述流程的各个元素和其有向关系。

语言:
通过形像化语法来描述流程的各个元素和其有向关系。

7. Mixin

Mixin 是一种具备多继承的效果但解决了多继承路径的一种极具扩展性、复用性的设计模式。因此,如果想让框架更具灵活性、扩展性、复用性,则应提供 Mixin 模式的实现 API。

上一篇 下一篇

猜你喜欢

热点阅读