代码组织与长期演进
按变化、约束和反馈组织代码,解释抽象、范式、仓库边界、渐进迁移和设计证据。
从一种变化认识设计
软件设计为后续行为和变化建立结构。构造一个导入功能:读取文件、验证行、取得当前权限、写入记录、报告结果。把整条链塞进一个函数会使规则、外部访问和反馈纠缠;逐行拆成小函数也可能让流程难以追踪。应先识别哪些规则一起变化,哪些外部条件需要独立控制,哪些结果必须一起成立。
一个可用的分解是:解析器把字节变成候选记录;业务规则判断候选能否接受;存储边界提交变化;应用流程组织前后次序;呈现层把结果表达给调用方。每个边界有可说明的输入、输出、错误和责任。此分解是教学选择,实际项目可以合并成本大于收益的边界。
模块隐藏的是变化知识。Parnas 的经典论文以信息隐藏比较模块划分:围绕可能改变的设计决定建立边界,能减少其他模块对其内部的依赖。它是一种设计依据,不能推出“每个目录必须对应一个领域”或所有项目都应采用相同层数。Parnas,On the Criteria To Be Used in Decomposing Systems into Modules
抽象要保留哪些关系
抽象用一份规则表达多个具体情形。两个函数都调用 HTTP,并不足以证明它们具有相同语义:一个是可缓存读取,另一个是可能扣款的提交。强行统一重试会改变业务效果。判断共享时,比较输入关系、状态变化、失败和演进原因,而非仅比较相似代码。
重复代码可以提示重复知识,也可以只是偶然相似。抽出公共规则后,其使用者应依赖真实共同契约;变化参数越来越多、调用方总要绕过默认行为,说明抽象范围可能不合适。把“订单状态如何转移”集中维护,比把所有循环语法集中成通用工具更能减少规则漂移。
接口应表达使用者需要的能力。存储接口 saveDraft 比同时暴露完整数据库连接和表名更能约束调用方,但它也必须说明版本检查、事务和失败。封装不自动提供这些保证;把细节藏起来后,契约仍应可判断。
范式怎样改变表示
面向对象把数据与相关操作组织在对象中,适合保持对象身份、生命周期和可替换职责。函数式组织强调显式输入输出、组合和对副作用的隔离,便于推演与测试。数据导向组织关注数据布局和批量处理,适合访问模式、局部性与吞吐成为主约束的工作。
这些组织方式可以组合。导入解析使用纯函数,持有连接的对象管理生命周期,批量写入按数据布局降低开销。采用某个范式前,应指出需要解决的具体问题;对象层数、函数数量或抽象名称无法单独证明可维护性。
错误也属于设计接口。用户输入拒绝、外部暂时不可用和内部不变量破坏需要不同处理。显式结果使调用方能选择反馈、重试或终止;异常传播适合需要中断并保留诊断的路径。不要把所有失败压成“失败”,也不要要求调用者从任意错误文本猜测业务状态。
逻辑模块怎样落到仓库
目录、包和仓库是物理组织。它们可以承载职责,也受工具、发布和协作影响。一个目录并不强制依赖方向;一个独立包也可能仍读取其他包内部文件。公开出口、依赖声明、检查和所有者共同建立真实边界。
按功能组织使同一次变化的文件容易相邻;按技术层组织使同类基础设施集中。混合组织可以在功能内分层,再共享真正共同的能力。跨功能调用应经清晰接口,避免把所有相互使用都下沉到含义模糊的 common。
monorepo 便于原子修改和统一检查,需要保持各项目依赖、工具和发布范围明确。多仓库可以独立发布和授予访问权,也增加契约版本与协调成本。分支策略应对应发布频率、集成条件和恢复方式;仓库大小、提交次数都无法单独决定一种策略更好。
怎样演进而保留结果
演进先取得现有行为与约束,再建立变化接缝。替换一个依赖时,可以在稳定接口下让新实现与旧实现暂时共存,选择受控流量核对结果,再移除旧路径。共存需要明确退出条件,长期保留双写或双解析会增加事实来源和故障组合。
跨数据或协议的迁移还需要顺序。先加入新消费者能理解的结构,迁移生产者和旧数据,观察兼容范围,最后删除旧结构。软件回滚可能无法撤销新数据,所以“可恢复”必须分别说明产物、模式、写入与外部效果。
重写适合旧边界严重阻碍目标、迁移接缝难以建立且有足够行为证据的情形;渐进修改适合能局部隔离风险的情形。旧系统积累的边界规则、异常和真实数据需要迁移。只比较新旧代码行数会遗漏这些知识。
技术债应连接具体后果:哪个变化受阻、哪个失败概率或修复成本增加、什么触发条件下需要偿还。待办标签只有在能决定行动时才有价值。废弃接口应给出替代、期限、实际使用证据和移除条件。
反馈怎样支撑设计判断
静态检查能够拒绝某些非法表示;测试能够确认特定输入下的行为;评审能够发现需求和结构缺口;部署观测能够发现真实负载下的结果。每项反馈应接到它能确认的性质,避免用覆盖率或产码量替代设计质量。
历史代码组织研究讨论了类型、TDD、架构风格和 AI 开发的争议。它所引用的缺陷重检、团队调查和特定任务实验各有不同分母;某批旧缺陷可被类型检出,不能直接推出团队减少相同比例缺陷。原报告的证据等级和置信度是作者判断,本页保留条件化推理,不转成统一质量评分。
学习代码结构时,可以沿一条真实行为读取入口、规则、数据变化、失败和验证,再比较可替换的设计。能够说出某个边界限制了哪种影响,比记住架构缩写更能支持下一次变化。
最后更新于