省时省力省钱省心省脑子
好学好用的编程方式
1. 场景描述
假设我们有一个 Person
对象,包含 name
和 age
两个字段。我们需要实现以下功能:
- 投票机构:18 岁以上有投票权。
- 社保机构: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
,我们可以实现一种基于 数据转换 的更自然的编程方式:
- 自动化数据转换 :
ruledef
自动监听age
的变化,并在变化时更新所有相关状态。 - 减少 Bug :状态更新由
imsure
自动处理,确保状态一致性不会出错。 - 功能解耦 :
Person
只维护自己的状态,不需要关心各个机构如何处理。 - 扩展性强 :各个机构独立观察
Person
的状态,并根据状态赋予权利或福利。 - 简单直观:更符合现实世界的法则,也让代码更简单、更易维护。
记住:
- 你不是在写逻辑,而是在描述 数据如何转换。
- 你不是在控制流程,而是在描述 数据之间的关系。
先尝试从一个小项目或一个数据结构开始吧。
Happy coding with imsure
! 🚀