Como mensurar a qualidade de código? PHP

Como mensurar a qualidade de código? PHP

Trabalha em uma equipe ou até mesmo sozinho e quer entregar um código com alta qualidade? Veja uma maneira de resolver.

A maneira que apresentarei hoje é o grumphp.

Com o GrumPHP é possível mensurar a qualidade de seu código em mais de 10 tipos diferentes de qualidade, mas mencionarei os 3 que acho mais interessante:

  • PHPMD
    • Com essa métrica é possível validar código e variáveis não utilizadas, identifica possíveis bugs, expressões muito complexas.
  • PHPCS
    • Verifica se está infringindo algum padrão de projeto de acordo com a PSR, podendo ser PSR12, PSR1, PSR2, entre outros.
  • PHPMND
    • Verifica se há algum número mágico em seu código.

Lembrando que o processo de instalação que estou fazendo, não é com docker, é com o XAMP, instalado na máquina o composer e PHP.

Bom, vamos parar com o papo, vamos para a instalação e utilização

Documentação oficial: https://github.com/phpro/grumphp

Abra o terminal de sua preferência dentro do diretório do projeto e execute o seguinte comando:

composer require --dev phpro/grumphp

Após a conclusão da instalação, pode parecer que deu erro, pois aparecerá uma mensagem na cor vermelha escrito:

GrumPHP can not sniff your commits! (invalid-exit-code)

Mas fique tranquilo, faz parte do processo, após aparecer essa mensagem execute o comando a seguir:

./vendor/bin/grumphp configure

Este comando vai criar o arquivo de configuração e onde é possível adicionar algumas métricas.

Ao executar o comando, aparecerá a seguinte pergunta:

Do you want to create a grumphp.yml file? [Yes]:

É a mensagem perguntando se quer criar o arquivo de configuração do grumphp, por padrão está definido como sim, nesse artigo, vamos apenas clicar no "Enter", então poderá verificar na barra de arquivos a criação do grumphp.yml.

Teremos uma outra pergunta, que é:

Which tasks do you want to run?

Vai perguntar quais métricas que você quer executar e na sequencia, uma lista com 58 métricas possíveis para utilizar, vamos procurar na lista as 3 métricas mencionadas no início do artigo, inserir separado por vírgula (32,36,37), e clicar em "Enter".

Caso esqueceu algum ou até mesmo, depois quiser adicionar algum, basta continuar com esse artigo, que o processo é igual ao que farei.

Para o funcionamento, temos que agora na documentação, entrar em todas as métricas que queremos utilizar para a instalação e configuração.

Vamos iniciar pela métrica PHPCS:

De acordo com a documentação, temos que instalar uma biblioteca, para isto, entraremos no terminal na pasta do nosso projeto e executar o seguinte comando:

composer require --dev squizlabs/php_codesniffer

Após a instalação ser completada, na documentação do phpcs no grumphp, temos o trecho de código padrão do phpcs:

# grumphp.yml
grumphp:
    tasks:
        phpcs:
            standard: []
            severity: ~
            error_severity: ~
            warning_severity: ~
            tab_width: ~
            report: full
            report_width: ~
            whitelist_patterns: []
            encoding: ~
            ignore_patterns: []
            sniffs: []
            triggered_by: [php]
            exclude: []

Para a nossa implementação apenas deixarei a seguinte implementação:

# grumphp.yml
grumphp:
    tasks:
        phpcs:
            standard: ['PSR12']
        phpmd: null 
        phpmnd: null

Mas ainda não temos como executar o grumphp, pois apenas instalamos e configuramos uma métrica, devemos fazer o mesmo processo com o phpmd e o phpmnd.

Após a configuração, instalação das métricas PHPMD e PHPMND, o arquivo de configuração do grumphp ficou assim:

# grumphp.yml
grumphp:
    tasks:
        phpcs:
            standard: ['PSR12']
        phpmd:
            whitelist_patterns: []
            exclude: []
            report_format: text
            ruleset: ['cleancode', 'codesize', 'naming']
            triggered_by: ['php']
        phpmnd:
            directory: .
            whitelist_patterns: []
            exclude: []
            exclude_name: []
            exclude_path: []
            extensions: []
            hint: false
            ignore_funcs: []
            ignore_numbers: []
            ignore_strings: []
            strings: false
            triggered_by: ['php']

Agora sim vamos executar o grumphp, que vai varrer nosso código, procurando erros das métricas apontadas, para isso execute o seguinte comando em seu terminal:

./vendor/bin/grumphp run

No meu projeto, as métricas PHPCS e PHPMD não passaram, como pode ser visto na imagem abaixo:

Untitled.png

"Ta Gustavo, mas o que isso significa?"

Bom, significa que seu código pelo PHPCS, não está dentro da PSR12 e de acordo com o PHPMD, não está de acordo com as melhores práticas, como clean code.

Se você é um bom programador, deve estar preocupado com a qualidade de seu código, então para isso devemos utilizar essa ferramenta a nosso favor, o grumphp tem o log de qual arquivo, qual linha e o que está errado, como podemos ver na imagem abaixo:

Untitled.png

Como podemos ver, temos o arquivo que está com problema, a linha e qual o erro, no caso, está faltando o namespace no database.

O código desse arquivo está desta maneira:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('username');
            $table->string('password');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Para a resolução desse problema, basta adicionarmos o namespace conforme o mesmo código abaixo:

<?php

namespace database\migrations;

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('username');
            $table->string('password');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Após essa modificação, vamos executar novamente o grumphp.

./vendor/bin/grumphp run

Tivemos o seguinte resultado:

Untitled.png

Vimos que a correção que aplicamos, funcionou para que a métrica PHPCS tenha sido resolvido e com isso a qualidade do código aumentou.

O GRUMPHP tem uma funcionalidade muito interessante para as equipes de desenvolvimento, basta executar um comando para que ele mesmo crie um arquivo pre-commit, então todo desenvolvedor que for realizar um commit, rodará o grumphp, caso alguma etapa do processo dê erro, não deixa *commitar, *forçando o dev a corrigir o código. Então executaremos o comando abaixo:

./vendor/bin/grumphp git:init

Viu que simples??

Agora tentarei subir essa atualização da adição do grumphp e tentar realizar o commit, veja o que irá acontecer.

Untitled.png

Como podemos ver, a métrica PHPMD não passou, então não foi possível nem mesmo realizar o commit, para isso, vamos corrigir e executar novamente.

Untitled.png

Untitled.png

Então, depois de todas as etapas completas corretamente, podemos realizar nosso commit.

É muito interessante termos uma dependência dessa ao nosso dispor ainda mais se trabalharmos em equipes, assim é possível sempre ter um alto nível de código, reduzindo a quantidade de bug e até mesmo o dev aprender como melhorar o próprio código