A importância de medir a qualidade do software e como isso pode ser útil para os desenvolvedores. Ele menciona que os desenvolvedores sempre buscam melhorar seu software, mas às vezes pode ser que ele já esteja bom o suficiente. No entanto, como saber quando ele atinge um estado satisfatório?
Para resolver essa questão, foram introduzidas métricas de qualidade de software por especialistas nos primórdios da programação. Na década de 1970, eles pensaram sobre esse assunto e desenvolveram ideias que ainda são utilizadas hoje. O objetivo é aproveitar esse conhecimento e aplicá-lo em projetos próprios.
No capítulo em questão, serão abordados os seguintes tópicos:
FURPS é um acrônimo usado para descrever características ou requisitos de qualidade de um software. Cada letra representa uma categoria específica de requisitos. Aqui está o significado de cada letra:
FURPS é usado como uma estrutura para ajudar a identificar e descrever diferentes aspectos dos requisitos de qualidade de um software. Ele fornece uma maneira de categorizar e organizar esses requisitos, permitindo uma melhor compreensão e gerenciamento do projeto de software.
Há duas formas de avaliar o código: qualidade extrna e interna. A externa fica a cargo do QA/UX, que é a qualidade do software como produto e a interna é o que nos interressa, a qualidade do código
Qualidade externa: Refere-se aos aspectos visíveis ou perceptíveis pelo usuário. Isso inclui a usabilidade, desempenho e outros aspectos que podem ser medidos sem analisar diretamente o código-fonte do software.
Qualidade interna: Diz respeito aos aspectos relacionados ao código e ao desenvolvimento do software. Os desenvolvedores se preocupam principalmente com a qualidade interna, como a legibilidade do código, facilidade de extensão e capacidade de escrever testes. Embora os usuários não vejam diretamente o código, a qualidade interna afeta indiretamente a experiência do usuário, pois um código de alta qualidade tende a ter menos bugs e ser mais rápido e eficiente. Esses aspectos podem ser verificados usando testes unitários automatizados ou analisadores de código.
As métricas que iremos estudar são as seguintes:
Contar linhas de código (LOC) não é exatamente uma métrica de qualidade. De qualquer forma, é útil pr saber o tamanho do projeto. Há diversas tipos de LOC
Lines of Code (LOC): Contar todas as linhas do arquvo
Comment Lines of Code (CLOC): Quantas linhas estão comentadas
Non-Comment Lines of Code (NCLOC): Linhas sem comentarios
Logical Lines of Code (LLOC): Conta as linhas que tem código mesmo, retirando comentários e abre e fecha de parentes além des espaços em branco
Uma métrica comum para isso é a Complexidade Ciclomática (CC) que é a contagem de número de caminhos de execução dentro de uma função. Ela foi introduzida no final da década de 1970, mas ainda é útil. A ideia por trás do nome críptico é simples: contamos o número de pontos de decisão, que são as declarações if, while, for e case. Além disso, a entrada da função conta como uma declaração também.
// first decision point
function someExample($a, $b)
{
// second decision point
if ($a < $b) {
echo "1";
} else {
echo "2";
}
// third
if ($a >
echo
} else {
echo
}
}
O CC para o trecho de código anterior seria 3: a entrada da função conta como o primeiro caminho de decisão e ambas as declarações if contam como um caminho de decisão cada uma. No entanto, as declarações else não são levadas em conta pela definição, pois fazem parte das cláusulas if. Essa métrica é especialmente útil para avaliar rapidamente a complexidade de um código que você ainda não conhece. Geralmente é usada para verificar uma única função, mas também pode ser aplicada a classes ou até mesmo a um aplicativo inteiro. Se você tiver uma função com um CC alto, considere dividi-la em várias funções menores para reduzir o valor.
Uma segunda métrica de complexidade de código é a complexidade NPath. A ideia básica é semelhante à CC, pois conta os caminhos de decisão de uma função também. No entanto, ela conta todos os caminhos de decisão possíveis e não apenas as quatro declarações (if, while, for e case) definidas para a CC. Além disso, o ponto de entrada da função não é contado como um caminho de decisão para essa métrica.
Ao observar o exemplo acima, a complexidade NPath seria 4, porque temos 2 * 2 caminhos possíveis através da função: ambos os if statements, assim como ambos os else statements. Portanto, os quatro echo statements são considerados caminhos de decisão. Conforme mencionado anteriormente, a chamada da própria função não é considerada. Agora, se adicionássemos mais um if statement, a complexidade NPath aumentaria para 8. Isso ocorre porque teríamos então 2 * 2 * 2 caminhos possíveis. Em outras palavras, a métrica cresce exponencialmente, tornando-se rapidamente bastante alta.
A complexidade NPath retrata o esforço real de testar uma função melhor do que a CC, pois nos informa diretamente quantos resultados possíveis da função precisaríamos testar para alcançar uma cobertura de teste de 100%.
https://www.verifysoft.com/en_halstead_metrics
These values will give you a rough indication of what type of code you are dealing with. Is it easy to understand? How much time was spent developing it? How many bugs can be expected? However, without comparing these values with results from other applications, they will not help you that much.
Usa CC (Complexidade ciclomática) + code coverage (quantas linhas os tests cobriram)
A combinação dessas duas métricas é bastante útil. Um código que não é excessivamente complexo e possui uma alta cobertura de testes é muito mais propenso a estar livre de bugs e ser mantido do que um código que é complexo e para o qual não existem muitos testes.
Como última métrica nesta seção, vamos analisar o índice de manutenibilidade. Ele fornecerá apenas um valor que indica a manutenibilidade do código inspecionado, ou seja, ele diz o quão fácil será alterá-lo sem introduzir novos bugs. Duas coisas tornam essa métrica particularmente interessante para nós.
Em primeiro lugar, ela é baseada nas métricas mencionadas anteriormente e utiliza LOC, métricas de Halstead e o CC para calcular o índice. Mais uma vez, não precisamos realmente saber a fórmula exata. Se você estiver interessado, pode consultá-la aqui: https://www.verifysoft.com/en_maintainability.html.
Em segundo lugar, essa métrica retornará um valor que você pode usar para avaliar diretamente a qualidade do código:
Com essa métrica, você não precisa de nenhum outro código para compará-la. É por isso que ela é especialmente útil para avaliar rapidamente a qualidade do código.
$> O QUE É COMPLEIDADE ACINTOMATICA
A complexidade ciclomática de um programa é determinada pelo número de caminhos independentes que podem ser percorridos durante a execução do código. Esses caminhos são determinados pelas estruturas de controle, como condicionais (if-else, switch-case), loops (for, while, do-while) e estruturas de controle de fluxo (break, continue, return). Quanto maior o número de caminhos independentes, maior será a complexidade ciclomática do programa.
A complexidade ciclomática é importante porque está relacionada ao número de casos de teste necessários para cobrir todas as possíveis combinações de caminhos no programa. Além disso, ela também está relacionada à facilidade de manutenção e compreensão do código-fonte. Programas com alta complexidade ciclomática tendem a ser mais difíceis de entender, depurar e manter.
Existem várias fórmulas e ferramentas para calcular a complexidade ciclomática de um programa, como o grafo de fluxo de controle. No entanto, é importante lembrar que a complexidade ciclomática é apenas uma das muitas métricas utilizadas na avaliação da qualidade do software e não é uma medida absoluta de sua qualidade ou eficiência.
$> O QUE É NPATH
A complexidade NPath é outra métrica utilizada na avaliação da complexidade de um programa de computador. Diferentemente da complexidade ciclomática, que mede o número de caminhos independentes, a complexidade NPath foca na contagem do número total de caminhos possíveis em um programa.
A complexidade NPath é calculada considerando todas as combinações possíveis de caminhos em um programa, levando em conta as estruturas de controle, como condicionais (if-else, switch-case) e loops (for, while, do-while). Cada caminho é multiplicado pelo número de vezes que pode ser executado. Ao somar todos esses caminhos ponderados, obtemos a complexidade NPath.
Essa métrica é útil para avaliar a cobertura de teste do programa, pois quanto maior a complexidade NPath, maior será o número de casos de teste necessários para garantir uma cobertura adequada de todos os caminhos possíveis.
Embora a complexidade NPath seja uma métrica mais abrangente que a complexidade ciclomática, ela tende a ser menos usada na prática devido à sua complexidade de cálculo e interpretação. A complexidade ciclomática é mais amplamente adotada por sua simplicidade e eficácia na análise da complexidade estrutural do código.
$> O QUE É HALSTEAD METRICS
As métricas de Halstead são um conjunto de métricas de software propostas por Maurice H. Halstead em 1977. Essas métricas visam quantificar diferentes aspectos do software com base nas características do código-fonte.
As métricas de Halstead são derivadas de quatro medidas básicas: o número de operadores distintos (N1), o número de operandos distintos (N2), o número total de operadores (n1) e o número total de operandos (n2). Com base nessas medidas, várias métricas são calculadas:
Volume (V): Mede o tamanho do programa e é calculado como V = (n1 + n2) * log2(N1 + N2).
Dificuldade (D): Indica o quão difícil é entender o programa e é calculada como D = (N1 / 2) * (n2 / N2).
Esforço (E): Mede a quantidade de esforço necessário para escrever o programa e é calculado como E = V * D.
Tempo estimado (T): Estima o tempo necessário para escrever o programa e é calculado como T = E / 18 segundos.
Número de erros (B): Estima o número de erros no programa e é calculado como B = V / 3000.
Essas métricas de Halstead são úteis para avaliar a complexidade, o esforço e outros aspectos do software com base em suas características estruturais. Elas podem fornecer informações sobre a qualidade, a manutenibilidade e a facilidade de compreensão do código-fonte. No entanto, é importante notar que as métricas de Halstead têm limitações e devem ser usadas em conjunto com outras métricas e técnicas de análise de software para uma avaliação mais abrangente.
$> COMO CALUCALAR AS METRICAS HASTENAD
As métricas de Halstead podem ser calculadas com base em quatro medidas básicas: o número de operadores distintos (N1), o número de operandos distintos (N2), o número total de operadores (n1) e o número total de operandos (n2). A partir dessas medidas, você pode calcular as seguintes métricas de Halstead:
Para calcular essas métricas, siga estes passos:
Lembrando que essas métricas são apenas indicadores e devem ser interpretadas e utilizadas em conjunto com outras técnicas de análise de software para uma avaliação mais abrangente da qualidade e complexidade do código-fonte.
$> O que é The maintainability index
ChatGPT O índice de manutenibilidade (maintainability index) é uma métrica que visa avaliar a facilidade de manutenção de um software. Ele fornece uma medida numérica da qualidade do código-fonte com base em diversos fatores, como legibilidade, complexidade e facilidade de compreensão.
O índice de manutenibilidade geralmente é calculado usando uma fórmula padronizada que considera diferentes características do código. Embora as fórmulas possam variar ligeiramente dependendo da ferramenta ou método específico utilizado, geralmente levam em consideração fatores como o tamanho do código, a complexidade ciclomática, a profundidade de aninhamento, a coesão e o acoplamento.
Normalmente, o índice de manutenibilidade é representado como um valor numérico, geralmente em uma escala de 0 a 100. Quanto maior o valor, maior é considerada a manutenibilidade do código. Um índice mais alto indica que o código é mais fácil de entender, modificar e corrigir, o que facilita a manutenção contínua.
O índice de manutenibilidade é útil para desenvolvedores, equipes de projeto e gerentes de software, pois fornece uma métrica objetiva para avaliar a qualidade do código e identificar áreas que podem exigir mais esforços de manutenção ou melhorias. No entanto, é importante lembrar que o índice de manutenibilidade é apenas uma métrica e deve ser considerado em conjunto com outras práticas e técnicas de engenharia de software para obter uma visão completa da qualidade do código e facilitar a manutenção efetiva do software.
A seguir, será apresentado 3 ferramentas para obter métricas
Como o nome diz, serve para calcular o LOC
Instalar
$ wget https://phar.phpunit.de/phploc.phar
Usar
$ php phploc.phar src
As métrias que mostra
Essas informações são muito mais abrangentes do que apenas as linhas de código (LOC). As informações são divididas nas seguintes categorias:
Isso é tudo o que precisamos saber sobre a funcionalidade do phploc por enquanto. É uma ferramenta simples de usar, porém útil, que ajuda a ter uma visão rápida sobre a qualidade geral do código e a estrutura de um projeto, portanto, deve fazer parte do seu conjunto de ferramentas.
Exemplo de Saida do phploc
Directories 3
Files 10
Size
Lines of Code (LOC) 500
Comment Lines of Code (CLOC) 100
Non-Comment Lines of Code (NCLOC) 400
Classes
Abstract 2
Concrete 8
Methods
Scope
Non-Static 30
Static 10
Visibility
Public 25
Protected 5
Private 10
Complexity
Cyclomatic Complexity / LLOC 0.5
Cyclomatic Complexity / Number of Methods 3.0
Dependencies
Global Accesses / Non-Static Method 20
Global Accesses / Static Method 5
$> O que é PHPLoc
PHPLoc é uma ferramenta de análise estática para código PHP. Ela fornece métricas e estatísticas detalhadas sobre um projeto PHP, permitindo que os desenvolvedores obtenham insights sobre a qualidade, complexidade e tamanho do código. O nome PHPLoc é uma abreviação de “PHP Lines of Code” (Linhas de Código PHP) e seu objetivo principal é ajudar os desenvolvedores a entenderem melhor a estrutura e a saúde do código PHP.
Ao executar o PHPLoc em um projeto PHP, ele analisa todos os arquivos PHP encontrados, contando as linhas de código, comentários, classes, funções, métodos e outros elementos do código. Ele também calcula métricas como complexidade ciclomática, acoplamento, coesão e outras medidas de qualidade de código.
Além disso, o PHPLoc fornece um resumo geral do projeto, incluindo o número total de arquivos e diretórios, tamanho total do código, médias de linhas de código por classe, função, método, entre outros dados relevantes. Essas informações podem ser úteis para identificar áreas problemáticas, como classes muito grandes, funções complexas ou baixa coesão.
O PHPLoc é uma ferramenta de linha de comando e pode ser executado em diferentes sistemas operacionais. Ele é distribuído como um pacote phar (PHP Archive) e pode ser facilmente integrado em fluxos de trabalho de desenvolvimento ou sistemas de integração contínua para análise automatizada de código.
$> Dê um exemplo da saida do PHPLoc
Aqui está um exemplo simplificado da saída do PHPLoc:
sqlCopy codeDirectories 3
Files 10
Size
Lines of Code (LOC) 500
Comment Lines of Code (CLOC) 100
Non-Comment Lines of Code (NCLOC) 400
Classes
Abstract 2
Concrete 8
Methods
Scope
Non-Static 30
Static 10
Visibility
Public 25
Protected 5
Private 10
Complexity
Cyclomatic Complexity / LLOC 0.5
Cyclomatic Complexity / Number of Methods 3.0
Dependencies
Global Accesses / Non-Static Method 20
Global Accesses / Static Method 5
Neste exemplo, o PHPLoc analisou um projeto PHP que contém três diretórios e um total de dez arquivos. O código tem 500 linhas no total, sendo 100 linhas de código de comentário e 400 linhas de código não comentadas.
A análise também revela que há duas classes abstratas e oito classes concretas no projeto. Quanto aos métodos, existem 30 métodos não estáticos e 10 métodos estáticos. Quanto à visibilidade dos métodos, 25 são públicos, 5 são protegidos e 10 são privados.
Em relação à complexidade do código, é fornecido o valor da complexidade ciclomática, que é uma medida da complexidade estrutural do código. Neste exemplo, o valor é 0.5 para a relação entre a complexidade ciclomática e as linhas de código (LLOC), e 3.0 para a relação entre a complexidade ciclomática e o número de métodos.
Por fim, são fornecidas algumas métricas de dependências do código. O PHPLoc registra o número de acessos globais a métodos não estáticos e a métodos estáticos no projeto.
Essa é apenas uma representação simplificada da saída do PHPLoc. A ferramenta oferece informações mais detalhadas sobre cada classe, método e métrica, permitindo uma análise mais aprofundada da estrutura e qualidade do código PHP.
If there was a prize for the most metrics combined in one tool, then it would surely go to PHP Depend (PDepend). It covers all the metrics we discussed in the previous section, plus many more. However, it is not the most user-friendly tool there is. Plus, the website and the repository documentation are not perfect. Nevertheless, you should check it out.
Instalar e suar
$ composer require pdepend/pdepend --dev
usar
$ vendor/bin/pdepend --summary-xml=pdepend_summary.xml src
Exemplo de saida
PDepend 2.10.3
Parsing source files:
............................................... 47
Calculating Cyclomatic Complexity metrics:
................. 355
Calculating Node Loc metrics:
............. 279
Calculating NPath Complexity metrics:
................. 355
Calculating Inheritance metrics:
..... 101
Reumo do phpdepend
PDepend é poderoso, mas ao mesmo tempo difícil de acompanhar. A saída gerada é difícil de ler e, quando o projeto fica um pouco maior, torna-se inutilizável a menos que você utilize outras ferramentas para analisar o arquivo XML. No entanto, talvez você precise das métricas avançadas que ele fornece um dia, ou talvez esteja trabalhando em um projeto onde ele já está em uso. Então, pelo menos agora você está preparado.
$> O que é phpdepend
O PHP Depend é uma ferramenta de análise estática de código-fonte PHP que permite identificar e analisar as dependências entre as classes e os pacotes de um projeto PHP. Ele ajuda os desenvolvedores a entender a estrutura e as relações entre os componentes do código, permitindo uma melhor visualização da arquitetura e da qualidade do software.
O PHP Depend utiliza a análise estática do código PHP para extrair informações sobre as classes, interfaces, namespaces e suas dependências. Ele cria um mapa das dependências e fornece métricas e estatísticas sobre o código.
Ao executar o PHP Depend em um projeto PHP, ele identifica as dependências entre as classes e os pacotes. Ele pode detectar classes que dependem de outras classes, interfaces ou namespaces, permitindo uma análise abrangente das interações entre os componentes do código.
Além disso, o PHP Depend fornece métricas e estatísticas sobre o código, como o acoplamento entre classes, a coesão dos pacotes, a complexidade ciclomática, o tamanho do código e outras medidas de qualidade de software. Essas informações ajudam os desenvolvedores a identificar possíveis problemas, como classes altamente acopladas, pacotes com baixa coesão ou áreas do código que precisam de refatoração.
O PHP Depend é executado como uma ferramenta de linha de comando e pode ser integrado em fluxos de trabalho de desenvolvimento ou sistemas de integração contínua para análise automatizada de código. Ele fornece relatórios detalhados e visuais, incluindo gráficos e diagramas, para auxiliar na compreensão das dependências e da estrutura do código PHP.
Tem uma saida muito mais facil de se observar do que o phploc e o ppdepdn
Installation and usage
Let us add PhpMetrics to your project using Composer:
$ composer require phpmetrics/phpmetrics --dev
After all the files have been downloaded, you can immediately start generating your first report:
$ vendor/bin/phpmetrics --report-html=phpmetrics_report src
The –report-html option specifies the folder in which the report will be created. You can specify more than one folder to be scanned by providing them as a comma-separated list. For our example, however, we will just use the src folder.
To open the actual HTML report that has just been generated, simply open the index.html file in that folder in your browser. Before we have a closer look at the generated report, let us see which other useful options PhpMetrics offers first:
O HTML GERADO PELO PHP METRICS MOSTRA MUITA COISA QU RESOLVI PULAR, POIS É MAIS DIELA APRENDER NA HORA DE USAR MERMSO
$> O que é PHP metrics e como instalar e usá-lo
PHP Metrics é uma ferramenta que permite medir e analisar métricas de código-fonte em projetos PHP. Ela fornece informações sobre a complexidade, tamanho, coesão, acoplamento e outras características do código PHP, permitindo que os desenvolvedores avaliem a qualidade e o desempenho do software.
Para instalar e usar o PHP Metrics, você pode seguir estes passos:
Requisitos: Certifique-se de ter o PHP instalado no seu sistema.
Instalação via Composer: Abra um terminal ou prompt de comando e navegue até o diretório raiz do seu projeto PHP. Em seguida, execute o seguinte comando para instalar o PHP Metrics usando o Composer:
bashCopy codecomposer require phpmetrics/phpmetrics
Isso irá baixar e instalar as dependências do PHP Metrics no seu projeto.
bashCopy code./vendor/bin/phpmetrics
Esse comando inicia o PHP Metrics e começa a análise do código PHP no diretório atual.
Você também pode especificar um diretório específico para análise, fornecendo o caminho como argumento para o comando. Por exemplo:
bashCopy code./vendor/bin/phpmetrics /path/to/project
Visualizando os resultados: Após a análise, o PHP Metrics gera um relatório HTML com as métricas do código. Você pode encontrar o relatório no diretório ./var/report
do seu projeto.
Para visualizar o relatório, abra o arquivo index.html
em um navegador da web.
O PHP Metrics fornece uma ampla variedade de métricas, como linhas de código, complexidade ciclomática, acoplamento, coesão, entre outras. O relatório gerado pelo PHP Metrics exibe essas métricas de forma organizada e fácil de ler, permitindo que você avalie a qualidade do seu código PHP e identifique áreas que podem precisar de melhorias.
Lembre-se de consultar a documentação oficial do PHP Metrics para obter informações mais detalhadas sobre as opções de configuração e uso da ferramenta.
Prós: As métricas de qualidade de código fornecem uma visão geral do estado atual do projeto, ajudam a identificar áreas que precisam ser melhoradas, auxiliam no treinamento de refatoração e fornecem uma conquista quando indicadores positivos são alcançados. Além disso, elas ajudam a evitar a escrita de código ruim desde o início.
Contras: As métricas podem levar alguns desenvolvedores a refatorar mais código do que o necessário, com o objetivo de obter melhores métricas. Além disso, é importante encontrar um equilíbrio entre a velocidade de desenvolvimento e a qualidade do código, considerando prazos e recursos disponíveis. Também é fundamental não usar as métricas como forma de competir ou criticar colegas de trabalho, e sim promover um ambiente de respeito, colaboração e tolerância.
Este capítulo introduziu você a algumas das métricas de qualidade de código mais utilizadas no mundo do PHP. Além disso, apresentamos as ferramentas que ajudam você a coletá-las. É claro que existem muitas outras que não pudemos abordar neste livro, mas você não precisa conhecer todas elas - agora você está equipado com uma compreensão sólida das métricas de qualidade de código que o ajudarão em sua rotina diária de trabalho.
Ferramentas e métricas de qualidade de código certamente não são a solução para todos os problemas. Por um lado, elas podem ser extremamente úteis para melhorar seu código. Por outro lado, você não deve considerá-las como a medida definitiva. Existem inúmeros exemplos de tipos bem-sucedidos de software que nunca passariam por essas verificações de qualidade, como o WordPress. No entanto, tenha certeza de que os criadores do WordPress teriam feito as coisas de maneira diferente se soubessem antecipadamente.
No próximo capítulo, deixaremos o reino da teoria. Aprenderemos como organizar as ferramentas que apresentamos nos últimos dois capítulos em nossos projetos. Cada projeto é único, então ofereceremos diferentes opções para atender às suas necessidades.
Métricas de Código
É originária de uma fórmula
Ferramntas para buscar esa metricas
phploc
phpdepend
phpmetrics
Pros e Contras de utilizar e focar nessas métrica:
Further reading