一些鲍勃大叔的话

本文最后更新于:2023年4月17日 晚上

忙里偷闲了属于是

在断断续续写了一年多java和angular的项目后, 随着项目体积的增大, 感觉修改起来越来越吃力, 同时阅读新代码也是一门技术活, 这时候再来回顾鲍勃大叔备受好评的clean code, 感觉许多话都说在了点子上

真正被这样的项目折磨过了以后, 和没有什么项目经验之前来看这本书, 只能说感受完全不一样

一点点小小的记录

只记录自己感触很深的东西

命名

  • 不要添加无意义的前缀 (节约阅读成本, 同时方便IDE进行index)

  • 使用可搜索的名称, 虽然增加了代码量, 但是显著减少了后期review/新人阅读的成本

    • 一个典型的例子

函数

  • 保持函数的短小
  • 使用TO原则, 让一个函数下所有内容位于同一个抽象层级

  • 参数数量越少越好
  • 如果函数要对输入参数进行转换, 转换结果应该体现于返回值
1
2
3
4
5
// bad
void includeSetupInfo(StringBuffer text) // do sth with text

// good
StringBuffer includeSetupInfo(StringBuffer text)
  • 不要使用标识参数(bool), 那样违背了单一职责原则, 最佳的做法是将函数一分为二
1
2
3
4
5
6
// bad
render(Boolean isSuite);

// good
renderForSuite(); // 1
renderForSingleTest(); // 2
  • 当函数需要三个以上参数的时候, 说明参数应当被封装为类了
1
2
3
4
5
// bad
Circle makeCircle(double x, double y, double radius);

// good
Circle makeCircle(Point center, double raidus);
  • 函数不应该产生副作用而不说明, 如出现对全局变量的修改, 对输入参数的修改, 对其他初始化方法的调用
1
2
3
4
5
6
boolean checkPassword(String name, String password) {
// do sth for checking...
if (password.equals("??")) {
Session.initialize(); // bad: 它调用了session初始化却不在函数签名中透露出来
}
}
  • 使用异常代替返回错误码

单元测试

  • 测试代码和生产代码一样重要
  • 采用Build -> Operate -> Check模式写测试, 即构造测试数据 -> 操作测试数据 -> 检查期望结果
  • 测试采用FIRST原则:
    • Fast: 快速
    • Independent: 独立, 每个测试不应该依赖于其他测试
    • Repeatable: 可重复, 测试应该可以在任意环境中重复通过
    • Self-Validating: 可自我验证
    • Timely: 及时, 单元测试和生产代码应该一起编写或在编写生产测试之前编写单元测试

一些鲍勃大叔的话
https://blog.roccoshi.top/posts/49803/
作者
RoccoShi
发布于
2022年10月9日
许可协议