去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! 🚀

相关推荐
牛奔23 分钟前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌5 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX7 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法7 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端