PHPMD – The mess detector

PHPMD

http://phpmd.org/

This is the project site of PHPMD. It is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD. PHPMD can be seen as an user friendly and easy to configure frontend for the raw metrics measured by PHP Depend.

What PHPMD does is: It takes a given PHP source code base and look for several potential problems within that source. These problems can be things like:

  • Possible bugs
  • Suboptimal code
  • Overcomplicated expressions
  • Unused parameters, methods, properties

Installation

Direkomendasikan install melalui composer karena sangat mudah, dan mudah untuk updatenya.
Add Requirement phpmd/phpmd:”@stable” to your composer project (or global whichever is appropiate).

composer require phpmd/phpmd:"@stable"

Usage

php vendor/bin/phpmd [php files] [report type] [rules]

PHP files file yang ingin dicek atau folder
Report type bisa menggunakan text atau xml
Rule cek bagian rule untuk lebih detail
Contohnya
php vendor/bin/phpmd test.php text cleancode,unusedcode,naming,design

Rules

cleancode

  • Tidak boleh ada boolean flag sebagai argument – karena melanggar prinsip SOLID
  • Else expression, else expression hampir selalu dihilangkan dengan melakukan refactor code.
  • Static access
  • Personally saya merasa rules ini sangat strict dan sedikit menyebalkan karena terlalu mengikat, terserah pembaca jika ingin phpmd mengecek rule ini, tambahkan cleancode ke list rules.

codesize

  • cyclomatic complexity harus rendah, cyclomatic complexity disebabkan oleh terlalu banyak control statement di dalam sebuah function, if else, while, foreach, do while. Pisahkan kode menjadi method terpisah apabila complexity mencapai lebih dari 10.
  • NPath complexity harus rendah, npath adalah jumlah kemungkinan path di dalam sebuah function. Pisahkan kode menjadi method / class terpisah jika NPath complexity mencapat lebih dari 200.
  • ExcessiveMethodLength, jangan gunakan nama method yang terlalu panjang (mengindikasikan terlalu banyak tanggung jawab).
  • ExcessiveClassLength, jangan gunakan nama class yang terlalu panjang (mengindikasikan terlalu banyak tanggung jawab).
  • ExcessiveParameterList, jangan define suatu method dengan parameter list yang panjang, sederhanakan menjadi lebih compact.
  • ExcessivePublicCount, kurangi kompleksitas sebuah class dengan melakukan refactor pada public method, terlalu banyak public method mengindikasikan terlalu banyak tanggung jawab dan sulit untuk di test.
  • TooManyFields, properties di class bisa disederhakan menjadi lebih compact, misalnya memisahkan menjadi class terpisah, atau melakukan grouping untuk field field yg mirip.
  • TooManyMethods, class yang memiliki terlalu banyak adalah kandidat bagus untuk di refactor untuk tujuan mengurangi kompleksitas.
  • ExcessiveClassComplexity. WMC(Weighted Method Count) dari sebuah class adalah indikator bagus berapa banyak effort dan waktu yang digunakan untuk mengedit dan memaintain class tersebut. Hitungan WMC didefine sebagai jumlah kompleksitas dari semua method yang dideklarasikan di dalam sebuah class.

controversial

  • Superglobal, mengakses superglobal dianggap sebagai bad practice. Variabel ini harus di enkapsulasi di dalam objek yang diberikan oleh framework contohnya.
  • CamelCase untuk class, property, method, parameter dan variable name dianggap sebagai best practice.

design

  • ExitExpression, statement exit di dalam code tidak bisa ditest oleh sebab itu harus dihindari.
  • EvalExpression, statement eval tidak bisa ditest, security risk dan bad practice oleh sebab itu harus dihindari.
  • GotoStatement, statement goto membuat kode lebih sulit dibaca dan sulit dimengerti, oleh sebab itu harus dihindari.
  • NumberofChildren, class dengan jumlah children yang terlalu banyak adalah indikator ketidak seimbangan dalam hierarki class.
  • DepthOfInheritance, class yang memiliki banyak parent  adalah indikator ketidakseimbangan dalam hierarki class.
  • CouplingBetweenObjects. class yang memiliki dependency terlalu banyak memiliki impact buruk dalam beberapa aspek kualitas dari sebuah class.

naming

  • ShortVariable, hindari nama variabel yang terlalu pendek.
  • LongVariable, hindari nama variabel yang terlalu panjang.
  • ShortMethodName, hindari nama method yang terlalu pendek.
  • ConstructorWithNameAsEnclosingClass, constructor sebaikinya menggunakan constructor method.
  • ConstantNamingConventions, konstanta seharusnya selalu uppercase.
  • BooleanGetMethodName, jika sebuah method mengembalikan boolean, refactor method ini menjadi isX atau hasX bukan getX.

unusedcode

  • UnusedPrivateField, jika ada private property tapi tidak digunakan.
  • UnusedLocalVariable, jika ada variable yang dideklarasikan tapi tidak digunakan.
  • UnusedPrivateMethod, jika ada private method tapi tidak digunakan di dalam class.
  • UnusedFormalParameter, hindari passing parameter ke method atau constructor tetapi tidak menggunakannya.

Remark

  • Rules rules tersebut sangat membantu dalam development sehari hari tapi bisa juga menyebalkan.
  • Tapi ingat warning dari phpmd bukan berarti error codenya, direkomendasikan untuk dibetulkan tapi bisa saja diabaikan.
  • Rules yang saya gunakan: codesize,design,naming,unusedcode

Contoh

// file test.php
<?php

class Test
{
    public function test_a($a,$b)
    {
        $c = 3 + $a;

        if($c>15)
        {
            $c++;
        }

        $this::test_b();

        echo $c;
    }

    private static function test_b($flag = false)
    {
        if ($flag) {
            echo 'a';
        } else {
            echo 'b';
            exit();
        }

        return;
    }
}

$objA = new Test();
$objA->test_a(1,5);

Kemudian kita run phpmd menggunakan command berikut

php vendor/bin/phpmd test.php text unusedcode,design,naming,codesize 

/Users/libreorca/Htdocs/test/phpmd/test.php:5	Avoid unused parameters such as '$b'.
/Users/libreorca/Htdocs/test/phpmd/test.php:5	Avoid variables with short names like $a. Configured minimum length is 3.
/Users/libreorca/Htdocs/test/phpmd/test.php:5	Avoid variables with short names like $b. Configured minimum length is 3.
/Users/libreorca/Htdocs/test/phpmd/test.php:7	Avoid variables with short names like $c. Configured minimum length is 3.
/Users/libreorca/Htdocs/test/phpmd/test.php:25	The method test_b() contains an exit expression.

Line 5: ada warning tentang variabel b dideklarasikan tapi tidak digunakan, kemudian ada warning juga kalau nama variabel terlalu pendek dan warning
Line 25: method test_b mengandung statement exit. Maka kita lakukan refactor

// file test.php
<?php

class Test
{
    public function test_a($varA,$varB)
    {
        $varC = 3 + $varA + $varB;

        if($varA>15)
        {
            $varC++;
        }

        $this::test_b();

        echo $varC;
    }

    private static function test_b($flag = false)
    {
        if ($flag) {
            echo 'a';
        } else {
            echo 'b';
        }

        return;
    }
}

$objA = new Test();
$objA->test_a(1,5);

Kemudian kita run ulang phpmd sebagai berikut

php vendor/bin/phpmd test.php text unusedcode,design,naming,codesize

*empty result*

Jika phpmd tidak mengeluarkan output apa apa artinya kode kita memenuhi rules yang didefinisikan (unusuedcode,design,naming,codesize), now your code is much better than the previous one, YAY!!

Lakukan pengecekan phpmd berulang selama development untuk menjaga kualitas kode.

Leave a Reply

Your email address will not be published. Required fields are marked *