美文网首页
重复代码检测

重复代码检测

作者: 怜悯是我的座右铭 | 来源:发表于2020-06-17 21:31 被阅读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
    

    就可以执行整个流程了

    相关文章

      网友评论

          本文标题:重复代码检测

          本文链接:https://www.haomeiwen.com/subject/grcexktx.html