【问题标题】:Asynchronous Flow Charts. How to visually represent asynchronous logic异步流程图。如何直观地表示异步逻辑
【发布时间】:2014-12-04 22:34:49
【问题描述】:

是的,这有点矛盾。

是否有表示异步逻辑的可视化语言?像流程图这样简单的东西?

我想对 UI“屏幕”及其背后的逻辑进行建模。

谢谢!

【问题讨论】:

  • 这只是一个具有并发性的流程图,即多个活动流 - 比较 NFA 与 DFA。还可以看看 petri 网,它明确用于建模并发逻辑,但它们可能有点过于复杂(取决于您的用例)。
  • 我不知道,但ajax 回调(或setTimeout,或任何其他“异步逻辑”)真正发生的情况是,当它触发时,它被添加到事件中队列,然后在事件循环到达该位置时执行。因此,与其通过控制流直观地表示它,不如绘制一个事件队列的表示并让它提供一些东西。请注意,这与并发略有不同,与并行线程有很大不同。
  • 图表技术面临的最大决定是如何使用它们。有两种基本的思想流派 - (1) 让您开始,一旦初始代码被剪切,就忘记它们,或者 (2) 在软件的生命周期中,将图表作为配置控制的项目(例如设计文档套件的一部分)并且只对代码进行更改以响应图表(等)中的更改。没有为大型公共/企业客户(尤其是军队)工作过的任何人都可能不熟悉第二种制度。
  • @Roamer-1888:还有第三个:从图表中自动生成代码。它可能还不常见,仍在学术界探索,但提供了一个新的基本思想。
  • 听起来你想要数据流图(用于数据源/进程/存储的 DFD)和状态转换图(用于建模 UI 的各种状态的 STD)的某种组合。 IIRC,DFD 的一个有趣规则是异步进程必须通过存储进行相互通信,这可能是系统硬件架构的强大驱动力。

标签: javascript node.js angularjs promise


【解决方案1】:

有一种表示异步逻辑的“视觉语言”:Petri Nets。

[Petri 的] 网络理论

Petri 网是根据网络元素对系统的描述。有四种类型的网络元素:位置、转换、输入和输出。输入将一个地方连接到一个转换。输出将转换连接到位置。每个网络元素可能有零个或多个注释。每个注解也可能有零个或多个注解。

类型注释

一个网元有一个类型:P (Place), T (Transition), I (Input), O (Output)

图标注释

地点元素可以用一个圆圈来直观地表示。过渡元素可以用正方形表示。输入元素可以由从圆形到方形的箭头表示。输出元素可以用从正方形到圆形的箭头表示。

标签注释

每个圆形或方形都可能带有标签标识符,用于唯一标识形状的文本。正方形的标签位于正方形的中心。圆圈的标签在圆圈之外。

模式和类

从现有的一组注释模式开始可能会很方便——例如在 Petri Net 的一类 Place/Transition 网络中使用的注释类型。

  1. 每个地方都有一个标记——数量或数字从 0 开始。
  2. 每个转换都有一个状态——真或假。
  3. 每个输入都有一个状态——真或假。
  4. 每个输入都有一个权重 -- 从 1 开始的数量或数字。
  5. 每个输入都有一个状态更新规则/逻辑——如果输入位置的标记大于等于输入的权重,则状态为真;否则,状态为假。
  6. 每个输入都有一个权重更新规则/逻辑——从输入位置的标记中减去输入权重。
  7. 每个输出都有一个权重——从 1 开始的数量或数字。
  8. 每个输出都有一个权重更新规则/逻辑 -- 将输出权重添加到输出位置的标记。
  9. 每个转换都有一个状态更新规则/逻辑——如果每个输入的状态为真,则转换的状态为真;否则,状态为 false。
  10. 每个转换都有一个标记更新规则/逻辑 -- 调用每个输入和每个输出的标记更新规则。

“扩展”

如果上述注释的类型对应用程序不满意,可以添加或更改注释。例如,

  1. 更改表示网络元素的形状。
  2. 修改更新规则/逻辑。
  3. 更改输入权重的范围并更改输入的状态更新规则——对于抑制网,另一类 Petri 网,输入权重可以是从 0 开始的数字;状态更新规则有一个附加组件,如果输入权重为零,则如果输入地点的标记为零,则状态为真,否则状态为假。
  4. 为每个大于 1 或值为 0 的输入权重添加标签注释。
【解决方案2】:

如果您希望“为您的(异步)逻辑建模”,以便从中得出语义上合理的结论,那么您需要 petri nets。来自维基百科:

Petri 网是一种用于描述分布式的建模语言 系统,带有转换和位置图。
像 UML 活动图、BPMN 和 EPC 等行业标准一样, Petri 网为逐步过程提供图形符号, 包括选择、迭代和并发执行。不同于这些 标准,Petri 网对其有一个精确的数学定义 执行语义,具有完善的数学理论 过程分析。

Promise 在 Petri 网中应该很容易表示为 3 个位置,每个位置表示一个 Promise 的 one of the states

如果您只是在寻找系统的简单可视化表示,您可能正在寻找data flow diagram。或者,您只需使用“生成异步进程”和“等待结果”等并发原语扩展您的流程图。如果您正在寻找适当指定的“视觉语言”,请查看 OMG 的 UML 工具,例如state machine diagram

【讨论】:

    【解决方案3】:

    我已将此库用于一个项目,以可视化数据库对象的状态:https://www.npmjs.com/package/promise-state-machine-es6

    虽然它并没有真正涵盖异步的东西,但它确实有助于与非技术人员推理应用程序逻辑。

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 2018-03-25
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2013-11-25
      • 2013-12-21
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多