• 如何保证代码质量


    代码质量的评估维度很多,我自己的理解有这几个层次:能用——>能读——>能改——>能适应业务的变更。高质量的代码不是一蹰而就的的,是从特别小的细节例如变量命名规则到高大上的架构设计,一点点积累而成的。关于架构设计的部分,正在阅读《重构》和《Head First 设计模式》,在这里我总结下最近看到的一些改进代码质量的方法和工具,包括:代码规范、CodeReview、重构、单元测试以及代码覆盖率、findbugs工具

    1. Java代码规范学习

    基本以Google的Java代码规范为准,虽然现在的IDE已经能帮助我们写出统一风格的代码,但是仍然建议浏览一次。我学习到的几点整理如下:

    • import语句中不要用通配符
    • 1行代码不要超过80字符,通过IDE的设置进行自动换行
    • 对于变量的使用,需要时再定义,并及时初始化
    • @Override能用则用
    • 捕获的异常一定要做处理
    • 极少会去重载Object.finalize,因为你无法确保它一定执行。

    2. CodeReview

    what?

    CodeReview是在开发阶段发现代码缺陷的一种方式,可以有效提高代码质量,降低维护成本;是团队成员互相学习、分享编程经验的提高过程。

    when?

    代码刚刚写完的时候最好,这个时候也是代码重构和调整的最佳时机。

    how?

    代码在review之前应该已经build过、正确执行功能、开发人员对代码做了单元测试(特别建议单元测试要跟着开发一起写,并且避免过长的函数和过于复杂的逻辑,否则单元测试都没法写)

    1. 事前准备

      • CodeReview的对象(代码)
      • CodeReview的内容(审查重点,有审查清单)
      • 评审规范和标准(团队统一标准)
      • 选择CodeReview的参与者
      • 选择CodeReview的实施方式
    2. 实施阶段

      • 准确记录(App推荐:30 second habit,这个app有利于提高会议效率,让你不再开毫无意义的会)
      • 讲解与提问
      • 逐项审查
      • 注意气氛(不要搞成批斗会)
    3. 事后跟踪
      • 确认发现的问题
      • 修正问题(问题责任者负责)
      • 确认结果(PM)

    who?

    1. 写代码的人
    2. 师兄
    3. 团队成员

    3. 重构

    what?

    重构是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。本质上说,重构是在代码写好之后改进它的设计。

    why?

    1. 重构可以用来改进软件设计
    2. 重构使得软件更容易理解
    3. 重构帮助找到bug
    4. 重构可以提高编程速度

    when?

    重构应该随时随地进行,不应该为了重构而重构,是因为你想做什么事情,而重构可以帮你把那些事情做好。一般来说有以下三种场景,可以重构:
    1. 添加功能时重构
    2. 修补错误时重构
    3. 复审代码时重构

    4. 代码覆盖率:cobertura(maven插件)

    代码覆盖率,即代码覆盖的程度。

    开始工作的时候,第一份任务是提升某个项目的覆盖率到85%。我最开始挺疑惑的:84.1%和85%有什么区别,只是数字的不一样,对整个软件项目的影响有那么大么?其实,代码覆盖率并不是目标,它只是一种手段,帮助我们寻找项目中存在复杂业务逻辑的地方,而这里,就是可以改进的地方。但是,另一方面,代码覆盖率也有缺点,列举如下:

    • 覆盖率数据只能代表你测试过哪些代码,不能代表你是否测试好这些代码。(比如上面第一个除零Bug)

    • 不要过于相信覆盖率数据。

    我使用cobetura插件在本地生成代码覆盖率报告。

    5. 工具查bug:findbugs(idea插件)

    代码能用和优秀的代码还有一定距离,findbugs帮助我们提升代码质量,会发现一些具备不良用法的代码、暗藏性能问题的代码等等。

    参考资料

    1. Git的使用规范流程
    2. Google Java编程风格指南中文版
    3. 《重构:改善既有代码的设计》
    4. Java Mockito入门
    5. 代码大全

    在文章的最后为公众账号打个广告:dqVoice,我尽量写一点有质量的文章跟大家分享,欢迎大家关注。

    这里写图片描述

  • 相关阅读:
    判断字符中是否包含汉字
    since I lived here; since I have lived here. 的区别? 从语法上看, 为啥会有这样的区别?
    have married; have been married; 到底是结婚了没?还是已经离婚了?
    C#项目依据 x86 x64 配置不同的引用
    现在完成时可以表示过去事件对现在的影响/效果. 过去完成时也可以起相同的作用!!!!
    使用现在完成时的常见错误(转发)
    去除win10下的缺省ctrl加空格功能
    appear + 表语 与 appear to be + "表语" 的区别; get hurt与 get to be hurt的区别
    ssm搭建的一个web应用的工作流程
    return和finally究竟谁先执行,还有return是怎么返回数据的
  • 原文地址:https://www.cnblogs.com/javaadu/p/11742614.html
Copyright © 2020-2023  润新知