<iOS 實踐經(jīng)驗>利用PMD工具檢測代碼中的復(fù)制粘貼

參考文章鏈接.
在一個工程中, 復(fù)制粘貼一段代碼永遠(yuǎn)是百害而無一益的, 復(fù)制粘貼的代碼導(dǎo)致的是 bug 的復(fù)制, 難于維護(hù), 代碼體積變大等各種問題.

所以在日常工作中, 應(yīng)該引入工具對代碼進(jìn)行檢查, 常用的工具是 PMD. 它配合Swiftlint, 可以做到代碼的靜態(tài)檢查和復(fù)制粘貼代碼檢查.

下面主要來介紹 PMD 工具的使用.

在 Xcode build 時運(yùn)行復(fù)制粘貼檢查

首先利用 HomeBrew 安裝 PMD:

brew install pmd

安裝好 PMD 后, 就可以在 Xcode 中添加 Run Script 腳本了:

# Running CPD
pmd cpd --files ${EXECUTABLE_NAME} --minimum-tokens 50 --language swift --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

首先需要將其中的 ${EXECUTABLE_NAME} 替換為工程名稱, 比如 MyApp 等.

上面的腳本中使用 pmd 進(jìn)行復(fù)制粘貼檢查, 檢查結(jié)果會存放在 cpd-output.xml 文件中. --minimum-tokens 的值是一個經(jīng)驗值, 這里的 50 適合 swift.(參考文章內(nèi)作者給的經(jīng)驗值, 這個需要根據(jù)具體情況確定.)

另外腳本中需要 php 對輸出腳本進(jìn)行分析并顯示到 Xcode 中, 如果沒有安裝 php, 則需要安裝.

還有需要的 cpd_script.php 文件, 需要放到工程根目錄, 它的作用是利用之前生成的檢查結(jié)果文件, 將檢查的結(jié)果顯示到 Xcode 中:

<?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;
    }
}
?>

關(guān)于這個 php 腳本為什么要這么寫, 可以參考這篇文章.

安裝--->設(shè)置 run script 腳本----> 放入輔助 php 腳本. 簡單三步, 檢查代碼中的復(fù)制粘貼就是分分鐘的事情.

注意事項

發(fā)現(xiàn)一個不能提示復(fù)制粘貼代碼的問題, 如果實際使用的時候沒有正常檢測到復(fù)制粘貼的代碼, 可以嘗試 clean 一次后再進(jìn)行檢測.

附錄 token 限制值的確定

在一個文件中引入如下測試代碼:

    public func add() {
        let a = 3
        let b = 4
        let c = 5
        let result = a + b + c
        print(result)
    }

    public func somethingPrint() {
        let a = 3
        let b = 4
        let c = 5
        let result = a + b + c
        print(result)
    }

一看就知道兩個方法體中的代碼是復(fù)制的, 此時 --minimum-tokens 設(shè)置為 50 的時候檢測不到, 若降低到 40, 仍然檢測不到, 降低到 30, 可以檢測到了. 通過這個方式可以確定自己需要的 token 值設(shè)置.
一定注意 --minimum-tokens 不能太高也不能太低, 太低的話檢測到一個詞都是復(fù)制的, 太高的話又會什么都檢測不到.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葬馋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子任柜,更是在濱河造成了極大的恐慌稠项,老刑警劉巖召锈,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渐扮,死亡現(xiàn)場離奇詭異柑贞,居然都是意外死亡嫂伞,警方通過查閱死者的電腦和手機(jī)孔厉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帖努,“玉大人撰豺,你說我怎么就攤上這事∑从啵” “怎么了污桦?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匙监。 經(jīng)常有香客問我凡橱,道長,這世上最難降的妖魔是什么亭姥? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任稼钩,我火速辦了婚禮,結(jié)果婚禮上致份,老公的妹妹穿的比我還像新娘变抽。我一直安慰自己,他們只是感情好氮块,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布绍载。 她就那樣靜靜地躺著,像睡著了一般滔蝉。 火紅的嫁衣襯著肌膚如雪击儡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天蝠引,我揣著相機(jī)與錄音阳谍,去河邊找鬼蛀柴。 笑死,一個胖子當(dāng)著我的面吹牛矫夯,可吹牛的內(nèi)容都是我干的鸽疾。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼训貌,長吁一口氣:“原來是場噩夢啊……” “哼制肮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起递沪,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤豺鼻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后款慨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儒飒,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年檩奠,在試婚紗的時候發(fā)現(xiàn)自己被綠了桩了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡埠戳,死狀恐怖圣猎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乞而,我是刑警寧澤送悔,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站爪模,受9級特大地震影響欠啤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屋灌,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一洁段、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧共郭,春花似錦祠丝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尉咕,卻和暖如春叠蝇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背年缎。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工悔捶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留铃慷,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓蜕该,卻偏偏與公主長得像犁柜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堂淡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容