Design patterns 基于块或基于流的系统编程的最佳实践

Design patterns 基于块或基于流的系统编程的最佳实践,design-patterns,block,implementation,flow,Design Patterns,Block,Implementation,Flow,我正在尝试实现一个类似Labview的系统(在Java中),其中一些块能够 -采购 -下沉 -通过 数据。 每个块有多个输入(>=0)和多个输出(>=0),用于输入、输出和转换数据的功能。数据流表示为样本,来自各种设备(温度计、风速计、辐射传感器、功率计等)的现场测量数据。 每个样本都与“历元”相关,即从触发器开始捕获所有值的瞬间(源块应具有特殊的触发器输入),因此来自历元的样本组应与来自同一历元的其他样本一起处理。 例如,典型的块链可以由一个源(温度传感器)表示,后面是一个平均器块(传递),最

我正在尝试实现一个类似Labview的系统(在Java中),其中一些块能够
-采购
-下沉
-通过
数据。

每个块有多个输入(>=0)和多个输出(>=0),用于输入、输出和转换数据的功能。数据流表示为样本,来自各种设备(温度计、风速计、辐射传感器、功率计等)的现场测量数据。

每个样本都与“历元”相关,即从触发器开始捕获所有值的瞬间(源块应具有特殊的触发器输入),因此来自历元的样本组应与来自同一历元的其他样本一起处理。

例如,典型的块链可以由一个源(温度传感器)表示,后面是一个平均器块(传递),最后是一个能够将数据记录到数据库中的接收器(接收器块)。

我实现了一个类似推送的策略,其中每个块都拥有“next block”引用,并对其调用一个方法,将数据传递给进程。此策略在遇到块(如比较器块,具有两个浮点输入和一个布尔输出)需要基于同一个采样历元输出比较值的情况之前可以正常工作。

问题是我无法找到并应用一个抽象这个问题的模式。也许这类似于Labview或Simulink块在内部的工作方式,但我仍然没有找到“最佳实践”。我的“推送策略”的主要问题是,根据链的大小和深度,具有多个输入的块将完成对属于不同时代的样本的处理(想象一个比较块比较来自两个不同测量点的两个样本)

提前感谢您提供的所有建议、技巧、最佳实践以及所有能够解决我的系统智能问题而非编程问题的一切。

有趣的问题

我建议将“块”(方框中表示的功能单元)、拓扑(块如何连接的定义)和控制(实例化块、仲裁消息传递以及流控制导致块在正确的时间执行等)的概念分开。目标是消除块之间的耦合(块之间应该完全不了解彼此),并创建任意可配置的系统

以下是我对三个主要组成部分的看法:

拓扑

拓扑定义:拓扑的定义通常出现在不是代码文件的资源文件中(应该是用户可配置的)。资源文件应该包含关于哪些块、它们的输入(输出通常可以从输入的知识中派生)的信息,并定义块可能具有的任何属性。例如,资源JSON文件可能如下所示:

[{ uniqueId:"1",
   type:"Number",
   val:0.3
 },
 { uniqueId:"2",
   type:"Sine",
   stepSize:0.1,
   initialOutput=0
 },
 { uniqueId:"3",
   type:"Multiplier",
   inputs:["1","2"],
   initialOutput=0
 },
 { uniqueId:"4",
   type:"Plotter",
   inputs:["3"],
 }]
控制

控制机制首先读取拓扑定义(不要忘记验证),然后使用此信息实例化块组件,并创建消息传递基础结构,使用每个块具有的输入知识将块组件绑定在一起(将每个输入视为单独的消息队列)。具体而言,控制器需要确定每个时间步中块的执行顺序。在每个时间步骤中,控件都执行几个步骤,首先从块链的开始将输出推送到“正在侦听”的输入队列。执行下一层块。将输出推送到下一层块等。。(或者其他类似的策略。)

这些模块基本上只知道如何获取给定的输入并返回合适的输出


另一个类似的系统是电气工程师使用的电路模拟程序(如Spice)。这些通常包括回路元件(块)、节点列表文件(拓扑定义)和某种模拟运行时



无论如何,这是我的想法。

这种问题可以通过同步输入来解决

在LabVIEW VI中,输入都是在VI启动时定义的。因此,它们都有相同的时代。在不同的路径上工作所需时间的差异就变得毫无意义了

在多个VI处理一个数据集的情况下,有一个VI每个周期从源收集一次所有数据。该准则分为三个阶段。收集数据。处理数据。输出数据。这意味着所有源数据具有相同的历元


对于控制应用,这种同步对于使控制系统数学稳定至关重要

你能澄清一下“比较器块”问题吗?这是一个问题,因为两个输入在不同的时间出现?为了回答您的最佳实践问题,有一些企业解决方案,例如您可能会感兴趣的解决方案(没有关联),我知道已经有商业解决方案在做我的工作。由于我必须从头开始编写软件,并且我有特定的需求,所以我选择了概念验证和最佳实践搜索。您要解决的比较器块问题之所以发生,是因为在一个仅由事件驱动的环境中,计时变得至关重要。您的想法是一个很好的理论起点。我利用你们提供的信息扩展了我的阅读,最终偶然发现了一个叫做“反应式编程”的概念。您关于RP的建议和概念之间的结合可能是一个解决方案,我正在使用RxJava实现一个概念证明。