R1.02.3responsibility-based component boundary设计

组件边界应按职责而非按页面划分

别名: 组件边界 · 页面切片 · one page one component · 职责划分

概念解释

「设置页顶栏」按路由切下来,不是一个可复用单位。个人资料页需要同一段顶栏时,要么整段复制,要么从页面组件里往外掏。按职责划界(responsibility-based boundary)看的是这个单位决定什么、向外发出什么:它认不认导航结构、它发不发返回事件、它管不管标题文案。页面是这些单位的装配,不是组件本身。

一页一个组件,把路由写进了边界。路由一变,组件名和实现一起作废。

机制

页面切片编码的是信息架构里的一个节点,职责切片编码的是一个可替换的角色。顶栏的职责是展示当前层的标题并提供返回;表单段的职责是收集一组字段并上报值。两者出现在设置页上,是装配关系。把整页冻成 SettingsScreen,等于把装配结果当成零件——零件带着页面私有的间距、埋点和文案分支,拆不出来,也插不进别的路由。

职责边界用「它拒绝什么」来检验:顶栏不应知道表单校验,表单不应知道当前是哪条路由。能拒绝的,边界才是硬的。按页面切的组件什么都知道一点,什么都不能单独替换,变体表也会跟着长出「设置版 / 资料版」这种假轴。

边界

确实只出现一次、且没有第二处装配需求的营销落地页,做成整页组件的成本更低,不必为尚未存在的复用预切。应用壳(根布局、路由出口)本身就是页面级职责,硬拆成「通用顶栏」可能拆掉平台导航约定。服务端驱动的整页模板若按页面版本发布,边界在模板层,不在客户端组件层。跨团队所有权已按页面划分、短期无法改仓库结构时,先在页面内部划出职责文件,再谈抽到库。

怎么落地

  • 写组件简介时只允许出现职责(决定什么、发出什么),不允许出现路由名或页面名。
  • 第二处需要同一段 UI 时,抽出的是职责单位,而不是把第一个页面组件改成带 variant="profile" 的巨件。
  • 页面文件只做装配:引入若干职责组件并接线,自身不写视觉变体。
  • 验证:换一条路由复用同一顶栏,页面文件只改装配,顶栏文件零修改。顶栏里若出现「若在设置页则…」的分支,边界仍按页面切。

延伸

  • 同组R1.02.1 变体需覆盖真实使用的组合 · R1.02.2 变体数量爆炸意味着抽象错误
  • 相邻R1.11 组件的可组合性 · R1.17 组件的过度抽象
  • 站内检索responsibility-based component boundary · page slice · composition root

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/R1.02.3