E2.07.3mask over-constraint设计研究

掩码不得限制合法的变体格式

别名: 掩码拒收变体 · over-constrained mask · 国际电话掩码

概念解释

掩码按一张固定格子图收字。现实里同一字段往往有多种合法变体:手机号带不带国家码、信用卡有 16 位也有 19 位、日期有日月年。格子图若只画了其中一种,其余合法输入会被挡在键入阶段。这叫掩码过度约束(mask over-constraint)。它管的是「哪些形状被允许进来」,不是插杠能不能减负,也不是粘贴时光标会不会跳。

机制

掩码的力量来自它拒绝一切对不上格子的键。这在变体集合等于一的时候是帮助,在变体集合大于一的时候变成误拒。人无法把「+86」塞进只留 11 个数字格的槽,也无法把美式 MM/DD 打进 YYYY-MM-DD 的格子,哪怕后端其实能解析。过度约束把本该在语义层做的校验提前到了按键层,合法值连组装的机会都没有。旅行者、移民、用外国发行银行卡的人会稳定撞上本国格子。掩码还可能把 Ext、分机、空格当成非法,进一步收窄。

怎么研究

列出该字段在真实业务里出现过的合法写法(日志、客服更正、国际样本),逐条键入或粘贴到掩码里,记录被拒的比例和拒绝发生在第几个字符。自变量:是否检测国家码再换格子、是否允许长度范围。因变量:合法变体通过率、用户改写后仍失败的次数。不要只用本国幸福路径当测试集。若后端解析器能接受的串比掩码宽,差距就是过度约束的量。

边界

账户体系明确只服务一个地区、一个编号方案时,单格子是正确约束,变体本就不合法。支付卡号的长度虽有几种,但每一种仍是严格数字分组,可用「先识别卡组织再切换掩码」而不是放弃掩码。自由文本、姓名、地址没有稳定格子,不该上掩码。用户切换地区或语言后,若掩码不跟着换,昨天合法的写法今天会被同一产品拒绝。

怎么落地

  • 先列出该字段所有要接受的合法形状,只有集合大小为一时才用固定掩码。
  • 集合大于一时,按已输入前缀切换格子(国家码、卡号 BIN),或改成宽松键入加失焦格式化。
  • 把掩码拒绝的键记下来对照业务日志:反复出现的「非法」若在后端其实合法,就放宽格子。
  • 验证:用国际号码、带分机的总机、19 位卡号、本地与 ISO 日期各走一遍。任何一条在第一个「不匹配」字符上被卡住,而业务应当收下,就是过度约束。

延伸

  • 同组E2.07.1 掩码自动插入分隔符降低输入负担 · E2.07.2 掩码会干扰粘贴与光标移动
  • 相邻E2.13 日期选择器 · E2.19 货币、单位与量纲输入
  • 站内检索mask over-constraint · international phone mask · format variant

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/E2.07.3