十二、编写高质量的代码——思想为源(笔记)
程序员文章站
2022-06-16 16:30:42
...
本博文为《编写高质量代码—改善Java程序的151个建议》一书的阅读笔记。该书从很多方面给予了编写高质量代码的宝贵经验。而且该书应该是那种开发经验越丰富,体会越深的书籍。在阅读过程中,从该书中收获良多,这里主要作下书籍笔记,有体会的地方加点自己的想法。受限于知识水平,部分内容还没能深刻体会,所以更多更好的内容和具体实例还需要从书中去找寻。
编码不仅仅是把代码写出来,还要求清晰地表达出编码者头脑中的逻辑,准确地传递到计算机中执行,同时也能被其它编码者轻松阅读,而要实现这些目标,则要求代码有清晰、正确的思想,即编程思想。——秦小波(书籍作者)
一、提倡良好的代码风格
优秀团队的编码风格应该具有如下几个特征:
- 整洁:这样可读性好;
- 统一:这样减少代码的差异性,更易于理解;
- 流行:流行必有基因,风格值得参考;
- 便捷:有通用工具支持,这样降低统一风格的成本。
这部分内容我写过一篇博文《Java编码规范—"约定"也要"配置"》,算是一个具体的实现思路。
二、不要完全依靠单元测试来发现问题
主要有四个原因:
- 单元测试不可能测试所有的场景(路径):单元测试必须测试的三种数据场景是:正常场景、边界场景、异常场景。但是单元测试的代码覆盖率达到60%都很困难。覆盖不全则难免会有缺陷。
- 代码整合错误是不可避免的:单元测试往往测试的是一个独立单元,这样在不同单元间整合测试时难免出现错误。
- 部分代码无法(或很难)测试
- 单元测试验证的是编码人员的假设:有点自已验证自己的意思,难免因为思维局限或者理解偏差等原因验证不正确。
所以不能完全靠单元测试来发现问题,但单元测试是很重要的一环。以个从的经验而言:大的项目一般测试可能从需求阶段就开始介入,对于开发而言可能有单元测试,冒烟测试,集成测试,系统间联调测试,性能测试等等,而且很多测试工作是配合专门的测试团队完成。
三、让注释正确、清晰、简洁
注释是为了帮助代码阅读者更好地理解代码的,良好的注释习惯包括:
- 不要废话:只写与代码相关的注释,不要抒情。
- 不要用注释写故事:例如书中的汉诺塔算法注释把算法的故事分析应用比较都写上去了,没有必要。应该准确简单地表达。
- 不要添加不必要的注释:过于简单的注释,地球人都知道的就不要添加注释了。
- 注释及时更新:代码有变化时注意注释的更新。
- 注释不要写太多:注释写太多往往就喧宾夺主了,影响了代码的可读性。
- 不要用注释记流水帐:例如不要用注释记录代码版本的变迁,这应该交给版本管理工具。
- 为JavaDoc编写的注释也要考虑可读性:写注释也是为了人看的,标签写太多同样影响可读性。
四、让接口的职责保持单一
单一职责原则要示接口定义的时候尽可能保持单一,这样能最大程度地保证接口的稳定性,降低类的复杂度,同时也能增加可读性和可维护性。
五、增加类的可替换性
为了增加类的可替换性,在设计时需要考虑以下三点:
- 子类型必须完全实现父类型的方法:即子类型应该更多地是增强父类 的功能。
- 前置条件可以放大:即子类的方法参数可以比父类的范围大。
- 后置条件可以放小:即子类的返回值可以比父类的范围小。
六、依赖抽象而不是实现
- 尽量抽象:每个类都尽量有接口或抽象类,或两者都有。
- 表明类型必须是抽象的:比如对象申明时最好用接口声明。
- 尽量不要覆写父类的方法。
- 抽象不关注细节:抽象负责定义关系与公共部分的实现,具体业务逻辑应该由具体的实现类去实现。
七、抛弃7条不良的编码习惯
- 不良一:*格式的代码
- 不良二:不使用抽象的代码
- 不良三:彰显个性的代码
- 不良四:死代码,即不可能被执行到的代码。
- 不良五:冗余代码,没有用的代码要及时删除。
- 不良六:拒绝变化的代码,旧的代码要注意重构更新。
- 不良七:自以为是的代码,即不写测试代码的代码,这样不便于质量检查。
八、以技术员自律而不是工人
提高技术修养的20条建议:
- 熟悉工具:工欲善其事,必先利其器。
- 使用IDE:能够提高编码效率。
- 坚持编码:只要是技术圈,不论什么岗位,都应该坚持。
- 编码前思考:即先设计后开发。
- 坚持重构:没有最好只有更好。
- 多写文档:写文档也是一个很好的整理思路的过程。
- 保持程序版本的简单性:多版本时注意合并。
- 做好备份:以防万一。
- 做单元测试:单元测试非常特别很必要。
- 不要重复发明*:在项目中使用已经成熟的工具或者框架,这样能大大减轻项目风险及工作量。当然研究性质的情况除外。
- 不要拷贝:不做代码搬运工。
- 让代码充满灵性:注意命名规范、注释等等。
- 测试自动化:合理地“偷懒”。
- 做压力测试:测试代码的健壮性。
- “剽窃”不可耻:多向优秀的开源项目学习。
- 坚持向敏捷学习。
- 重里更重面:注重UI设计。
- 分享:分享出去收获得更多。
- 刨根问底:不仅要解决问题,还得知道前因后果。多问几个为什么,在答案后面加上“是因为....”。
- 横向扩展:要扩展知识面,JVM、操作系统、硬件、网络、存储、协议都要去学习。