《程序员修炼之道》3

  1. 解耦与得墨忒耳法则
    核心思想:通过减少模块间依赖提升代码灵活性。

得墨忒耳法则(LoD):对象仅能调用自身、直接组件、传入参数或创建对象的方法。例如,a.b.Method()违反法则,应封装为a.Method(),避免链式依赖导致耦合爆炸158。

实践意义:降低维护成本,避免“简单修改引发连锁反应”18。

代价:需编写大量包装方法,可能增加性能开销,需权衡灵活性与效率15。

  1. 元数据驱动设计
    定义:元数据是“关于数据的数据”,用于描述配置和业务规则。

优势:

将易变细节(如界面文本、算法参数)移出代码,通过配置文件或数据库管理158。

支持动态调整,无需重新编译即可定制系统行为18。

应用场景:商业逻辑频繁变化的场景(如政策调整)58。

  1. 时间耦合与并发设计
    时间耦合问题:线性思维导致代码依赖时序,限制灵活性。

解决方案:

并发设计:分析工作流,识别可并行执行的任务,如使用异步消息队列解耦顺序依赖18。

黑板系统:模块通过共享数据空间(如JavaSpaces)匿名交互,实现完全解耦,减少接口爆炸问题18。

  1. 模型与视图分离
    MVC模式:分离数据模型(Model)、视图(View)、控制器(Controller)。

核心:模型不依赖具体视图实现,通过观察者模式(发布/订阅)通知状态变化18。

非GUI场景:例如业务逻辑与日志输出的分离18。

  1. 避免“巧合编程”
    问题:代码因偶然条件运行正常,但缺乏稳定性。

应对策略:

深思熟虑编程:明确需求边界,测试核心假设(如输入合法性)267。

防御性编程:假设外部输入不可信,验证边界条件67。

  1. 算法速率与复杂度
    O()表示法:评估算法性能,优先选择低阶复杂度(如O(n)优于O(n²))。

权衡实践:理论最优未必实际最快,需结合数据规模与场景(如快速排序平均O(n log n),但最差O(n²))27。

  1. 重构与测试驱动开发(TDD)
    重构时机:重复代码、非正交设计、需求变更或性能瓶颈267。

TDD流程:先编写测试用例,再实现功能,确保代码可测性与正确性26。

  1. 代码可测试性
    单元测试原则:模块在隔离环境下测试,覆盖正常与异常路径。

实践:将测试代码与功能代码同步维护,避免“一次性测试”267

  1. 需求陷阱与用户期望
    需求陷阱:避免盲目接受模糊需求,需主动引导用户明确目标。

关键问题清单:需求级别、范围、前置条件、成功/失败处理逻辑346。

  1. 曳光弹开发与原型设计
    曳光弹策略:快速构建核心功能链路,验证架构可行性,逐步迭代完善46。

原型作用:针对高风险领域(如性能、集成)构建可抛弃原型,降低试错成本68。

  1. 估算与资源管理
    估算方法:分阶段拆解需求,评估时间、数据库负载等资源。

单位选择:短期任务按“天”估算,长期项目按“月”或“年”346。

  1. 团队正交性与协作
    正交团队分工:按功能而非角色分配任务,减少职责重叠。

破窗理论:团队需共同维护代码质量,避免因个别“破窗”引发整体腐化346。

  1. 文档与代码内嵌知识
    DRY原则延伸:文档应避免重复代码逻辑,注释需解释“为什么”而非“怎么做”367。
posted @ 2025-04-30 21:47  曹明阳  阅读(44)  评论(0)    收藏  举报