As métricas mais comuns para medir a complexidade (ou simplicidade, se você considerar a simplicidade o oposto da complexidade) são a Complexidade Ciclomática de McCabe e a Métrica da Complexidade de Halstead .
A complexidade ciclomática mede o número de caminhos distintos através de uma determinada unidade, geralmente um método ou função, embora também possa ser calculado em uma classe. À medida que o número de caminhos aumenta, fica mais difícil lembrar o fluxo de dados através de um determinado módulo, que está relacionado ao conceito de memória de trabalho . A alta complexidade ciclomática tende a indicar dificuldade na capacidade de testar um módulo - são necessários mais casos de teste para cobrir os vários caminhos do sistema. Também houve estudos que associaram alta complexidade ciclomática a altas taxas de defeitos. Normalmente, uma complexidade ciclomática de 10 indica que uma unidade deve ser revisada e possivelmente refatorada.
As medidas de complexidade de Halstead usam as entradas de operadores e operandos totais e distintos para calcular o volume, a dificuldade e o esforço de um pedaço de código. A dificuldade, que é o (número de operadores únicos / 2) * (número total de operandos / número de operandos únicos), está ligada à capacidade de ler e entender o código para tarefas como aprender o sistema ou executar uma revisão de código. Novamente, você pode contar isso no nível do sistema, no nível da classe ou no nível do método / função. Existem algumas publicações sobre o cálculo dessas medidas aqui e aqui .
Simplesmente contar linhas de código também pode lhe dar uma idéia da complexidade. Mais linhas de código significa que há mais para ler e entender em um módulo. Eu hesitaria em usar isso como uma medida independente. Em vez disso, eu o usaria com outras medidas, como o número de defeitos em um determinado módulo para obter a densidade do defeito. Uma alta densidade de defeitos pode indicar problemas ao escrever testes e executar revisões de código, que podem ou não ser causadas por códigos complexos.
Fan-in e fan-out são outras duas métricas, relacionadas ao fluxo de dados. Conforme definido aqui , fan in é a soma dos procedimentos chamados, parâmetros lidos e variáveis globais lidas e fan out é a soma dos procedimentos que chamam um determinado procedimento, parâmetros gravados (expostos a usuários externos, passados por referência), e variáveis globais gravadas em. Novamente, a alta entrada e saída de ventiladores pode ser um indicativo de um módulo que pode ser difícil de entender.
Em paradigmas específicos, pode haver outras medidas ou métricas também úteis. Por exemplo, no mundo orientado a objetos, o monitoramento do acoplamento (desejo baixo), coesão (desejo alto) e profundidade da herança (desejo baixo) pode ser usado para avaliar o quão simples ou complicado é um sistema.
Obviamente, é importante perceber que muitas medidas e métricas são simplesmente indicadores. Você precisa usar seu julgamento para determinar se é necessário refatorar para aumentar a simplicidade ou se não vale a pena o esforço para fazê-lo. Você pode fazer as medições, calcular as métricas e aprender sobre seu código, mas não deseja projetar seu sistema pelos números. Por fim, faça o que faz sentido.