利用PHPMD讓你的php代碼更干凈更易維護(hù)

PHPMD - PHP Mess Detector

等價(jià)于java工具PMD闰渔,能夠?qū)hp 源代碼進(jìn)行如下問題檢測(cè):

  • 可能的bug
  • 欠佳的代碼
  • 過于復(fù)雜的表達(dá)式
  • 未使用的方法罩抗、變量窍荧、參數(shù)、屬性

最新版本發(fā)布于 2021/05/11

https://phpmd.org/about.html

基本使用

phpmd /path/to/source text codesize
  • 第一個(gè)參數(shù) 要檢測(cè)的代碼地址
  • 第二個(gè)參數(shù)指定輸出檢測(cè)結(jié)果的格式
  • 第三個(gè)參數(shù)是指定的規(guī)則集

規(guī)則集合

  • Clean Code: 一些包含clean code的規(guī)則集合殊者,包括面向?qū)ο笤O(shè)計(jì)的 SOLID(單一功能与境、開閉原則、里氏替換猖吴、接口隔離以及依賴反轉(zhuǎn))原則摔刁。
  • Code Size : 有關(guān)代碼大小的相關(guān)問題,例如行數(shù)等
  • Controversial : 具有爭議的規(guī)則海蔽,可以不參考此規(guī)則
  • Design : 設(shè)計(jì)規(guī)則共屈,包含類依賴數(shù)量等等
  • Naming: 命名規(guī)則
  • Unused Code: 未使用代碼規(guī)則

關(guān)于clean code 有一本書名就叫 << Clean Code >>,個(gè)人讀下來感受頗深绑谣。

這里主要介紹一些我認(rèn)為非常有必要注意的規(guī)則

Clean Code

BooleanArgumentFlag

布爾標(biāo)志參數(shù)違反單一責(zé)任原則(SRP),可以將此類方法一拆為二。

class Foo {
    public function drink($thirsty = true) {
        if($thirsty){
            // 喝2杯
        }else{
            // 喝一杯
        }
    }
}
class Foo {
    public function drinkThirsty() {
        
            // 喝2杯
        
    }
    
      public function drinkUnThirsty() {
       
            // 喝2杯
        
    }
}

ElseExpression

class Foo
{
    public function bar($flag)
    {
        if ($flag) {
            // one branch
        } else {
            // another branch
        }
    }
}

像這樣的if else的表達(dá)式其實(shí)是沒必要的拗引,可通過三元表達(dá)式借宵、拆分方法或者可能的情況下先return來規(guī)避這類問題,以將代碼簡單或增加可讀性矾削。

class Foo
{
    public function bar($flag)
    {
        if ($flag) {
            // one branch
            return
        } 
        // another branch
        
    }
}

Code Size

CyclomaticComplexity

圈復(fù)雜度壤玫,用來衡量代碼復(fù)雜度的一個(gè)計(jì)算規(guī)則。復(fù)雜度越高代表代碼可讀性哼凯、可維護(hù)性越差垦细,易錯(cuò)性更高、集成測(cè)試更難挡逼。

image

點(diǎn)邊計(jì)算法

image

上述表達(dá)式的圈復(fù)雜度為 e = 10 n = 8 Cyclomatic Complexity = 10 - 8 + 2 = 4

image

計(jì)算公式為:

V(G) = E - N + 2

其中,e表示控制流圖中邊的數(shù)量腻豌,n表示控制流圖中節(jié)點(diǎn)的數(shù)量家坎。

更多可參考 http://kaelzhang81.github.io/2017/06/18/詳解圈復(fù)雜度/

ExcessiveMethodLength

方法長度,該規(guī)則有2個(gè)屬性

minimum 最小限定值 默認(rèn) 100

ignore-whitespace 是否忽略空白行 默認(rèn) false

ExcessiveClassLength

類長度

minimum 最小限定值 默認(rèn) 1000

ignore-whitespace 是否忽略空白行 默認(rèn) false

ExcessiveParameterList

參數(shù)個(gè)數(shù)限定

minimum 10吝梅,根據(jù)《clean code》一書的說法虱疏,這個(gè)值應(yīng)該限定為3

ExcessivePublicCount

公共方法、公共屬性

minimum 45

TooManyFields

maxfields 15

TooManyMethods

maxmethods 25
ignorepattern (^(set|get))i

TooManyPublicMethods

maxmethods 10 The method count reporting threshold
ignorepattern (^(set|get))i

自定義規(guī)則

有的默認(rèn)規(guī)則也許并不能滿足自身需求需做舍棄或修改苏携。例如函數(shù)參數(shù)數(shù)做瞪,在《clean code》一書中定義的是最多為3,而phpmd默認(rèn)指定的是10. 10個(gè)確實(shí)已經(jīng)非常難看了右冻,想象你去調(diào)用一個(gè)有10個(gè)參數(shù)的函數(shù)装蓬,你一定會(huì)吐槽懵逼的。

好在phpmd這些都可以修改纱扭,如下:

  • 引入unusedcode規(guī)則集
  • 引入codesize,并暫時(shí)排除NPathComplexityCyclomaticComplexity這兩個(gè)理解起來有一定困難的規(guī)則牍帚。誠然CyclomaticComplexity在度量復(fù)雜度十分有效,但若你的所有函數(shù)已經(jīng)滿足ExcessiveMethodLength已經(jīng)進(jìn)步很大了乳蛾,所以一步步來暗赶。
  • 修改ExcessiveParameterList,讓限定值為3.
  • 修改ExcessiveMethodLength和ExcessiveClassLength,忽略空白行
  • 排除StaticAccess規(guī)則
<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set"
         xmlns="http://pmd.sf.net/ruleset/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
                     http://pmd.sf.net/ruleset_xml_schema.xsd"
         xsi:noNamespaceSchemaLocation="
                     http://pmd.sf.net/ruleset_xml_schema.xsd">
    <description>
        My custom rule set that checks my code...
    </description>

    <rule ref="rulesets/unusedcode.xml" />
    <rule ref="rulesets/codesize.xml">
        <exclude name="ExcessiveParameterList" />
        <exclude name="NPathComplexity"/>
        <exclude name="CyclomaticComplexity"/>
    </rule>
    <rule ref="rulesets/codesize.xml/ExcessiveParameterList">
        <properties>
            <property name="minimum">
                <value>
                    3
                </value>
            </property>
        </properties>
    </rule>
    <rule ref="rulesets/codesize.xml/ExcessiveClassLength">
        <properties>
            <property name="ignore-whitespace">
                <value>
                    true
                </value>
            </property>
        </properties>
    </rule>
    <rule ref="rulesets/codesize.xml/ExcessiveMethodLength">
        <properties>
            <property name="ignore-whitespace">
                <value>
                    true
                </value>
            </property>
        </properties>
    </rule>
    <rule ref="rulesets/cleancode.xml">
        <exclude name="StaticAccess" />
    </rule>
</ruleset>

博客內(nèi)容遵循 署名-非商業(yè)性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0) 協(xié)議

本文永久鏈接是:http://blog.visonforcoding.xyz/2021/07/27/%E5%88%A9%E7%94%A8PHPMD%E8%AE%A9%E4%BD%A0%E7%9A%84php%E4%BB%A3%E7%A0%81%E6%9B%B4%E5%B9%B2%E5%87%80%E6%9B%B4%E6%98%93%E7%BB%B4%E6%8A%A4/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肃叶,隨后出現(xiàn)的幾起案子蹂随,更是在濱河造成了極大的恐慌,老刑警劉巖因惭,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岳锁,死亡現(xiàn)場離奇詭異,居然都是意外死亡筛欢,警方通過查閱死者的電腦和手機(jī)浸锨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門唇聘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柱搜,你說我怎么就攤上這事迟郎。” “怎么了聪蘸?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵宪肖,是天一觀的道長。 經(jīng)常有香客問我健爬,道長控乾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任娜遵,我火速辦了婚禮蜕衡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘设拟。我一直安慰自己慨仿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布纳胧。 她就那樣靜靜地躺著镰吆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跑慕。 梳的紋絲不亂的頭發(fā)上万皿,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音核行,去河邊找鬼牢硅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芝雪,可吹牛的內(nèi)容都是我干的唤衫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绵脯,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼佳励!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛆挫,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赃承,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后悴侵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞧剖,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抓于。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片做粤。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捉撮,靈堂內(nèi)的尸體忽然破棺而出怕品,到底是詐尸還是另有隱情,我是刑警寧澤巾遭,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布肉康,位于F島的核電站,受9級(jí)特大地震影響灼舍,放射性物質(zhì)發(fā)生泄漏吼和。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一骑素、第九天 我趴在偏房一處隱蔽的房頂上張望炫乓。 院中可真熱鬧,春花似錦献丑、人聲如沸厢岂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至结借,卻和暖如春筐摘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背船老。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工咖熟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柳畔。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓馍管,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薪韩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子确沸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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