Verificando a toxidade do seu código escrito em Delphi
Muitas vezes quando começamos a programar, saímos escrevendo códigos que nem louco, querendo que algo aconteça de uma forma ou de outra. A medida que o tempo passa, voltamos a rever estes códigos, e ai, já com mais calma, percebemos que tem muita coisa que precisa ser melhorada.
Atualmente a busca pela escrita de bons códigos passou a ser fundamental. Não basta mas fazer com que o programa execute uma tarefa. Essa tarefa tem que ser executada com qualidade. Qualidade que começa com nós programadores, quando começamos a escrever os primeiros bytes de uma aplicação.
Method Toxicity Metrics
Mas o que diz que um programa é toxico? Como medir a toxidade de um software? O que isso pode influenciar na minha aplicação? Em resposta a todas essas dúvidas e com base a diversos estudos relacionados ao Clean Code, a Embarcadero criou um recurso denominado de Method Toxicity Metrics disponibilizado dentro do RAD Studio em Project > Method Toxicity Metrics.
Basicamente, este menu vai levar você a uma tela que lista todas as funções ativas da sua aplicação, levando em consideração as principais métricas disseminadas pelos maiores nomes do mundo do Clean Code.
Observação: você pode clicar duas vezes em qualquer método na lista para abrir sua implementação.
Métricas
Como podemos ver na imagem acima, cada função é avaliada em quatro pilares, chegando a um valor de toxidade do código em questão. Abaixo vamos ver como funciona cada um dos pilares:
- Length: Responsável por indicar o número de instruções contidas no método. Quanto maior o número, mais extenso seu código é, e seguindo as boas práticas do Clean Code, ele precisa ser quebrado em outras pequenas partes. Códigos extensos de mais, indica que está fazendo mais coisas do que deveria fazer, ferindo o princípio de responsabilidade única do SOLID;
function TFrmMain.MethodLength: Boolean;
var
LNumero1, LNumero2: Integer;
begin
LNumero1 := 20;
LNumero2 := 0;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
LNumero2 := LNumero2 + 1;
Result := LNumero1 = LNumero2;
end;
- Parameters: refere-se a quantidade parâmetros na declaração do método.
procedure MethodParameters(const A1,A2,A3,A4,A5,A6,A7: Integer);
- If Depth: Indica a profundidade máxima de instruções if aninhadas dentro do método. Quanto mais ifs aninhados, mais complexo seu código se torna para leitura e cobertura de testes.
procedure TFrmMain.MethodIfDepth;
begin
if 1 = 1 then
begin
if 2 = 2 then
begin
if 3 = 3 then
begin
if 4 = 4 then
begin
if 5 = 5 then
begin
if 6 = 6 then
begin
ShowMessage('Bad...');
end;
end;
end;
end;
end;
end;
end;
- Cyclomatic Complexity: Responsável por indicar o número mínimo de testes que devem ser executados para garantir que todas as linhas de código no método sejam testadas. Obs: o Cyclomatic Complexity indica o número mínimo de testes e não o número máximo.
function TFrmMain.MethodCiclomaticComplexity: Integer;
begin
case 1 of
1:
Result := 1;
2:
Result := 2;
3:
Result := 3;
4:
Result := 4;
5:
Result := 5;
6:
Result := 6;
7:
Result := 7;
8:
Result := 8;
9:
Result := 9;
10:
Result := 10;
end;
end;
- Toxicity: Calculo realizado com base em todas as métricas apresentadas acima para criar um valor único de quão tóxico o método é.
Configurando as métricas
Caso você deseja configurar as métricas de acordo com o seu ponto de vista, isso também é possível, bastando acessar o menu Tools > Options > Language > Toxicity Metrics e alterar os respectivos valores.
Um pouco de reflexão
“ Qualquer um consegue escrever código que um computador entende. Bons programadores escrevem código que humanos entendem” — Martin Fowler
Código fonte: GitHub
Referências: Quão tóxico é o seu código?, Method Toxicity Metrics e Clean Code: O que é? Porque usar?