重复代码检测
2020-06-17 本文已影响0人
怜悯是我的座右铭
---Mac 平台, Java代码检测示例
背景
开发中,如果有相同逻辑,应当根据实际情况抽取公共方法或者公共类,这是程序员的一个基本素养。 但在历史有一定久远的工程中, 代码重复的现象可能就会比较多。代码重复率可以做为评判项目中代码质量的一个指标,那么就需要一个工具来检测工程中哪些地方存在重复代码
simian工具下载
Simian是一个可跨平台使用的重复代码检测工具,下载地址:http://www.harukizaemon.com/simian/get_it_now.html 点击底部的链接下载工具包, 如图所示
下载后拿出里面的jar包,simian-2.5.10.jar,这个就是我们接下来会用到的东西。
simian工具使用
例如 : 从工程src目录下找到重复10行以上的代码,并将找到的结果放入桌面result.txt中, 运行如下命令
java -jar ./simian-2.5.10.jar -threshold=10 "/Users/xxname/workspace/idea/xxproject/src/**/*.java" > /Users/xxname/Desktop/result.txt
结束后打开result.txt可以看到类似如下结果:
Similarity Analyser 2.5.10 - http://www.harukizaemon.com/simian
Copyright (c) 2003-2018 Simon Harris. All rights reserved.
Simian is not free unless used solely for non-commercial or evaluation purposes.
{failOnDuplication=true, ignoreCharacterCase=true, ignoreCurlyBraces=true, ignoreIdentifierCase=true, ignoreModifiers=true, ignoreStringCase=true, threshold=10}
Found 10 duplicate lines with fingerprint 1806290bacb9214406c69813cbb2b487 in the following files:
Between lines 937 and 949 in /Users/xxname/Documents/workspace/xxproject/app/src/com/xx/xx/FooClass.java
Between lines 851 and 863 in /Users/xxname/Documents/workspace/xxproject/app/src/com/xx/xx/BarClass.java
Found 10 duplicate lines with fingerprint 1806290bacb9214406c69813cbb2b487 in the following files:
Between lines 937 and 949 in /Users/xxname/Documents/workspace/xxproject/app/src/com/xx/xx/XxClass.java
Between lines 851 and 863 in /Users/xxname/Documents/workspace/xxproject/app/src/com/xx/xx/XxClass.java
... ...
Found 7505 duplicate lines in 371 blocks in 98 files
Processed a total of 63312 significant (118918 raw) lines in 581 files
Processing time: 2.984sec
从以上结果中, 可以看到一份代码或几份不同代码中,哪些行代码是重复的,但是这个txt文件看起来不够简洁,尤其是冗长的文件目录, 笔者做了另一个jar, 来格式化输出的结果,使之更清晰明了。
格式化输出
下载jar包 simianFormat.jar
执行命令
java -jar ./simianFormat.jar result.txt formatResult.txt
第一个参数 result.txt为上一步得到的原始结果文件, 第二个参数formatResult.txt为格式化输出的文件
执行后可以看到类似如下结果
FooClass 937 ~ 949
FooClass 851 ~ 863
FooClass 2729 ~ 2741
BarClass 962 ~ 975
这样是不是就清晰明了多了? -v-
集合命令
将以上两个步骤聚合在一个shell脚本中, 方便使用, 创建simian.sh如下
#!/usr/bin/env bash
codeFile=/Users/xxname/Documents/workspace/xxproject/src/**/*.java
threshold=$1
echo threshold=$threshold
echo "计算中(1/2)..."
java -jar ./simian-2.5.10.jar -threshold=$threshold "$codeFile" > ./result.txt
echo "格式化中(2/2)..."
java -jar ./simianFormat.jar result.txt formatResult.txt
echo "结束"
修改codeFile中的路径和通配符为你的路径和通配符,保存。
执行chomd +x ./simian.sh
为simian.sh添加执行权限,以后只需要执行
./simian.sh 10
就可以执行整个流程了