代码质量的评估维度很多,我自己的理解有这几个层次:能用——>能读——>能改——>能适应业务的变更。高质量的代码不是一蹰而就的的,是从特别小的细节例如变量命名规则到高大上的架构设计,一点点积累而成的。关于架构设计的部分,正在阅读《重构》和《Head First 设计模式》,在这里我总结下最近看到的一些改进代码质量的方法和工具,包括:代码规范、CodeReview、重构、单元测试以及代码覆盖率、findbugs工具
1. Java代码规范学习
基本以Google的Java代码规范为准,虽然现在的IDE已经能帮助我们写出统一风格的代码,但是仍然建议浏览一次。我学习到的几点整理如下:
- import语句中不要用通配符
- 1行代码不要超过80字符,通过IDE的设置进行自动换行
- 对于变量的使用,需要时再定义,并及时初始化
- @Override能用则用
- 捕获的异常一定要做处理
- 极少会去重载Object.finalize,因为你无法确保它一定执行。
2. CodeReview
what?
CodeReview是在开发阶段发现代码缺陷的一种方式,可以有效提高代码质量,降低维护成本;是团队成员互相学习、分享编程经验的提高过程。
when?
代码刚刚写完的时候最好,这个时候也是代码重构和调整的最佳时机。
how?
代码在review之前应该已经build过、正确执行功能、开发人员对代码做了单元测试(特别建议单元测试要跟着开发一起写,并且避免过长的函数和过于复杂的逻辑,否则单元测试都没法写)
事前准备
- CodeReview的对象(代码)
- CodeReview的内容(审查重点,有审查清单)
- 评审规范和标准(团队统一标准)
- 选择CodeReview的参与者
- 选择CodeReview的实施方式
实施阶段
- 准确记录(App推荐:30 second habit,这个app有利于提高会议效率,让你不再开毫无意义的会)
- 讲解与提问
- 逐项审查
- 注意气氛(不要搞成批斗会)
- 事后跟踪
- 确认发现的问题
- 修正问题(问题责任者负责)
- 确认结果(PM)
who?
- 写代码的人
- 师兄
- 团队成员
3. 重构
what?
重构是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。本质上说,重构是在代码写好之后改进它的设计。
why?
- 重构可以用来改进软件设计
- 重构使得软件更容易理解
- 重构帮助找到bug
- 重构可以提高编程速度
when?
重构应该随时随地进行,不应该为了重构而重构,是因为你想做什么事情,而重构可以帮你把那些事情做好。一般来说有以下三种场景,可以重构:
1. 添加功能时重构
2. 修补错误时重构
3. 复审代码时重构
4. 代码覆盖率:cobertura(maven插件)
代码覆盖率,即代码覆盖的程度。
开始工作的时候,第一份任务是提升某个项目的覆盖率到85%。我最开始挺疑惑的:84.1%和85%有什么区别,只是数字的不一样,对整个软件项目的影响有那么大么?其实,代码覆盖率并不是目标,它只是一种手段,帮助我们寻找项目中存在复杂业务逻辑的地方,而这里,就是可以改进的地方。但是,另一方面,代码覆盖率也有缺点,列举如下:
覆盖率数据只能代表你测试过哪些代码,不能代表你是否测试好这些代码。(比如上面第一个除零Bug)
不要过于相信覆盖率数据。
我使用cobetura插件在本地生成代码覆盖率报告。
5. 工具查bug:findbugs(idea插件)
代码能用和优秀的代码还有一定距离,findbugs帮助我们提升代码质量,会发现一些具备不良用法的代码、暗藏性能问题的代码等等。
参考资料
在文章的最后为公众账号打个广告:dqVoice,我尽量写一点有质量的文章跟大家分享,欢迎大家关注。