【问题标题】:State Machine Diagram - Two States for same object状态机图 - 同一对象的两种状态
【发布时间】:2020-08-26 02:45:39
【问题描述】:

我正在绘制一种类似于 Git 的情况,您可以在其中一次拥有一个处于多个状态的单个文件(即具有分阶段更改和非分阶段更改的文件)。在这种情况下,我有三个主要状态:

  1. 未经编辑的文件
  2. 已编辑/未暂存的文件
  3. 暂存文件

是否可以显示单个文件同时处于状态 2 和状态 3,而无需将所有状态信息复制到另一个状态(即状态 4。暂存和已编辑/未暂存的文件)。这是一个简化的图表:

【问题讨论】:

  • 你可以使用分叉,但警告产生一个有效的状态机,我认为只有一个状态说两个更清楚
  • 当我在 GIT doc 上阅读时,我看不到你在说什么,而是 image.slidesharecdn.com/githubworkshop-140515072044-phpapp01/95/…cf.ppt-online.org/files/slide/z/…
  • 我不是 SM 方面的专家,但历史子状态不就是用来做这个的吗?
  • 我怀疑某物是否可以在同一个状态机中同时处于两种状态,除非它是在单个状态崩溃的上下文中,例如复合状态。您确定该文件不仅仅是多个状态机的主题,例如一个解决已编辑/未编辑的问题,另一个解决文件是否暂存的问题?即使在 Git 中,我相信一个文件既可以暂存,也可以不被编辑——未更改的文件已经在暂存区域中,并将成为提交的一部分。

标签: uml state-diagram


【解决方案1】:

我相信您的问题源于您试图将两个不同的状态机建模为一个。

第一个是Unedited/Edited State Machine,第二个是Staging。文件将成为两个状态机的主题,但这些机器中的状态彼此独立:文件是暂存还是未暂存不依赖已编辑的文件;这依赖取决于您作为用户是否告诉 Git 暂存文件。您可以暂存未编辑的文件,也可以选择不暂存已编辑的文件。

在文件名上显示“E”或“S”的编辑器是关于您希望如何传达文件所处状态的选择。我假设未编辑但已暂存的文件, 无论文件未被编辑的面孔如何,其名称都会显示一个“S”。显示这些符号是行为逻辑,它不是由状态决定的,而是由对它们的解释以及它们的可能组合决定的。

从你所包含的状态图中,我不确定,但也许你试图在状态机中表达开发过程?编辑然后舞台是很常见的,但你可以反过来做。您是否考虑过使用活动图来表达流程?

【讨论】:

  • 无法在 git 中暂存未经编辑的文件。编辑状态和暂存文件的能力之间存在依赖关系。
  • 您可以“git add”一个文件,提交,不要编辑并再次提交,该文件仍将被暂存。这个阶段只是在索引中说它,如果它已经在索引中,那么 git 会跟踪它git-scm.com/docs/git-add
【解决方案2】:

状态机基础

在您的 SM 中,没有区域,没有复合状态,也没有子机。因此,在给定时间最多只能有一个状态。它并不是完全那样写的,但它来自于 UML 规范中 SM 的语义,尤其是:

一个行为状态机包含一个或多个区域,每个区域包含一个(可能是分层的)(...)。 StateMachine 的特定执行由一组通过一个或多个区域图的有效路径遍历表示,由事件发生 (...) 的调度触发。由于其事件驱动的性质,StateMachine 执行是在传输中或处于状态,在两者之间交替。当调度的事件至少匹配其关联触发器之一时,它处于传输中。

通过转移和状态的图遍历机制明确了两个状态不能同时处于活动状态。

更复杂的状态机

状态机可能要复杂得多。首先,一个SM可以由Regions组成:

区域表示可以与其正交区域同时执行的行为片段。如果两个或多个 Region 由同一个 State 拥有,或者在最高级别由同一个 StateMachine 拥有,则它们是相互正交的。

此外,复合状态可能有子状态:所以如果这个状态是活跃的,它的一个子状态也可能是活跃的。子机可能涉及更复杂的情况。

在如此复杂的 SM 中,机器的当前状态实际上是跨活动区域的状态层次结构中的几个兼容活动状态的配置

您有什么要求?

每当您认为多个状态可能同时相关时,您就必须进一步分解您的状态,并确定相关的状态(例如:潜在的子状态)和独立的状态(正交区域)。

换句话说,如果Unedited fileEdited/unstaged fileStaged file 是不够的,独立于GIT 语义,你可以想到:

  • 区域 1:UndeditedEdited 和区域 2:StagedUnstaged,给出了 4 种可能的配置:Undedited/StagedEdited/@9876543331@、@987655 /Unstaged,和Edited/Unstaged
  • 如果某些组合是不可能的(例如Undedited/Staged),您可以将Unedited(隐式始终未分级)和Edited 视为具有子状态StagedUnstaged 的复合状态,这给出可能的配置Edited.UnstagedEdited.Staged
  • 或者可能有一些缺失的状态:例如new(总是隐含地取消分阶段)committed-a-first-time,可能有 2 个区域(如上面的第一个项目符号)
  • 等等……

可以指导您的状态分析的是找到一个不变的条件,以一种独特且明确的方式最好地描述状态。

历史

SM 历史不会解决您的并发状态问题:

状态历史 (...) 的概念是与复合状态的区域相关联的便利概念,其中区域跟踪它上次退出时所处的状态配置。如果需要,下次区域变为活动状态时(...),或者如果有返回其历史的本地转换,这允许轻松返回到相同的状态配置。

结论

您的问题的解决方案可能在 SM 之外。例如,一个经过编辑然后暂存的文件有两个版本:本地驱动器上可编辑的当前版本,以及 GIT 存储库中暂存的不可变版本。在这种情况下,您确实拥有激活的已编辑暂存版本和未编辑(与暂存版本相比)版本。这两个并发状态涉及不同的对象,每个对象都有自己的 SM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多