Recentemente o Taylor Otwell (criador do Laravel Framework) publicou um artigo avaliando a complexidade de código dos principais frameworks utilizados em PHP. Ele decidiu simplificar e colocar na análise apenas as seguintes informações/métricas:
- Quantidade de linhas de código.
- Método mais longo (em número de linhas).
- Média da complexidade dos métodos.
- Máxima complexidade de um método.
- Porcentagem de métodos não estáticos.
Essa última métrica é importante (especialmente) para Frameworks, pois há uma relação direta entre baixa testabilidade e métodos estáticos (quanto ao uso indiscriminado). Portanto, em teoria, quanto menos métodos estáticos, mais facilmente “testável” é o “todo”.
A ferramenta utilizada por ele para gerar o relatório foi a phploc do Sebastian Bergmann (criador do PHPUnit).
Curso PHP - Testes unitários com PHPUnit
Conhecer o cursophploc
A instalação da phploc se dá pelo Composer, numa instalação global, de tal forma que o binário da ferramenta fique disponível no caminho de busca do SO.
Como pré-requisitos, você precisa ter o PHP e o Composer instalados (e no caminho de busca global). Se você tiver alguma dúvida sobre como proceder com a instalação do Composer, verifique aqui.
Instalando a ferramenta
No terminal (ou CMD, se você estiver no Windows), execute:
composer global require 'phploc/phploc=*'
Finalizado, tudo o que você precisa fazer é navegar até a pasta do projeto que você quer gerar o relatório e executar:
phploc ./folder
Para que possamos aqui visualizar a saída da execução da ferramenta, vamos clonar o core do Laravel e executá-la na pasta do componente Database.
Para isso, no diretório padrão onde você tem os seus projetos PHP (ou em outro, se preferir), execute:
composer require laravel/framework
Isso vai criar uma pasta chamada framework
. Para executar a análise somente no componente Database, primeiro navegue até essa pasta e em seguida execute:
phploc src/Illuminate/Database/
Veja:
Curso BDD - Testes Guiados por Comportamento com Behat PHP
Conhecer o cursoEsse foi o relatório gerado:
Directories 16
Files 107
Size
Lines of Code (LOC) 26752
Comment Lines of Code (CLOC) 12193 (45.58%)
Non-Comment Lines of Code (NCLOC) 14559 (54.42%)
Logical Lines of Code (LLOC) 3884 (14.52%)
Classes 3450 (88.83%)
Average Class Length 32
Minimum Class Length 0
Maximum Class Length 345
Average Method Length 1
Minimum Method Length 0
Maximum Method Length 12
Functions 0 (0.00%)
Average Function Length 0
Not in classes or functions 434 (11.17%)
Cyclomatic Complexity
Average Complexity per LLOC 0.24
Average Complexity per Class 9.88
Minimum Class Complexity 1.00
Maximum Class Complexity 104.00
Average Complexity per Method 1.61
Minimum Method Complexity 1.00
Maximum Method Complexity 17.00
Dependencies
Global Accesses 10
Global Constants 10 (100.00%)
Global Variables 0 (0.00%)
Super-Global Variables 0 (0.00%)
Attribute Accesses 1374
Non-Static 1317 (95.85%)
Static 57 (4.15%)
Method Calls 2606
Non-Static 2407 (92.36%)
Static 199 (7.64%)
Structure
Namespaces 17
Interfaces 5
Traits 13
Classes 89
Abstract Classes 9 (10.11%)
Concrete Classes 80 (89.89%)
Methods 1566
Scope
Non-Static Methods 1496 (95.53%)
Static Methods 70 (4.47%)
Visibility
Public Methods 1037 (66.22%)
Non-Public Methods 529 (33.78%)
Functions 119
Named Functions 0 (0.00%)
Anonymous Functions 119 (100.00%)
Constants 5
Global Constants 3 (60.00%)
Class Constants 2 (40.00%)
Como você pôde observar, avalia-se muito mais do que só o que introduzimos no começo desse post, como a quantidade de:
- Linhas de código;
- Diretórios;
- Classes concretas;
- Classes abstratas;
- Interfaces;
- Traits;
- Métodos estáticos;
- Funções;
- Etc.
A ferramenta também a avalia a complexidade ciclomática média das classes e métodos.
Em futuros artigos veremos sobre teorias de teste de software e métricas para medição da qualidade de código.
Até a próxima!