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

相关推荐
小小小小宇3 小时前
虚拟列表兼容老DOM操作
前端
悦悦子a啊3 小时前
Python之--基本知识
开发语言·前端·python
Piper蛋窝3 小时前
深入 Go 语言垃圾回收:从原理到内建类型 Slice、Map 的陷阱以及为何需要 strings.Builder
后端·go
安全系统学习4 小时前
系统安全之大模型案例分析
前端·安全·web安全·网络安全·xss
涛哥码咖4 小时前
chrome安装AXURE插件后无效
前端·chrome·axure
OEC小胖胖4 小时前
告别 undefined is not a function:TypeScript 前端开发优势与实践指南
前端·javascript·typescript·web
行云&流水5 小时前
Vue3 Lifecycle Hooks
前端·javascript·vue.js
Sally璐璐5 小时前
零基础学HTML和CSS:网页设计入门
前端·css
老虎06275 小时前
JavaWeb(苍穹外卖)--学习笔记04(前端:HTML,CSS,JavaScript)
前端·javascript·css·笔记·学习·html
灿灿121385 小时前
CSS 文字浮雕效果:巧用 text-shadow 实现 3D 立体文字
前端·css