随着项目逐渐成长,项目的重复代码也逐渐增多了,大多都是复制粘贴惹的祸,那么我们如何对现有项目中的重复代码进行排查呢?
排查方法:代码审查、使用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 (&$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/
祝大家新年快乐,牛气冲天!