信息隐藏模块化分解
§1摘要与结论
以「隐藏困难或可能变化的设计决策(secret)」为判据,把同一 secret 相关行为归入一个模块、仅经最小接口交互的分解方法,使变更局部化。
别名:Parnas 模块化、information hiding decomposition、模块分解 | 英文:Information-Hiding-Based Modular Decomposition | 类型:方法 / decomposition-method
§2局部关系图
§3原理 · 为什么
系统的多数复杂度来自设计决策的易变性。模块化效果不取决于是否拆分,而取决于划分判据:按处理步骤或流程图分解时,一个核心数据格式变更会波及多个模块;按信息隐藏分解时,同一变更只影响隐藏该决策的单个模块。模块是责任分配而非子程序,接口只揭示尽量少的内部工作,把易变实现隔离在内部,从而使变更局部化、可维护性提升。这一判据把模块边界与「最可能变化处」对齐,使封装不仅是语法手段,而成为控制变更成本的设计策略,并与「高内聚、低耦合」的目标内在一致。判据选择错误时,越努力拆分反而越难维护。判断判据是否正确的实用检验是:设想某个最可能变化的设计决策发生变化时需要改动几个模块,改动范围越集中,分解越接近信息隐藏的目标;反之若一个变更同时触及多个模块,往往说明某个 secret 被分散暴露。该检验可在评审中用具体变更场景推演,比抽象讨论更有效。
§4机制 · 如何运作
识别每类设计中困难或可能变化的 secret(数据结构、算法、外部接口假设、存储格式等),将同一 secret 相关的行为聚合到一个模块,仅通过最小且稳定的接口交互。模块边界由此与「最可能变化处」对齐,使变更的波及面收敛在模块内。Parnas 的 KWIC 案例以同一变更在两种分解下影响范围的差异,直接证明划分判据决定可修改性:按流程分解时存储格式变化触及所有模块,按信息隐藏分解时只触及一个。模块之间通过明确定义的接口协作,隐藏边界需持续裁剪,因为「隐藏些什么」本身是随认知演进的设计决策,而非一次确定的静态结构。把变更原因作为聚合依据,可使模块同时获得高内聚与低耦合。因此分解不是一次性静态划分,而应随对「什么最容易变化」的认识加深而调整;早期边界可较粗,待变化模式显现后再细化或合并;把变更历史作为识别 secret 的经验证据,可提升边界准确性。
§5工程 · 怎么落地
设计评审时追问「这个模块隐藏了什么 secret」;以接口与实现分离、深模块(接口简单而功能强大)承载信息隐藏;用内聚与耦合、connascence 度量巡诊边界;隐藏边界需持续裁剪,Parnas 指出 KWIC 中规定模块顺序即 design error,说明过度暴露信息会制造隐性耦合;结合重构手法族逐步调整既有代码的分解。把 secret 与变更原因对齐,避免按技术分层或处理步骤机械切分;并用架构检查或依赖分析持续验证模块间依赖方向,防止边界随演化被侵蚀。对每个模块都应能回答它隐藏什么、接口为何如此,以及变更时影响面多大。评审时可用变更影响分析或依赖图验证边界是否真正隔离了易变决策,而不是只在命名上体现模块化;新模块优先按 secret 而非按层创建,可避免先分层再拆分的反复。
§6权衡卡
隐藏过度会把相关逻辑割裂、增加接口与间接层,使本应内聚的行为被拆散;隐藏不足则变更扩散。
边界设计需在封装收益与间接成本间取平衡,而非追求极致的隐藏;当某条边界带来的间接层与协调成本超过其隔离收益时,合并或放宽边界同样是合理选择;信息隐藏是手段,降低变更成本才是目的。
反例:机械按处理步骤或按子程序切分模块(看似模块化),在核心决策变化时仍会大面积返工,说明形式上的模块化不等于可修改性。
第二个反例是只改结构而不调整所属 secret 的归属,边界与变化点错位,收益大打折扣;第三个反例是忽视抽象泄漏,误以为接口一旦定义即可永久屏蔽底层变化。
- 信息隐藏也无法完全屏蔽底层——抽象泄漏使被隐藏的机制在压力下重新显现,故边界需随认知与变更模式调整,而非一次固化。
- 边界应服务变更,而非成为新的教条。
权衡原文仅按显式标记词归栏引用(收益 / 代价 / 反例),其余句子按原序列为「原文要点」;内容逐字引用未改写。
§7案例带
去中心化聊天架构逆向
对一个仅有 58 份设计文档、尚未实现的开源去中心化聊天项目做架构逆向:从设计文本提炼 18 个模块及其依赖关系,重建模块依赖 DAG 与三条核心数据流 DAG,并输出全景理解与深度需求分析。
网申填写扩展逆向架构
对 Chrome MV3 网申自动填写扩展的逆向架构分析:梳理 popup、content、background、options 四模块职责,解剖 12 个站点适配器、双通道消息协议与隐私脱敏机制,并评估其零依赖零构建选型。
网申 v3 多模块解耦
一套面向高可扩展性的网申信息速查扩展架构:以 schema.js 为唯一数据驱动源,把数据模型、存储、纯函数与渲染组织为严格单向依赖的共享层,供 popup 与页面浮层双容器复用,并先立跨模块接口契约。
网申 v2 深度重构
一次由「改一处漏多处」症状触发的深度重构:定位到接口定义散落 12 个文件、存在 7 种接口形态的根因后,以单一契约源、dispatch 消息表与能力注册中心重建三层契约系统,恢复可审计与可校验性。
preset 通道耦合分析
对 harness「委派工具层→续用管理器→preset 服务→MCP 服务器」这条通道做耦合分析:识别契约、服务定位、数据契约、组合语义、路径与装配一致性六类耦合点,定位「静默丢弃特化」与「装配漂移」两处实质缝隙。
插件 DAG 两次级联升级
在同一知识库上继续两轮上游级联升级:处理数百次提交与包的增删,暴露「依赖声明不等于运行时引用」、分层须按最长路径深度、纯外部依赖边不得入主图等差分陷阱,并以全量门控校验收口。
dsh-manager 插件深度分析
以「编译依赖、运行时注入、组合装配」三硬依据加源码行号,对第三方插件做依赖、功能、需求溯源与设计问题裁决,并复用上游 DAG 知识库节点标识,使分析结果可与主图互查。
Hermes 七层架构总览
对八千余文件的工业级 AI Agent 项目做七层架构总览逆向,揭示其「越用越聪明」的自进化闭环如何在层间传导的控制型架构案例。
Claude Code 架构逆向
以社区逆向源码、系统提示词与官方文档三源交叉验证,还原一个商业 Agent 的查询引擎、子Agent、工具与权限体系的逆向分析案例。
Open Code Review 图谱
对阿里开源 AI 代码审查 CLI 做源码级解析并构建「知识 + 实践资产 + AI 索引」三合一知识图谱的工程案例。
§8信源与核验
核验结论:Parnas 用 KWIC 证明按流程分解时核心存储格式变更会波及所有模块,按信息隐藏分解时只影响单个模块 [PAP-002]
核验结论:Parnas 把 module 定义为责任分配(responsibility assignment),模块化效果取决于划分判据而非结构单位 [PAP-002]
§9原始关系清单
展开:本节点的全部原始关系边(4 条,含边 ID 与方向)
| 关系 | 方向 | 对端节点 | 说明 |
|---|---|---|---|
| 组合 | ← MTH-H-01 | 重构手法族 E-212 | 重构手法族用于达成信息隐藏分解边界 |
| 组合 | → MTH-G-04 | 领域驱动战略设计 E-211 | 信息隐藏与限界上下文同属模块边界判据 |
| 依据推导 | → ESS-H-01 | 信息隐藏 E-207 | 信息隐藏模块分解是信息隐藏原理的方法化 |
| 促成 | ← MTH-H-01 | 重构手法族 E-214 | 重构手法使信息隐藏在既有代码上可逐步落地 |