去TMD的逻辑过程,不写了

省时省力省钱省心省脑子

好学好用的编程方式

体验完整 Demo
查看详细文档
GitHub 地址

1. 场景描述

假设我们有一个 Person 对象,包含 nameage 两个字段。我们需要实现以下功能:

  1. 投票机构:18 岁以上有投票权。
  2. 社保机构:60 岁以上可以享受退休福利。

在传统编程中,我们需要手动编写逻辑来管理每个地方的状态更新,容易遗漏,难以维护。而在 imsure 中,我们不需要写这些逻辑,而是通过 数据转换 来实现:输入数据(age)通过规则自动转换为输出数据(canVotecanRetire


2. imsure 写法:数据转换的核心

2.1 定义 Person 类型

首先,我们定义 Person 类型,包含 nameage 两个字段。

typescript 复制代码
import { typedef, string, int32 } from 'imsure'

// 定义个人类型
const Person = typedef({
  name: string, // 姓名
  age: int32, // 年龄
})

2.2 定义规则:数据转换的关键

2.2.1 投票机构的规则

投票机构的规则是:Personage 大于等于 18 岁时,canVotetrue

typescript 复制代码
const VotingAgency = typedef({
  person: Person,
  canVote: bool, // 是否有投票权
  '@init': (self) => {
    self.person = self.person
  },
})

ruledef(
  VotingAgency,
  'canVote',
  {
    person: {
      age: true, // 监听 person.age 的变化
    },
  },
  (self) => {
    self.canVote = self.person.age >= 18 // 18 岁以上有投票权
  },
)

重点

这里的关键是 数据转换 ,而不是逻辑控制。我们描述了 canVoteage 的转换结果。

输入数据person.age
输出数据canVote
转换规则canVote = age >= 18


2.2.2 社保机构的规则

社保机构的规则是:Personage 大于等于 60 岁时,canRetiretrue

typescript 复制代码
const SocialSecurityAgency = typedef({
  person: Person,
  canRetire: bool, // 是否可以退休
  '@init': (self) => {
    self.person = self.person
  },
})

ruledef(
  SocialSecurityAgency,
  'canRetire',
  {
    person: {
      age: true, // 监听 person.age 的变化
    },
  },
  (self) => {
    self.canRetire = self.person.age >= 60 // 60 岁以上可以退休
  },
)

重点

同样,这里也是 数据转换 ,而不是逻辑控制。我们描述了 canRetireage 的转换结果。

输入数据person.age
输出数据canRetire
转换规则canRetire = age >= 60


2.3 初始化数据

2.3.1 初始化 Person

我们初始化一个 Person 对象,设定其 nameAliceage 为 15 岁。

typescript 复制代码
import { typeinit } from 'imsure'

const person = typeinit(Person, {
  name: 'Alice',
  age: 15, // Alice 今年 15 岁
})

2.3.2 初始化机构

接下来,我们初始化投票机构和社保机构,并 挂载 person

typescript 复制代码
const votingAgency = typeinit(VotingAgency, { person })
const socialSecurityAgency = typeinit(SocialSecurityAgency, { person })

console.log(votingAgency.canVote) // false(15 岁 < 18 岁)
console.log(socialSecurityAgency.canRetire) // false(15 岁 < 60 岁)

重点

此时,canVotecanRetire 的值是根据 person.age 自动转换而来的。


2.4 数据更新与自动状态管理

Personage 发生变化时,规则 会自动更新相关机构的状态。

typescript 复制代码
person.age = 20 // Alice 今年 20 岁

// 各个机构自动更新
console.log(votingAgency.canVote) // true(20 岁 >= 18 岁)
console.log(socialSecurityAgency.canRetire) // false(20 岁 < 60 岁)

重点

这里的关键是 数据转换的自动触发 。当 age 变化时,canVotecanRetire 会自动重新计算,不需要手动编写更新逻辑


3. 总结

通过 imsure,我们可以实现一种基于 数据转换 的更自然的编程方式:

  1. 自动化数据转换ruledef 自动监听 age 的变化,并在变化时更新所有相关状态。
  2. 减少 Bug :状态更新由 imsure 自动处理,确保状态一致性不会出错。
  3. 功能解耦Person 只维护自己的状态,不需要关心各个机构如何处理。
  4. 扩展性强 :各个机构独立观察 Person 的状态,并根据状态赋予权利或福利。
  5. 简单直观:更符合现实世界的法则,也让代码更简单、更易维护。

记住

  • 你不是在写逻辑,而是在描述 数据如何转换
  • 你不是在控制流程,而是在描述 数据之间的关系

先尝试从一个小项目或一个数据结构开始吧。

Happy coding with imsure! 🚀

相关推荐
安的列斯凯奇12 分钟前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
架构文摘JGWZ42 分钟前
FastJson很快,有什么用?
后端·学习
BinaryBardC42 分钟前
Swift语言的网络编程
开发语言·后端·golang
邓熙榆1 小时前
Haskell语言的正则表达式
开发语言·后端·golang
古蓬莱掌管玉米的神3 小时前
vue3语法watch与watchEffect
前端·javascript
林涧泣4 小时前
【Uniapp-Vue3】uni-icons的安装和使用
前端·vue.js·uni-app
雾恋4 小时前
AI导航工具我开源了利用node爬取了几百条数据
前端·开源·github
专职4 小时前
spring boot中实现手动分页
java·spring boot·后端
拉一次撑死狗4 小时前
Vue基础(2)
前端·javascript·vue.js
Ciderw4 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·