O documento discute métricas de código e como elas podem ser usadas para melhorar o design de software e testes. Ele explica conceitos como complexidade ciclomática e acoplamento e como métricas como essas podem guiar a tomada de decisões de design. Ferramentas para análise de métricas também são apresentadas.
3. Sob a óptica da arquitetura de software:
MÉTRICAS DE CÓDIGO
Globalcode – Open4education
4. O que veremos?
O que são Conhecendo
Usando métricas
métricas de algumas
de código
código? métricas
Métricas
Queryable Indicadores de
guiando o
source code qualidade
design
Case: relação Algumas
entre ferramentas
métricas, design
e testes
Globalcode – Open4education
5. Não seria muito útil usar um
monóculo aqui, certo?
Globalcode – Open4education
6. O que esse código diz?
Globalcode – Open4education
7. O que (todo) esse código diz?
Globalcode – Open4education
8. Sim, a entropia em
software existe ...
Manter as coisas como estão,
exige trabalho!
Globalcode – Open4education
12. Uma métrica precisa ser válida,
confiável e barata.
Globalcode – Open4education
13. Potencial das métricas (1 de 2)
Analisar Medidas
qualidade e Qualificar a funcionais são
produtividade do Utilizadas para
performance necessárias
processo de comparar a
técnica dos para qualificar a
desenvolvimento produtividade
e manutenção
produtos do performance
de diferentes
bem como do ponto de vista dos produtos
técnicas e
produto de do pela
tecnologias
software desenvolvedor perspectiva do
construído usuário
Globalcode – Open4education
14. Potencial das métricas (2 de 2)
No nível
técnico, as
medições são
importantes
Embasar
Reduzir Formar uma para determinar
solicitações de
frustrações e linha básica parâmetros
novas
pressões de para como
ferramentas e
cronograma estimativas quantidade de
treinamentos
teste
necessário e
impacto de
mudanças
Globalcode – Open4education
20. Calculando CC (Complexidade Ciclomática)
Em linguagens como C#, as seguintes expressões
são desconsideradas para cálculo da CC:
else | do | switch | try | using | throw | finally | return |
object creation | method call | field access
Globalcode – Open4education
25. Acredite, todos falam em
redução de acoplamento!
Shotgun
Surgery
Feature
CQS Envy
Tell, D
on't
Ask Say It
Law of Once
Demeter and Only
Once
IoC DI
Globalcode – Open4education
33. Queryable source code
SELECT Dead code!
[method name]
FROM
[my entire solution]
WHERE
MethodCa == 0 AND
!MethodIsPublic AND
!MethodIsProtected AND
!MethodIsEntryPoint AND
!MethodIsExplicitInterfaceImplementation AND
!MethodIsClassConstructor AND
!MethodIsFinalizer
Globalcode – Open4education
34. Relação entre testes,
design e métricas (gist)
https://gist.github.com/2149474
Globalcode – Open4education
38. Questões levantadas
Se CC = N, então N
Qual a é o número mínimo
relação entre de testes necessário.
Testes x CC?
Testar métodos com Existem outros pontos que
CC=1 pode ser inútil. aumentam a complexidade
ciclomática sem ela
aparecer nas métricas. Um
Math.Max, é um exemplo.
Globalcode – Open4education
39. Questões levantadas
Qual a relação entre
Cobertura de testes x CC?
Batalha!
Membros públicos Vs privados!!
Em uma classe coesa, os métodos
privados no fundo servem pra diminuir a
CC e aumentar a legibilidade dos
métodos públicos.
Globalcode – Open4education
40. Questões levantadas
Qual a relação
entre Métricas x
Design?
Globalcode – Open4education
41. Referências
Relação entre métricas, design e testes (Github)
https://gist.github.com/2149474
Emergent design through metrics (by Neal Ford)
http://goo.gl/tdyVO
Série de posts sobre Code Metrics
http://leandrodaniel.com/?tag=/Code+Metrics
Globalcode – Open4education
42. Ferramentas
Lista de ferramentas para análise de código estático
http://goo.gl/KjLq
FluentCodeMetrics (by Elemar Jr)
http://goo.gl/CvnAW
NDepend
http://ndepend.com
JArchitect
http://jarchitect.com
Globalcode – Open4education
Sendo o arquiteto de software (tanto no exercício de um cargo ou papel) o indivíduo responsável pela estrutura e design de um produto e também o canal de comunicação entre time de desenvolvimento e arquiteto corporativo (cargo ou papel), podemos aferir que:As medições e as métricas ajudam a entender o processo técnico usado para desenvolver um produto. O processo é medido num esforço para melhorá-lo, assim como o produto é medido num esforço para aumentar sua qualidade. Também são necessárias para analisar a qualidade e a produtividade do processo de desenvolvimento; bem como a manutenção do produto de software construído.
Medida: Fornece uma indicação quantitativa da extensão, quantidade, dimensão, capacidade ou tamanho de algum atributo de um produto ou processo. Medida é uma função de mapeamento;Medição: Ato de determinação de uma medida;Métrica: Medida quantitativa do grau em que um sistema se encontra em relação a um determinado atributo;Indicadores: Métrica ou combinação de métricas que fornece uma compreensão de um processo/projeto/produto.
Uma métrica deve ser válida, o que significa que ela deve quantificar o que queremos medir. Ela também precisa ser confiável, produzindo os mesmos resultados dadas as mesmas condições. Por fim, métricas precisam ser produzidas facilmente, ou seja, devem ser baratas.
É importante deixar claro que as métricas de código não estão relacionadas apenas com o software em si, mas também com os processos de desenvolvimento e manutenção. Consegue-se, a partir das métricas, dados quantitativos que oferecem uma boa informação sobre o andamento da construção sendo possível estimar custos, avaliar tendências, melhorar o design, ou até mesmo ter noção sobre a qualidade do sistema produzido.
A genial figura abaixo, criada por ThomHolwerda, apresenta a medida WTFs/minute (algo como“Que_Porra_é_Essa / minuto”) como um indicador da qualidade de um software.
LOC: Lines of CodeLOCM: Lack of cohesion of methods (falta de coesão dos métodos)NOC: Number of ChildrenILCC: IL cyclomatic complexityABC: Association between methodsDIT: Depth of Inheritance Tree
Abstração da JDK
Chamamos de "código morto" qualquer linha ou trecho de código não acessível por nenhum caminho de execução de um programa. Por ser (quase sempre) desnecessário, deadcode eleva a complexidade de um software - em suma, faz o código feder.Note que deadcode pode ser:- um código (por exemplo, um método, um membro de classe ou uma classe) não utilizado(a) por nenhum outro(a);- um código redundante (implorando por refactoring);- um código inacessível (o famoso unreachablecode, às vezes de difícil detecção).Porém, nem sempre um código inacessível é um deadcode. Ele pode simplesmente ter sido "morto" por um IF mal codificado.
.
.
Chamamos de "código morto" qualquer linha ou trecho de código não acessível por nenhum caminho de execução de um programa. Por ser (quase sempre) desnecessário, deadcode eleva a complexidade de um software - em suma, faz o código feder.Note que deadcode pode ser:- um código (por exemplo, um método, um membro de classe ou uma classe) não utilizado(a) por nenhum outro(a);- um código redundante (implorando por refactoring);- um código inacessível (o famoso unreachablecode, às vezes de difícil detecção).Porém, nem sempre um código inacessível é um deadcode. Ele pode simplesmente ter sido "morto" por um IF mal codificado.