去TMD的逻辑过程,不写了

省时省力省钱省心省脑子

好学好用的编程方式

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

1. 场景描述

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

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

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


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

2.1 定义 Person 类型

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

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

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

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

2.2.1 投票机构的规则

投票机构的规则是:当 Person 的 age 大于等于 18 岁时,canVote 为 true。

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 岁以上有投票权
  },
)

重点 :

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

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


2.2.2 社保机构的规则

社保机构的规则是:当 Person 的 age 大于等于 60 岁时,canRetire 为 true。

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 岁以上可以退休
  },
)

重点 :

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

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


2.3 初始化数据

2.3.1 初始化 Person

我们初始化一个 Person 对象,设定其 name 为 Alice,age 为 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 岁)

重点 :

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


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

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

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

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

重点 :

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


3. 总结

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

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

记住:

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

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

Happy coding with imsure! 🚀

相关推荐
小杨互联网几秒前
Go 现代 CLI 工具离线镜像合集
开发语言·后端·golang·开源·go·命令行
lazy H6 分钟前
【计算机网络】第 15 篇:Java BIO、NIO 与高并发网络通信——从 Socket 理解 I/O 模型
网络·后端·tcp/ip·计算机网络·nio·408
FRing0311 分钟前
JavaScript入门到精通三十三(异常处理、call方法、apply方法、bind方法、防抖、节流)
开发语言·前端·javascript
geovindu17 分钟前
rust: Semaphore Pattern
开发语言·后端·设计模式·rust·代理模式·企业级信号量模式·同步型模式
计算机魔术师1 小时前
OpenAI 砍掉 100 亿融资目标,AI 资本市场的温度计变了
前端
jktantan1 小时前
(二)Vue 3 的 attrs 不是响应式:el-form 扩展属性同步的三种方案
前端·javascript·vue.js·element-plus
前端 贾公子2 小时前
第 5 章:Codex 从可运行程序到可交付工具
java·前端·数据库
用户360055579002 小时前
Kestrel_VLLM - 26 · 发射空档三步曲:事件计时 → nsys → 判别实验
前端
Thneonl2 小时前
Claude Code 频繁 Compacting?发布次日我根治了 2 个痛点
后端·rust
echome8882 小时前
JavaScript async/await 错误处理:别让 Promise 静默失败
开发语言·前端·javascript·promise