Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java设计模式:管道和不变性_Java_Design Patterns_Etl_Backend_Stream Processing - Fatal编程技术网

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的结果,因为它是可变的(可能)