1 State和Action的定义与作用
Pan Qiancheng edited this page 2024-10-31 17:14:36 +08:00
This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

State和Action

前置知识

这里涉及到很多的ts语法注意参考线上文档【TypeScript】TS中常见的9种操作符&运算符_ts 操作符-CSDN博客

什么是State

State是实体的一种属性通常表示一种状态比如以下

  • 一篇文章的发布状态1
    • 未发布,已发布,已撤回
  • 一篇文章的置顶状态2
    • 已置顶,未置顶
  • 评论的申请状态3
    • 待提交,已提交,通过,未通过
  • 等等等等

如何定义一个State

了解:在传统开发模式下

在传统的前后端开发模式下我们实际上认为一类State其实就是这个数据库表中的一个字段比如

  • 1
    • 实际上是文章中的publishState这个字段取值是枚举
  • 2
    • 实际上是文章中的isTop这个字段取值可以是boolean
  • 3
    • 实际上是评论的applyState这个字段取值是枚举

比如我们在Demo项目中的Essay实体中就有这么一个属性

image-20241031162613970

这就是一种传统的定义方式在实体的属性中添加isTop这个字段然后去调用update去更新这个属性

在Oak框架中定义一个State需要熟悉

我们只需要在实体定义中,导出一个类型,里面去定义状态值的枚举即可,如下:

  • image-20241031163508522

  • 然后在State的类型中添加上这个新的state比如

  • image-20241031163608488

  • (这里的写法是联合类型Union Types表示取值可以为多种类型中的⼀种)

什么是Action

在oak框架中Action其实就是用户的行为具体的某一个业务行为比如用户对你的文章点赞用户对你进行关注。

这些一般情况下会表现为前端的一个按钮我所定义的按钮点击之后的行为就是一个Action

在Oak中编写一个Action

  • Action的编写与State类似如下
    • image-20241031164155501
    • 首先定义一个类型其取值表示具体的Action名称比如这里的enable就是启用disable就是禁用EnabledAction表示这一套Action的作用是启用或者禁用取一个容易记忆的名字方便后面编程
    • 然后将这个类型联合到Action定义中即可

State和Action相结合实现状态转移

  • 前面我们提到了State和Action我们很容易发现一般情况下通常都是一个或者多个State下可以执行某一项Action从而使当前的State转换为另一个State这里需要理解一下就比如点击发布按钮之后从未发布变成已发布,同理在已撤回的文章上点击发布按钮,也可以转换为已发布)
  • 举个例子:
    • 一篇文章的置顶与否
      • 初始状态为未置顶
      • 执行名为setTop的Action之后会从未置顶 -> 已置顶
      • 执行名为cancelTop的Action之后会从已置顶 -> 未置顶
  • 这里的文章置顶状态是一套State文章的setTop和cancelTop是一套Action他们之间是强关联的可以说这一套的State和Action就是相伴而生的我的Action就是为了转换State的值而State的值又限制了到底能执行哪个Action。

在Oak框架中定义这种状态转移

  • 不难得知我们定义State和Action的关联需要以下这几个值

    • 初始状态Initial state
    • 转移矩阵State transition matrix
      • 前一个状态 ---一个具体行为---> 后一个状态
      • 前一个状态 ---一个具体行为---> 后一个状态
      • 前一个状态 ---一个具体行为---> 后一个状态
  • 所以我们就以下面的形式进行定义:

    • image-20241031165144565
    • 这里的stm就是状态转移矩阵里面的参数名指的就是动作的名称后面的元组中定义的就是可以从什么状态转移到什么状态
    • 比如这里的publish其可以从未发布或者已撤回的状态转移为已发布
    • 这里的withdraw可以从已发布转换为已撤回
  • 注意这里的Action和State具有一定的命名规范具体的规范是这样的

  • Action的名称必须为xxxAction以大写开头

  • State的名称必须为xxxState以大写开头

  • 转移方程的定义中export const的变量名必须是xxxActionDefxxx以大写开头

在entity中应用这个状态

当我们定义完这个State之后别忘了在EntityDesc中引用这个具体的状态信息其会被作为entity的属性之一

image-20241031171052410

State和Action组合写法的优势

  1. 避免了根据state去检查action的Checker的编写。
  2. 避免了action相关的Trigger的编写。
  3. 统一了行为的名称和State的检查
  4. 统一的Action的定义颜色和不同State的状态名称以及颜色

小任务

现在项目中的Essay实体中的isTop属性还是传统的属性定义方式并且编写了checker和trigger去实现还有一些projection用到了这个属性。

现在请你将Essay实体中的isTop属性删除修改为State和Action的定义形式。