Java 设计模式:管道和不变性
Java design patterns: Pipeline and immutability
我正在为我的后端服务开发一个轻量级框架,以支持类似管道的处理。
- 在管道中,每个阶段本质上都是一个
Function<IN, OUT>
,其中 IN
是前一阶段的 OUT
。
- 每个阶段都可以将它的结果设置到数据模型中(姑且称之为
Record
)
- 虽然输入是
IN
(前一阶段的输出),但是每个阶段都可以查看目前为止所有之前的结果。
我的问题:
所以基本上,每个阶段都可以将其结果设置到数据模型中,并且可以获得到目前为止的所有其他结果。这使得模型在管道中的所有组件之间共享和可变。
它会被认为是反模式吗?如果是这样,您将对我的架构进行哪些更改?
谢谢
当流水线中的组件彼此独立且保持独立时,流水线设计是好的。例如,您会看到它用于 Web 服务器过滤器链(如 Apache httpd 过滤器或 Java servlet 过滤器):链中的每个“link”都可以检查请求和响应并可能进行修改。
管道设计很快就会变坏,因为组件之间会发展出隐藏的依赖关系。隐藏依赖是指链中的一个 link 使用在上游 link 中完成的计算结果。这种依赖性不会被类型系统捕获,也不会被测试覆盖,而且通常甚至没有记录。如果程序员现在修改或重构上游 link 的代码,下游代码很可能会中断。在一个由多个开发人员共同工作的大型系统中,隐藏的依赖关系会很快出现,并导致代码脆弱且难以理解。
如果您看到隐藏的依赖关系形式,最好将管道设计替换为使依赖关系图显式的设计。
我正在为我的后端服务开发一个轻量级框架,以支持类似管道的处理。
- 在管道中,每个阶段本质上都是一个
Function<IN, OUT>
,其中IN
是前一阶段的OUT
。 - 每个阶段都可以将它的结果设置到数据模型中(姑且称之为
Record
) - 虽然输入是
IN
(前一阶段的输出),但是每个阶段都可以查看目前为止所有之前的结果。
我的问题:
所以基本上,每个阶段都可以将其结果设置到数据模型中,并且可以获得到目前为止的所有其他结果。这使得模型在管道中的所有组件之间共享和可变。
它会被认为是反模式吗?如果是这样,您将对我的架构进行哪些更改?
谢谢
当流水线中的组件彼此独立且保持独立时,流水线设计是好的。例如,您会看到它用于 Web 服务器过滤器链(如 Apache httpd 过滤器或 Java servlet 过滤器):链中的每个“link”都可以检查请求和响应并可能进行修改。
管道设计很快就会变坏,因为组件之间会发展出隐藏的依赖关系。隐藏依赖是指链中的一个 link 使用在上游 link 中完成的计算结果。这种依赖性不会被类型系统捕获,也不会被测试覆盖,而且通常甚至没有记录。如果程序员现在修改或重构上游 link 的代码,下游代码很可能会中断。在一个由多个开发人员共同工作的大型系统中,隐藏的依赖关系会很快出现,并导致代码脆弱且难以理解。
如果您看到隐藏的依赖关系形式,最好将管道设计替换为使依赖关系图显式的设计。