这是本系列的第一篇文章,介绍了用于组合的耦合控制反转类型系统。 该系列文章将演示所得的类型系统如何简化组合。 这避免了很多功能/面向对象组合的复杂性。 结果类型系统及其结果组成非常简单,即使初级开发人员也可以理解。
一流的程序
本文将研究First-Class Procedures的类型系统和组成。
我们之前已经讨论过OO矩阵以及方法(以及相关的函数)如何遭受耦合。 我们还讨论了如何通过反转耦合控制来减少这种耦合。 我们还展示了如何将这些反向方法/功能无缝地编织在一起 。 我们甚至已经看到行业通过微服务朝着这些概念迈进。
我们尚未讨论的是First-Class Procedures提供的类型系统和组成。
为了讨论这一点,让我们从众所周知的依赖注入概念开始。
依赖注入
依赖项注入的元数据描述了具有以下三个属性的依赖项列表:
- 注入依赖项的字段(或构造函数参数)(提供依赖项的名称,例如字段名称)
- 依赖类型
- 可选的限定词(区分相同类型的依赖项)
利用该信息,可以进行依赖关系的匹配。 请注意,某些依赖项注入框架对此有所改进。 但是,上述元数据通常足以自动关联对象。
连续注射
Continuation Injection将函数/方法的调用减少为与Dependency Injection类似的简单属性集。
由于只能传递一个参数(其余都是依赖项注入),因此只需要一种类型。 这是可选参数类型。
同样,所有来自First-Class Procedure的继续都被命名。
请注意,合格的延续被视为容易出错。 自动将延续连接到匹配的First-Class Procedures,需要对系统中的每个延续使用不同的参数类型。 实际上,大多数情况下,都是传递相同的简单域数据类型。 因此,您最终不得不限定每个延续。
此外,排位赛延续在降低复杂性方面几乎没有改善。 在限定所有连续性时,最终要为每个连续性编写配置。 换句话说,您最终将提供每个延续名称到服务一流程序的映射。 此配置非常容易出错。 我们将展示如何减少错误的发生,并在短期内容易理解。
因此,使用以下元数据描述了“一流程序”所需的每个继续:
- 续名
- 延续参数的类型(即发送给延续的参数的类型)
注意,方法/函数的异常也被建模为延续。 该类型是异常类型。 名称是异常类型的名称。
一流的程序类型系统
将Continuation Injection元数据和Dependency Injection元数据放在一起,我们将为First-Class Procedure获得以下元数据(类型)信息:
FirstClassProcedureType {
Class<?> parameterType;
ContinuationType[] continuations;
DependencyType[] dependencies; } ContinuationType {
String name;
Class<?> argumentType; } DependencyType {
String name;
Class<?> objectType;
String qualifier; }
上面的类型可以描述所有一流的程序。 由于方法/函数需要参数,因此这些参数由DependencyType列表描述。 由于方法/函数需要调用其他方法/函数,因此在ContinuationType列表中进行了描述。 因为First-Class Procedure只有一个参数,所以参数类型描述了必须通过调用ContinuationType提供的参数类型。
注意,我们没有讨论线程注入类型。 实际上,这是通过将对象类型与线程池匹配而从DependencyType列表派生的。 有关更多信息,请参见线程注入 。
现在我们可以键入First-Class Procedure,我们可以看看使用这种类型的系统进行合成。
一流的程序组成
头等程序的组成重点在于将延续部分连接在一起。 依赖注入将对象(状态)提供给方法/功能。 依赖关系的这种连接是与延续分开完成的。 因此,我们只需要关注延续到其服务一流程序的延续性。
现在可以在代码甚至配置文件中执行此操作。 但是,随着系统复杂性的增加,用于服务一流程序的延续名称列表变得非常笨拙。 试图从链接列表中破译系统行为变得非常困难。
因此,我们将一流程序看作如下:
- 具有输入锚点的处理节点
- 每个延续的输出锚点数量不同
- 链接作为从输出锚点到输入锚点的线
该表示用于组成的图形配置。 First-Class Procedure是图中的节点,其中的线表示它们之间的延续。 因此,一流程序的组成实际上是在它们之间画线。
由于图形配置在视觉上易于理解,因此即使是初级开发人员也很容易理解该应用程序。
摘要
我们已经证明了Continuation Injection如何简化方法/函数的调用。 这个简单的用于连续注入的元数据模型类似于对象的依赖注入。
这个简单的元数据为一流程序创建了类型系统。 这种类型的系统可以实现一流程序的图形化组合。
此外,由于是图形化的,因此对于初级开发人员来说很容易理解其组成。
下一篇文章将讨论如何使First-Class Procedure类型的系统更通用,以实现应用程序的模块化。 但是,这些模块仍保持类似类型的系统以包含在图形配置中。
翻译自: https://www.javacodegeeks.com/2019/11/first-class-procedure-type-system-for-composition.html