好的代码必定是整洁的,而且可以帮助阅读的人快速理解和定位。好的代码能够加快应用的开发迭代速度,没必要花过多的时间来修复 bug 和完善代码。好的代码不但可以使得新的项目成员更容易加入项目,同时方便项目组成员快速作好 Back up。好的代码便于促进团队间交流合做提高开发效率。java
代码质量评价标准python
有编码经验的人对代码都有必定的“鉴赏力”,可以凭感受给出代码好坏的主观评价。可是这种凭感受的方式太过个性随意,所谓仁者见仁智者见智,很难达成共识,那有没有一种公认的标准来鉴定代码质量呢?c++
答案是有的。这里简单分享当下较经常使用的评价标准,其中包括:编码规范、可读性、可维护性、重复度及可测试性。git
编码规范github
主要包含是否遵照了最佳实践和团队编码规范,是否包含可能出问题的代码,以及可能存在安全的漏洞。编码规范有助于提升团队内协助的效率以及代码的可维护性。shell
可读性npm
Code Review 是一个很好的测验代码可读性的手段。若是你的同事能够轻松地读懂你写的代码,那说明你的代码可读性很好;反之则说明你的代码可读性有待提升了。遵照编码规范也能让咱们写出可读性更好的代码。编程
可维护性安全
代码的可维护性是由不少因素协同做用的结果。代码的可读性好、简洁、可扩展性好,就会使得代码易维护;更细化地讲,若是代码分层清晰、模块化好、高内聚低耦合、听从基于接口而非实现编程的设计原则等等,那就可能意味着代码易维护。除此以外,代码的易维护性还跟项目代码量的多少、业务的复杂程度、利用到的技术的复杂程度、文档是否全面等诸多因素有关。微信
重复度
遵照 Don’t Repeat Yourself 原则,尽可能减小重复代码的编写,复用已有的代码。对项目按期进行代码重复度检测是一个颇有意义的事,能够帮助开发人员发现冗余代码,进行代码抽象和重构。重复的代码一旦出错,意味着加倍的工做量和持续的不可控。若是代码中有大量的重复代码,就要考虑将重复的代码提取出来,封装成公共的方法或者组件。
可测试性
代码可测试性的好坏,一样能够反应代码质量的好坏。代码的可测试性差,比较难写单元测试,那基本上就能说明代码设计得有问题。
除此以外还有不少代码质量评价标准。咱们须要一些取舍,选取部分你们有共识的规则定义团队好的代码标准。
代码质量维度
当前版本经过 @iceworks/doctor 从 5 个维度对代码进行评分:
最佳实践:经过 @iceworks/eslint-plugin-best-practices 分析项目,提出符合当前工程特征(对 ice 和 Rax项目友好)的最佳实践及阻塞问题发布卡口,帮助开发者优化项目性能,避免潜在 bug 。
安全实践:经过 @iceworks/eslint-plugin-security-practices 扫码代码检测工程中可能存在的安全风险,包含 url 、敏感成词、明文帐密信息及 npm 包证书检测,下降项目安全风险,守卫项目安全。
阿里代码规范:这一维度主要反馈开发人员对于 eslint-config-ali 阿里开发规约的遵照程度。
可维护度:经过 typhonjs-escomplex 对文件进行扫码,得出每一个文件的可维护度,可读性及复杂度评分。针对得分较差的文件能够进行深度分析帮助开发者更好的重构复杂代码。
重复度:经过 jscpd 计算重复出现的代码区块占比,计算出 clone 分数。并逐一列举重复的代码,方便开发者快速定位重复代码,将其封装成公共的方法或者组件。
根据上述 5 个维度经过加权平均的方式计算项目质量分,并根据木桶效应,在计算得分的过程当中加大了最低分的权重,得出最终项目质量评分。
项目地址
github地址:https://github.com/ice-lab/iceworks/tree/master/
推荐几款代码质量检测工具:
而后说说工具的问题。我用过的开源、商业代码质量工具没少说也有个二三十种( V 站除了同行应该没人比我多了。。。吧)。这些工具若是按照规则类型划分,能够看作两类。一类安全,也就是检查安全问题,好比 NullPointer、SQL Injection、Data Race,他们会影响程序的安全运行;一类是规约,简单来讲就是 code style。不过考虑到不少规则其实二者兼具,我就简单的按语言划分好了。(都是开源的)
c/c++:
clang-tidy http://clang.llvm.org/extra/clang-tidy
CSA https://clang-analyzer.llvm.org
cppcheck https://github.com/danmar/cppcheck
cpplint https://github.com/google/styleguide
phasar https://github.com/secure-software-engineering/phasar
这里面比较推荐 clang-tidy,虽然规则很少,可是规则编写简单,只要你对 C++有足够了解,能够定制出十分丰富的内容
java:
google-java-format https://github.com/google/google-java-format
find-sec-bugs https://find-sec-bugs.github.io
spotbugs https://spotbugs.github.io
pmd https://github.com/pmd/pmd
p3c https://github.com/alibaba/p3c
soot https://sable.github.io/soot
spotbugs 和 pmd 都是比较优秀的工具,前者有 find-sec-bugs 这样的插件。然后者,ali 的 p3c 规则集就是基于 pmd 实现的。此外 pmd 是一个针对多种语言的框架,内容十分丰富。这二者国际化和文档都作的很是好。而 soot 本质上一个 jvm bytecode 的优化框架,但一样能够基于此作出各类工具,不过考虑到它复杂的内容,emmmm...
其余:
python https://github.com/PyCQA/pylint
kotlin https://github.com/arturbosch/detekt
JS/TS https://github.com/eslint/eslint
Rust https://github.com/rust-lang/rust-clippy
shell https://github.com/koalaman/shellcheck
Multiple languages https://github.com/facebook/infer
Multiple languages https://github.com/github/semantic
我列举的都是我以为有用的而且目前处于活跃状态的项目,你们无聊的话能够看看。还有一个专门介绍静态分析工具的仓库https://github.com/mre/awesome-static-analysis
再而后对于工具的使用。对于工具你们都知道,不用等于没用。因此通常的解决办法都是融入流程,最简单的像 Unittest 同样,编译完成后跑一遍。并入 CI 流程也是广泛作法,代码入库前扫描成功才容许合并,这样同时还能够保证 code format 的问题。除此以外,减小这类工具的 report 数量也是重点。过于繁多的报告(尤为是项目早期开发的时候)每每不利于发现真正有价值的问题,也不利于修复。因此熟悉工具的规则和配置,少报无关问题是工具使用的关键。
简单说就这么多,若是感兴趣我有空能够开个系列,专门介绍代码静态分析的技术、使用问题
号称中国最好的静态分析工具(未来就是世界最好)
https://www.sourcebrella.com/
对标国际厂商好比 Coverity、fortify、checkmax,咱们一点不虚,甚至在技术上还有优点( PLDI、ICSE 最近几年都有论文)
本文分享自微信公众号 - 肉眼品世界(find_world_fine)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。