E2.07.3mask over-constraint设计研究
掩码不得限制合法的变体格式
别名: 掩码拒收变体 · over-constrained mask · 国际电话掩码
概念解释
掩码按一张固定格子图收字。现实里同一字段往往有多种合法变体:手机号带不带国家码、信用卡有 16 位也有 19 位、日期有日月年。格子图若只画了其中一种,其余合法输入会被挡在键入阶段。这叫掩码过度约束(mask over-constraint)。它管的是「哪些形状被允许进来」,不是插杠能不能减负,也不是粘贴时光标会不会跳。
机制
掩码的力量来自它拒绝一切对不上格子的键。这在变体集合等于一的时候是帮助,在变体集合大于一的时候变成误拒。人无法把「+86」塞进只留 11 个数字格的槽,也无法把美式 MM/DD 打进 YYYY-MM-DD 的格子,哪怕后端其实能解析。过度约束把本该在语义层做的校验提前到了按键层,合法值连组装的机会都没有。旅行者、移民、用外国发行银行卡的人会稳定撞上本国格子。掩码还可能把 Ext、分机、空格当成非法,进一步收窄。
怎么研究
列出该字段在真实业务里出现过的合法写法(日志、客服更正、国际样本),逐条键入或粘贴到掩码里,记录被拒的比例和拒绝发生在第几个字符。自变量:是否检测国家码再换格子、是否允许长度范围。因变量:合法变体通过率、用户改写后仍失败的次数。不要只用本国幸福路径当测试集。若后端解析器能接受的串比掩码宽,差距就是过度约束的量。
边界
账户体系明确只服务一个地区、一个编号方案时,单格子是正确约束,变体本就不合法。支付卡号的长度虽有几种,但每一种仍是严格数字分组,可用「先识别卡组织再切换掩码」而不是放弃掩码。自由文本、姓名、地址没有稳定格子,不该上掩码。用户切换地区或语言后,若掩码不跟着换,昨天合法的写法今天会被同一产品拒绝。
怎么落地
- 先列出该字段所有要接受的合法形状,只有集合大小为一时才用固定掩码。
- 集合大于一时,按已输入前缀切换格子(国家码、卡号 BIN),或改成宽松键入加失焦格式化。
- 把掩码拒绝的键记下来对照业务日志:反复出现的「非法」若在后端其实合法,就放宽格子。
- 验证:用国际号码、带分机的总机、19 位卡号、本地与 ISO 日期各走一遍。任何一条在第一个「不匹配」字符上被卡住,而业务应当收下,就是过度约束。