欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

十二、编写高质量的代码——思想为源(笔记)

程序员文章站 2022-06-16 16:17:17
...

 

本博文为《编写高质量代码—改善Java程序的151个建议》一书的阅读笔记。该书从很多方面给予了编写高质量代码的宝贵经验。而且该书应该是那种开发经验越丰富,体会越深的书籍。在阅读过程中,从该书中收获良多,这里主要作下书籍笔记,有体会的地方加点自己的想法。受限于知识水平,部分内容还没能深刻体会,所以更多更好的内容和具体实例还需要从书中去找寻。

编码不仅仅是把代码写出来,还要求清晰地表达出编码者头脑中的逻辑,准确地传递到计算机中执行,同时也能被其它编码者轻松阅读,而要实现这些目标,则要求代码有清晰、正确的思想,即编程思想。——秦小波(书籍作者)

一、提倡良好的代码风格

优秀团队的编码风格应该具有如下几个特征:

  1. 整洁:这样可读性好;
  2. 统一:这样减少代码的差异性,更易于理解;
  3. 流行:流行必有基因,风格值得参考;
  4. 便捷:有通用工具支持,这样降低统一风格的成本。

这部分内容我写过一篇博文《Java编码规范—"约定"也要"配置"》,算是一个具体的实现思路。

二、不要完全依靠单元测试来发现问题

主要有四个原因:

  1. 单元测试不可能测试所有的场景(路径):单元测试必须测试的三种数据场景是:正常场景、边界场景、异常场景。但是单元测试的代码覆盖率达到60%都很困难。覆盖不全则难免会有缺陷。
  2. 代码整合错误是不可避免的:单元测试往往测试的是一个独立单元,这样在不同单元间整合测试时难免出现错误。
  3. 部分代码无法(或很难)测试
  4. 单元测试验证的是编码人员的假设:有点自已验证自己的意思,难免因为思维局限或者理解偏差等原因验证不正确。

所以不能完全靠单元测试来发现问题,但单元测试是很重要的一环。以个从的经验而言:大的项目一般测试可能从需求阶段就开始介入,对于开发而言可能有单元测试,冒烟测试,集成测试,系统间联调测试,性能测试等等,而且很多测试工作是配合专门的测试团队完成。

三、让注释正确、清晰、简洁

注释是为了帮助代码阅读者更好地理解代码的,良好的注释习惯包括:

  1. 不要废话:只写与代码相关的注释,不要抒情。
  2. 不要用注释写故事:例如书中的汉诺塔算法注释把算法的故事分析应用比较都写上去了,没有必要。应该准确简单地表达。
  3. 不要添加不必要的注释:过于简单的注释,地球人都知道的就不要添加注释了。
  4. 注释及时更新:代码有变化时注意注释的更新。
  5. 注释不要写太多:注释写太多往往就喧宾夺主了,影响了代码的可读性。
  6. 不要用注释记流水帐:例如不要用注释记录代码版本的变迁,这应该交给版本管理工具。
  7. 为JavaDoc编写的注释也要考虑可读性:写注释也是为了人看的,标签写太多同样影响可读性。

四、让接口的职责保持单一

单一职责原则要示接口定义的时候尽可能保持单一,这样能最大程度地保证接口的稳定性,降低类的复杂度,同时也能增加可读性和可维护性。

五、增加类的可替换性

为了增加类的可替换性,在设计时需要考虑以下三点:

  1. 子类型必须完全实现父类型的方法:即子类型应该更多地是增强父类 的功能。
  2. 前置条件可以放大:即子类的方法参数可以比父类的范围大。
  3. 后置条件可以放小:即子类的返回值可以比父类的范围小。

六、依赖抽象而不是实现

  1. 尽量抽象:每个类都尽量有接口或抽象类,或两者都有。
  2. 表明类型必须是抽象的:比如对象申明时最好用接口声明。
  3. 尽量不要覆写父类的方法。
  4. 抽象不关注细节:抽象负责定义关系与公共部分的实现,具体业务逻辑应该由具体的实现类去实现。

七、抛弃7条不良的编码习惯

  1. 不良一:*格式的代码
  2. 不良二:不使用抽象的代码
  3. 不良三:彰显个性的代码
  4. 不良四:死代码,即不可能被执行到的代码。
  5. 不良五:冗余代码,没有用的代码要及时删除。
  6. 不良六:拒绝变化的代码,旧的代码要注意重构更新。
  7. 不良七:自以为是的代码,即不写测试代码的代码,这样不便于质量检查。

八、以技术员自律而不是工人

提高技术修养的20条建议:

  1. 熟悉工具:工欲善其事,必先利其器。
  2. 使用IDE:能够提高编码效率。
  3. 坚持编码:只要是技术圈,不论什么岗位,都应该坚持。
  4. 编码前思考:即先设计后开发。
  5. 坚持重构:没有最好只有更好。
  6. 多写文档:写文档也是一个很好的整理思路的过程。
  7. 保持程序版本的简单性:多版本时注意合并。
  8. 做好备份:以防万一。
  9. 做单元测试:单元测试非常特别很必要。
  10. 不要重复发明*:在项目中使用已经成熟的工具或者框架,这样能大大减轻项目风险及工作量。当然研究性质的情况除外。
  11. 不要拷贝:不做代码搬运工。
  12. 让代码充满灵性:注意命名规范、注释等等。
  13. 测试自动化:合理地“偷懒”。
  14. 做压力测试:测试代码的健壮性。
  15. “剽窃”不可耻:多向优秀的开源项目学习。
  16. 坚持向敏捷学习。
  17. 重里更重面:注重UI设计。
  18. 分享:分享出去收获得更多。
  19. 刨根问底:不仅要解决问题,还得知道前因后果。多问几个为什么,在答案后面加上“是因为....”。
  20. 横向扩展:要扩展知识面,JVM、操作系统、硬件、网络、存储、协议都要去学习。