Java设计模式:管道和不变性
我正在为我的后端服务开发一个轻量级框架,以支持类似管道的处理Java设计模式:管道和不变性,java,design-patterns,etl,backend,stream-processing,Java,Design Patterns,Etl,Backend,Stream Processing,我正在为我的后端服务开发一个轻量级框架,以支持类似管道的处理 在管道中,每个阶段本质上都是一个功能,其中In是前一阶段的OUT 每个阶段都可以将其结果设置为数据模型(我们称之为Record) 尽管输入是中的(前一阶段的输出),但到目前为止,每个阶段都可以查看所有前一阶段的结果 我的问题: 因此,从本质上讲,每个阶段都可以将其结果设置为数据模型,并可以获得到目前为止的所有其他结果。这使得模型在管道中的所有组件之间共享和可变 这会被认为是一种反模式吗?如果是这样,您将对我的体系结构进行哪些更改
- 在管道中,每个阶段本质上都是一个
,其中功能
是前一阶段的In
OUT
- 每个阶段都可以将其结果设置为数据模型(我们称之为
)Record
- 尽管输入是中的(前一阶段的输出),但到目前为止,每个阶段都可以查看所有前一阶段的结果
感谢当管路中的部件相互独立且保持独立时,管路设计良好。例如,您可以在web服务器过滤器链(如ApacheHTTPD过滤器或JavaServlet过滤器)中看到它:链中的每个“链接”都可以检查请求和响应,并可能进行修改 当组件之间产生隐藏的依赖关系时,管道设计很快就会失败。隐藏相关性是指链中的一个链接使用在上游链接中完成的计算结果。这种依赖关系不是由类型系统捕获的,也不是由测试覆盖的,通常甚至没有文档记录。如果程序员现在修改或重构上游链接的代码,那么下游代码很有可能中断。在多个开发人员工作的大型系统中,隐藏的依赖关系将很快发生,并导致代码脆弱且难以理解
如果您看到隐藏的依赖关系表单,则最好使用使依赖关系图显式的设计替换管道设计。当行中的组件彼此独立且保持独立时,管道设计是良好的。例如,您可以在web服务器过滤器链(如ApacheHTTPD过滤器或JavaServlet过滤器)中看到它:链中的每个“链接”都可以检查请求和响应,并可能进行修改 当组件之间产生隐藏的依赖关系时,管道设计很快就会失败。隐藏相关性是指链中的一个链接使用在上游链接中完成的计算结果。这种依赖关系不是由类型系统捕获的,也不是由测试覆盖的,通常甚至没有文档记录。如果程序员现在修改或重构上游链接的代码,那么下游代码很有可能中断。在多个开发人员工作的大型系统中,隐藏的依赖关系将很快发生,并导致代码脆弱且难以理解
如果您看到隐藏的依赖关系表单,最好将管道设计替换为使依赖关系图显式的设计。每个阶段仍然可以创建一个新的记录对象有点像
List
implementation@emotionlessbananas,你能详细说明一下吗?每个阶段仍然可以创建一个新的记录对象有点像List
implementation@emotionlessbananas,你能详细说明一下吗?所以基本上是三步走的<代码>A->B->C。我感到困惑的是:一方面B
需要A
的结果。另一方面,我不希望B
转换A
的结果。一种选择可能是克隆()对象或将其序列化,但对我来说这似乎是一种开销。另一个非常类似的想法是,只使用B
的相关数据创建一个“瘦”对象(有点像DTO)。这是一个合理的方法吗?如果你不想B修改a的结果,它可以简单地传递它而不需要修改。是的,我的问题是这是否是一个反模式。也就是说,B可能会改变A的结果,因为它是可变的(可能),所以基本上是三步流水线<代码>A->B->C。我感到困惑的是:一方面B
需要A
的结果。另一方面,我不希望B
转换A
的结果。一种选择可能是克隆()对象或将其序列化,但对我来说这似乎是一种开销。另一个非常类似的想法是,只使用B
的相关数据创建一个“瘦”对象(有点像DTO)。这是一个合理的方法吗?如果你不想B修改a的结果,它可以简单地传递它而不需要修改。是的,我的问题是这是否是一个反模式。也就是说,B可能会改变A的结果,因为它是可变的(可能)