Ferramenta para avaliar a complexidade de código escrito em PHP

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).

phploc

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:

alt

Esse 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!

Deixe seu comentário

Head de desenvolvimento. Vasta experiência em desenvolvimento Web com foco em PHP. Graduado em Sistemas de Informação. Pós-graduando em Arquitetura de Software Distribuído pela PUC Minas. Zend Certified Engineer (ZCE) e Coffee Addicted Person (CAP). @KennedyTedesco

© 2004 - 2019 TreinaWeb Tecnologia LTDA - CNPJ: 06.156.637/0001-58 Av. Paulista, 1765, Conj 71 e 72 - Bela Vista - São Paulo - SP - 01311-200