学会使用CPD检查项目中的重复代码

随着项目逐渐成长,项目的重复代码也逐渐增多了,大多都是复制粘贴惹的祸,那么我们如何对现有项目中的重复代码进行排查呢?

排查方法:代码审查、使用CPD工具。

重复代码的坏处:

1、一处修改,处处修改,而且还容易漏改。

2、安装包变大。

3、维护很痛苦。

4、看着恶习。


PMD介绍

PMD是一个源代码分析器。它发现常见的编程缺陷,如未使用的变量、空的catch块、不必要的对象创建,等等。它支持Java, JavaScript, Salesforce.com Apex和Visualforce, PLSQL, Apache Velocity, XML, XSL。

此外,它还包括CPD,即复制粘贴检测器(Copy Paste Detector)。CPD发现重复代码在Java, C, c++, c#, Groovy, PHP, Ruby, Fortran, JavaScript, PLSQL, Apache Velocity, Scala, Objective C, Matlab, Python, Go, Swift和Salesforce.com Apex和Visualforce。

1、使用GUI界面排查重复代码

PMD网站:https://pmd.github.io

下载后解压,命令行进入pmd目录,并执行./run.sh cpdgui 

你将看下如下界面:

然后我们选择代码路径,Go。

接下来就是关键时刻了,仔细检查重复代码,然后针对发现的重复代码进行修改吧。^_^


2、集成进Xcode,在编码阶段就发现重复代码。

通过homebrew安装pmd

brew install pmd

在Build Phase里新添加一个运行脚本(Run Script),并添加以下脚本:

# Running CPD 如果语言是swift 修改为–language swift

pmd cpd –files ${EXECUTABLE_NAME} –minimum-tokens 50 –language ObjectiveC –encoding UTF-8 –format net.sourceforge.pmd.cpd.XMLRenderer > cpd-output.xml –failOnViolation true

# Running script

php ./cpd_script.php -cpd-xml cpd-output.xml

然后在工程根目录新建文件cpd_script.php,内容如下:

<?php
foreach (simplexml_load_file('cpd-output.xml')->duplication as $duplication) {
    $files = $duplication->xpath('file');
    foreach ($files as $file) {
        echo $file['path'].':'.$file['line'].':1: warning: '.$duplication['lines'].' copy-pasted lines from: '
            .implode(', ', array_map(function ($otherFile) { return $otherFile['path'].':'.$otherFile['line']; },
            array_filter($files, function ($f) use (&amp;$file) { return $f != $file; }))).PHP_EOL;
    }
}
?>

配置完毕后,重新编译项目,如果有重复代码,则以警告方式提醒,警告的含义是:从17行往下的35行代码和另一个文件的存在重复,需要认真检查。如果pmd命令不生效,则重启Xcode。


大家都要养成良好的编程习惯,复制粘贴要不得,如果想便捷输入,那么请使用Code Snippet。

参考网站:

http://hongchaozhang.github.io/blog/2018/08/02/integrate-copy-and-paste-detector-into-xcode/

祝大家新年快乐,牛气冲天!


尊重原创内容,转载请注明出处
本文链接地址: https://www.awnlab.com/archives/672

为您推荐

发表评论

邮箱地址不会被公开。 必填项已用*标注