Pular para o conteúdo

Métricas e cheiros

dataforge oop: WMC, DIT, NOC, CBO, RFC, LCOM, fan-in, instabilidade e manutenibilidade — e os anti-padrões ligados ao princípio SOLID que ferem.

dataforge oop lê a árvore, sem executar, e mede cada blueprint pelas métricas de Chidamber e Kemerer — as que a engenharia de software usa desde 1994 para prever onde os defeitos aparecem.

bash
dataforge oop src/
dataforge oop src/ --diagrama > classes.mmd
dataforge oop src/ --hierarquia
dataforge oop src/ --json
dataforge oop src/ --strict      # sai com erro se houver cheiro
MétricaO que medeAlto significa
WMCsoma da complexidade ciclomática dos métodosdifícil de testar
DITprofundidade na árvore de herançacomportamento espalhado pelas mães
NOCfilhas diretasmudar a mãe afeta muita gente
CBOcom quantos tipos ele conversaacoplamento
RFCmétodos próprios + métodos que ele chamaresposta difícil de prever
LCOM0 coeso, 1 cada método mexe no seu campovários blueprints dentro de um
fan-in / fan-outquem depende dele / de quem ele depende
instabilidadefan-out / (fan-in + fan-out)0 estável, 1 fácil de mudar
MIíndice de manutenibilidade, 0 a 100baixo é caro de manter

Cada cheiro diz o princípio#

CheiroPrincípioO que fazer
god-blueprintSRPseparar o que muda por motivos diferentes
baixa-coesaoSRPgrupos de métodos com grupos de campos são blueprints diferentes
metodo-longoSRPextrair passos com nome
switch-de-tipoOCPum método no contrato, sobrescrito por cada tipo
sobrescrita-que-recusaLSPse a filha não cumpre, ela não é subtipo
contrato-gordoISPcontratos pequenos, um por cliente
dependencia-concretaDIPreceber pelo construtor, tipado pelo contrato
heranca-fundacomposição sobre herançatrocar níveis por campos
acoplamento-excessivobaixo acoplamentodepender de contratos
modelo-anemicotell, don't asktrazer a regra para perto dos dados
inveja-de-recursotell, don't asko método talvez pertença ao outro objeto
parametros-demaisKISSagrupar num record
dependencia-circularacoplamentoextrair um contrato

Os limites estão numa tabela só (LIMITES em dataforge/oop_analise.py), porque são opinião — e opinião escrita em um lugar é discutível; espalhada, não. Os cheiros são sugestões: um blueprint que agrega e roteia pode ter CBO alto de propósito, e o comando só reprova com --strict.

O que o check prova, e o que o oop sugere#

A fronteira é a certeza. O dataforge check acusa o que dá para provar e é erro em qualquer leitura: override sem alvo, herança de final, contrato incompleto ou com aridade incompatível, readonly escrito fora da construção, gancho de metaclasse desconhecido, variantes de overload com a mesma assinatura, spawn de contrato. O dataforge oop aponta o que é provável, e deixa a decisão com quem escreveu.