枚举元素表,其实是给大脑做一张“导航图”
第一次真正意识到 枚举元素表 这个东西有多重要,是我在改一个老项目的 Bug。
那是一个很旧的订单系统,状态多得离谱:新建、待支付、已支付、退款中、部分退款、已关闭、已完成、异常冻结……代码里到处是 if-else。每个人写的时候都自信满满:
“这个逻辑很简单啊,就几个判断。”
结果就是:稍微一改需求,整个系统像抽积木一样,哪里都在晃。直到我咬牙把所有状态整理成一张 枚举元素表,那一刻,我突然有一种“终于有人给这堆乱麻梳头了”的感觉。
什么是枚举元素表?别急着给它下教科书式定义
很多人一听“枚举元素表”就条件反射地想起某种教科书定义:
把一类有限且离散的取值列出来,并赋予编码、名称、说明等属性的结构化列表。
听起来很对,但也很无聊。
在我自己的理解里,枚举元素表 更像是:
- 给一堆散落在脑子里的“状态”装一个整齐的抽屉
- 把容易被忽略的小差别用文字钉在桌面上
- 迫使自己把“说不清的东西”说清楚
它不只是“列出来”,而是要让你自己对这些元素负责。每一个枚举值为什么存在、允许出现在什么场景、不能和什么混用,都应该在这张表里有影子。
为什么我现在写系统,几乎必定先画枚举元素表
坦白讲,我以前也觉得这种表“有点多余”,尤其是小功能,心想:两三个状态还用得着表?直接写常量不就完了。
直到我踩过几次坑:
- 某个布尔字段
is_active,后来又多了is_deleted,再后来又多了status,然后大家都搞不清到底以哪个为准 - 支付方式一开始只有“微信、支付宝”,后来多了“平台余额、优惠券、银行卡”,结果旧逻辑里硬编码的
if pay_type in (1,2)全部翻车 - 新人接手项目,看着几十个魔法数字——根本没人知道 7 是啥,9 又代表什么
从那之后,只要牵涉到“状态”“类别”“类型”等词,我就会下意识地先打开一页文档,写上几个字:
枚举元素表:XXX
然后开始一行行列:
- 编码(code)
- 名称(name)
- 展示文案(label)
- 说明(desc)
- 可能的状态流转(from → to)
那些原本在脑子里模糊的东西,一旦被逼着写进 枚举元素表,就没法再含糊过去。
好用的枚举元素表,长什么样?
先给一个极简但实用的模型。比如订单状态,你完全可以这样设计一张 枚举元素表:
“`text
【订单状态枚举元素表】
code | name | label | desc | from | to
—–|————-|———–|——————————|————–|——————-
0 | CREATED | 已创建 | 用户刚提交订单,未支付 | – | PAYING, CANCELED
1 | PAYING | 支付中 | 跳转支付中,等待回调 | CREATED | PAID, CANCELED
2 | PAID | 已支付 | 支付完成,待发货 | PAYING | SHIPPED, REFUND
3 | SHIPPED | 已发货 | 物流中 | PAID | FINISHED
4 | FINISHED | 已完成 | 用户确认收货或超时自动完成 | SHIPPED | –
5 | CANCELED | 已取消 | 用户主动取消或超时未支付关闭 | CREATED,PAYING| –
6 | REFUND | 退款中 | 走退款流程 | PAID | CANCELED
“`
这张表看起来很普通,但它至少提供了几件非常关键的事情:
- 所有状态的全集,一眼就能看到
- 每个状态允许从哪里来、到哪里去,写死了,避免乱跳
- 以后加状态时,会意识到自己是不是在破坏既有规则
你可以说,这不就是“状态机”嘛。对,枚举元素表 本质上就是把状态机“拉直”,让人眼能看懂。
不只是程序员,很多场景都需要枚举元素表
我后来发现,不写代码的人其实更需要这种东西,只是平时没叫它这个名字。
比如 HR 在搞“员工职级体系”:实习生、初级、中级、高级、资深、专家。
如果没有一张清晰的 枚举元素表:
- 每个级别对应什么职责
- 什么样的绩效可以晋级
- 哪些级别可以带团队
那晋升答辩现场就会变成一场“谁更会说”的比赛。而有一个结构化的 枚举元素表 后,你至少可以问:
你现在说自己是“资深”,那我们看下表里写的那个标准,你对得上吗?
再比如做内容运营的人,常常要规划“内容类型”:
- 干货文章
- 活动公告
- 用户故事
- 行业观察
如果你只是模糊地说“就这几类”,执行时常会变形。把它们写成一份细致的 枚举元素表:
- 类型编码:ARTICLE、EVENT、STORY、INSIGHT
- 推荐场景:新用户引导、留存、转化、品牌曝光
- 字数范围:大致区间
- 是否需要配图:是 / 否
那么,你的团队就不会每个人都在脑子里搞自己的一套“潜规则”。
枚举元素表,真正的价值在“逼问自己”
我最喜欢 枚举元素表 的地方是:它会让我暴露自己的犹豫。
比如你设计一个「任务优先级」系统,随手写下:
- 1:低
- 2:中
- 3:高
- 4:紧急
写到这里你可能突然一愣:
“高”和“紧急”到底怎么区分?
如果你不做 枚举元素表,这个问题很容易就被“先放着吧”带过去了。直到某一天,运营说:
这个任务很紧急但不重要,你要排哪儿?
然后你就开始现场编故事。但如果你在表里必须写 desc,你可能会这样拆:
- 高优先级:重要但不一定马上做,影响长期目标
- 紧急:时间敏感,超过时间点就失效
甚至,你会意识到其实需要的是两个枚举:
- 重要程度
- 时间紧迫度
这就是 枚举元素表 的魔力——它是一个对自己诚实的小仪式。
我常用的“枚举元素表检查清单”
如果你准备写一张 枚举元素表,可以试着问自己几件事:
- 这些元素是不是“有限的、可数的”?如果是无限变化的,就不适合做枚举
- 每一个元素是否有清晰边界?能否说一句话把它和其他元素区分开
- 是否存在“组合”的可能?如果是多维度组合,是不是要拆成多个枚举
- 未来扩展时,这个 枚举元素表 是否还能保持不乱?是否预留了未知类型
举个小例子:性别字段。
很多老系统里是:
- 0:未知
- 1:男
- 2:女
放在现在,这种 枚举元素表 已经明显太粗糙了。现实世界的多元性更丰富,至少要考虑:
- 用户不愿透露
- 非二元性别
于是你会开始反思:是不是要把“生理性别”和“展示性别”拆成两个枚举?是不是要允许自定义?这些讨论本身,就来自于你拿它当一张严肃的 枚举元素表 去设计。
写在最后:别小看一个小小的表
说到这里,你大概能感觉到,我其实是有点“偏爱” 枚举元素表 的。
它看起来只是几行几列的数据,但在我自己的工作体验里,它代表的是一种很朴素却很珍贵的态度:
把事情说清楚,把边界画清楚,把可能性写在明面上。
如果你经常觉得:
- 项目越做越乱
- 状态越来越多,谁也说不清全貌
- 新人接手总要反复问“这个是啥意思”
那不妨从现在开始,给自己养成一个习惯:
在动手写逻辑之前,先花十分钟,写一张 枚举元素表。
你可能会嫌它慢,但等到几个月后回头看,你会发现,那十分钟帮你省下的是几天、甚至几周在混乱中打补丁的时间。
而且,老实说,当你把一个复杂领域抽丝剥茧,最后凝练成一张清晰的 枚举元素表 时,那种“终于理顺了”的畅快,是挺上头的。像是给自己杂乱的脑海,装了一个很合适的书柜。
发表回复