Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
May 14, 2022 04:00 am GMT

Reduzindo a complexidade ciclomtica em Elixir

Neste post vamos aprender o que complexidade ciclomtica, como identific-la e quais os seus pontos negativos. Vamos usar bastante o Credo para identificar de fato a complexidade de cada exemplo fornecido.

Para este artigo foi usado como base How To Reduce Cyclomatic Complexity: A Complete Guide

  • O que complexidade ciclomtica?
  • Criando o projeto
  • Exemplos de CC simples
    • Funo de complexidade 1
    • Funo de complexidade 2
    • Funo de complexidade 3
    • Reduzindo a CC
  • Problemas futuros
    • Complexidade cognitiva
    • Cdigo mais difcil de testar
    • Maior risco de defeitos
  • Concluso

O que complexidade ciclomtica?

A complexidade ciclomtica (CC) uma mtrica de complexidade de software intimamente correlacionada com erros de codificao.

Se uma funo parece que ficou muito complexa, na maioria das vezes ela tambm tem um valor CC alto. Portanto, isso til para convencer os membros da equipe e os chefes da necessidade de refatorar partes do cdigo com base em mtricas "objetivas".

A complexidade ciclomtica o nmero mnimo de casos de teste necessrios para alcanar a cobertura total da ramificao. Assim, a complexidade ciclomtica pode prever o quo difcil testar um determinado pedao de cdigo.

Vamos construir um projeto para testar alguns exemplos.

Criando o projeto

O projeto pronto voc encontra em: https://github.com/maiquitome/cyclomatic_complexity

mix phx.new cyclomatic_complexity

Quem verifica o CC o Credo, ento instale ele adicionando a linha abaixo ao seu mix.exs:

{:credo, "~> 1.6", only: [:dev, :test], runtime: false}

e rodando o comando abaixo no terminal:

$ mix deps.get

Exemplos de CC simples

Vamos criar uns exemplos bem simples de complexidade ciclomtica e, por serem bem simples, vamos precisar configurar o Credo para identificar o CC delas.

Rode o comando abaixo no terminal para gerar o arquivo de configurao .credo.exs:

$ mix credo gen.config

Agora no arquivo .credo.exs voc pode configurar o max_complexity ao seu gosto (o padro 9). Vamos configurar o credo para aceitar apenas a complexidade 1, assim vai ser mais fcil criarmos exemplos, pois se a complexidade for maior que 1, o credo ir gerar um alerta para refatorao:

{Credo.Check.Refactor.CyclomaticComplexity, [max_complexity: 1]}

Voc pode achar sobre isso na documentao do credo.

Funo de complexidade 1

Image description

Como tem uma nica declarao, fcil ver que sua complexidade ciclomtica 1.

Funo de complexidade 2

Image description

Para a mensagem aparecer dessa forma no seu VSCode instale as extenses Error Lens e Linter.

Image description

Image description

A segunda verso da funo tem uma ramificao. O chamador para a funo pode passar true como o valor para o parmetro say_goodbye, mesmo que o valor padro seja false. Se isso acontecer, a funo imprimir uma mensagem de adeus aps dizer ol. Por outro lado, se o chamador no fornecer um valor para o parmetro ou escolher false, a mensagem de despedida no ser exibida.

Assim, a funo tem duas ramificaes de execuo possveis, o que o mesmo que dizer que ela tem um valor de complexidade ciclomtica de 2.

Funo de complexidade 3

Vamos aumentar a complexidade para 3:

Image description

Agora existem trs ramificaes de execuo possveis.

Reduzindo a CC

Vamos reduzir essa complexidade ciclomtica de 3 para 1. Em Elixir conseguimos fazer isso facilmente:

Image description

Agora no temos mais o alerta do Credo, pois a complexidade ciclomtica agora de 1. Lembrando que o padro do Credo 9, ento no precisamos reduzir sempre para 1, seno no conseguiramos nunca usar uma estrutura de deciso como o case, cond, with.

Problemas futuros

A complexidade ciclomtica no intrinsecamente ruim. Por exemplo, voc pode ter um pedao de cdigo com um valor complexo ciclomtico um tanto alto que super fcil de ler e entender.

No entanto, de modo geral, podemos dizer que ter uma complexidade ciclomtica muito alta um sintoma de problemas com a base de cdigo ou uma causa potencial de problemas futuros. Vamos abordar algumas das razes pelas quais voc deseja reduzi-la com mais detalhes.

Complexidade cognitiva

A complexidade cognitiva refere-se a quo difcil entender um determinado pedao de cdigo. Embora nem sempre seja o caso, a complexidade ciclomtica pode ser um dos fatores que impulsionam a complexidade cognitiva. Quanto maior a complexidade cognitiva de um pedao de cdigo, mais difcil navegar e manter.

Cdigo mais difcil de testar

Valores mais altos de complexidade ciclomtica resultam na necessidade de um nmero maior de casos de teste para testar de forma abrangente um bloco de cdigo por exemplo, uma funo. Portanto, se voc deseja facilitar sua vida ao escrever testes, provavelmente deseja reduzir a complexidade ciclomtica do seu cdigo.

Maior risco de defeitos

provvel que voc introduza defeitos em uma rea da base de cdigo que voc altera muito do que em uma rea onde raramente toca. Alm disso, quanto mais complexo for um determinado trecho de cdigo, maior a probabilidade de voc o interpretar mal e introduzir um defeito nele.

Concluso

Conclumos que a complexidade ciclomtica (CC) nos ajuda a ter um cdigo mais fcil de entender, mais fcil de testar e de dar manuteno; evitando problemas futuros. No precisamos reduzir a CC para 1, mas precisamos ficar atentos a esses fatores.


Original Link: https://dev.to/maiquitome/reduzindo-a-complexidade-ciclomatica-em-elixir-3kf9

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To