随着各个项目的迭代更新,项目中不可避免的会出现一些重复的代码,这可能是CTRL C + CTRL V造成的,也有可能是因为不同的项目成员重复造轮子造成的。在《Software Clone Detection and Refactoring》一文中,对重复代码的类型进行了定义:
- 完全一致的代码或者只修改了空格和评论
- 结构上和句法上一致的代码,例如只是修改了变量名
- 插入和删除了部分代码
- 功能和逻辑上一致的代码,语义上的拷贝
不难看出,越是往后重复的代码就越难被检测出来,所以我们应该尽早对项目进行代码重复率的管控。
检测工具介绍
jsinspect
https://github.com/danielstjules/jsinspect
jsinspect 利用 babylon 对于 JavaScript 或者 JSX 代码构建 AST 语法树,根据不同的 AST 节点类型,譬如 BlockStatement、VariableDeclaration、ObjectExpression 等标记相似结构的代码块。同时还可以自由指定一个阈值,以确定要分析的最小节点子集。
抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如说,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。抽象语法树并不依赖于源语言的语法,