《程序员修炼之道》3
- 解耦与得墨忒耳法则
核心思想:通过减少模块间依赖提升代码灵活性。
得墨忒耳法则(LoD):对象仅能调用自身、直接组件、传入参数或创建对象的方法。例如,a.b.Method()违反法则,应封装为a.Method(),避免链式依赖导致耦合爆炸158。
实践意义:降低维护成本,避免“简单修改引发连锁反应”18。
代价:需编写大量包装方法,可能增加性能开销,需权衡灵活性与效率15。
- 元数据驱动设计
定义:元数据是“关于数据的数据”,用于描述配置和业务规则。
优势:
将易变细节(如界面文本、算法参数)移出代码,通过配置文件或数据库管理158。
支持动态调整,无需重新编译即可定制系统行为18。
应用场景:商业逻辑频繁变化的场景(如政策调整)58。
- 时间耦合与并发设计
时间耦合问题:线性思维导致代码依赖时序,限制灵活性。
解决方案:
并发设计:分析工作流,识别可并行执行的任务,如使用异步消息队列解耦顺序依赖18。
黑板系统:模块通过共享数据空间(如JavaSpaces)匿名交互,实现完全解耦,减少接口爆炸问题18。
- 模型与视图分离
MVC模式:分离数据模型(Model)、视图(View)、控制器(Controller)。
核心:模型不依赖具体视图实现,通过观察者模式(发布/订阅)通知状态变化18。
非GUI场景:例如业务逻辑与日志输出的分离18。
- 避免“巧合编程”
问题:代码因偶然条件运行正常,但缺乏稳定性。
应对策略:
深思熟虑编程:明确需求边界,测试核心假设(如输入合法性)267。
防御性编程:假设外部输入不可信,验证边界条件67。
- 算法速率与复杂度
O()表示法:评估算法性能,优先选择低阶复杂度(如O(n)优于O(n²))。
权衡实践:理论最优未必实际最快,需结合数据规模与场景(如快速排序平均O(n log n),但最差O(n²))27。
- 重构与测试驱动开发(TDD)
重构时机:重复代码、非正交设计、需求变更或性能瓶颈267。
TDD流程:先编写测试用例,再实现功能,确保代码可测性与正确性26。
- 代码可测试性
单元测试原则:模块在隔离环境下测试,覆盖正常与异常路径。
实践:将测试代码与功能代码同步维护,避免“一次性测试”267
- 需求陷阱与用户期望
需求陷阱:避免盲目接受模糊需求,需主动引导用户明确目标。
关键问题清单:需求级别、范围、前置条件、成功/失败处理逻辑346。
- 曳光弹开发与原型设计
曳光弹策略:快速构建核心功能链路,验证架构可行性,逐步迭代完善46。
原型作用:针对高风险领域(如性能、集成)构建可抛弃原型,降低试错成本68。
- 估算与资源管理
估算方法:分阶段拆解需求,评估时间、数据库负载等资源。
单位选择:短期任务按“天”估算,长期项目按“月”或“年”346。
- 团队正交性与协作
正交团队分工:按功能而非角色分配任务,减少职责重叠。
破窗理论:团队需共同维护代码质量,避免因个别“破窗”引发整体腐化346。
- 文档与代码内嵌知识
DRY原则延伸:文档应避免重复代码逻辑,注释需解释“为什么”而非“怎么做”367。