Verificando a toxidade do seu código escrito em Delphi

Vinicius Sanchez
4 min readJun 2, 2021

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

--

--

Vinicius Sanchez

Embarcadero MVP | Certified Delphi Developer | SFC | SFPC | KIKF | Graduated in Information Systems and Studying Software Architecture