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:
"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:
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:
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.
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.
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