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

相关推荐
帅帅哥的兜兜5 分钟前
next.js实现项目搭建
前端·react.js·next.js
筱歌儿10 分钟前
css 左右布局
前端·css
GISer_Jing35 分钟前
编译原理AST&以Babel为例进行解读、Webpack中自定义loader与plugin
前端·webpack·node.js
GISer_Jing36 分钟前
Webpack中Compiler详解以及自定义loader和plugin详解
前端·webpack·node.js
阑梦清川1 小时前
关于Go语言的开发环境的搭建
开发语言·后端·golang
浩~~1 小时前
CSS常用选择器
前端·css
lyrhhhhhhhh1 小时前
Spring 模拟转账开发实战
java·后端·spring
于慨1 小时前
uniapp+vite+cli模板引入tailwindcss
前端·uni-app
tonngw1 小时前
【Mac 从 0 到 1 保姆级配置教程 12】- 安装配置万能的编辑器 VSCode 以及常用插件
git·vscode·后端·macos·开源·编辑器·github
yunvwugua__1 小时前
Python训练营打卡 Day26
前端·javascript·python