Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

métodosMuitas vezes são vistos códigos extremamente complexos e extensos, e por este motivo acima de tudo, este código deve ser o mais limpo possível e o ajudará a economizar recursos, tempo, dinheiro, manutenção. Por este motivo abaixo estão algumas dicas para uma codificação limpa.

1 - Resultados de condições booleanas

Um erro muito comum nas codificações envolve as condições booleanas para atribuir resultados, veja o exemplo abaixo:

Code Block
languagepas
if ValorTempo > 0 then  
  result := True
else  
  result := False;

Este código pode ser substituído por apenas uma linha, facilitando até mesmo a interpretação da regra:

Code Block
languagepas
result := ValorTempo > 0;

2 - Negando a negação

Seja cauteloso no código para evitar condições que neguem negações:

Code Block
languagepas
if not VerificarClienteNaoEstaAtivo then

Ao ler este código, pensamos: “Espere aí… se a função avalia se o cliente não está ativo, mas tem um not… então a condição verifica se ele está ativo?!”. Sim! E se este é o caso, vale muito a pena reescrevê-la:

Code Block
languagepas
if VerificarClienteEstaAtivo then

3 - Concatenação de strings

É comum encontramos códigos como esse:

Code Block
languagepas
Texto := 'Há ' + IntToStr(DataSet.RecordCount) +   
         'registros encontrados com o termo ' + QuotedStr(Edit1.Text) + '.';

Observe que há 4 operadores de adição (+) utilizados para concatenar o texto, dificultando a visualização do texto como um todo. Na verdade, essa dificuldade é exponencial. Quanto mais operadores existirem, mais difícil será a visualização.

Para evitar o uso demasiado deste operador, basta recorrer à função Format que é nativa do compilador e que permite declarar um texto com parâmetros e preenchê-los em um array:

Code Block
languagepas
Texto := Format('Há %d registros encontrados com o termo %s.',  
                [DataSet.RecordCount, QuotedStr(Edit1.Text]);

4 - Incrementar/Decrementar valores

Podemos incrementar ou decrementar uma variável dessa forma:

Code Block
languagepas
Contador := Contador + 1;
Contador := Contador - 1;

Contudo, considere a utilização das funções Inc e Dec, presentes no Delphi desde suas primeiras versões:

Code Block
languagepas
Inc(Contador);
Dec(Contador);

5 - Condições if aninhadas

Algumas vezes tende-se a trabalhar sempre com resultados verdadeiros em condições if.

Code Block
languagepas
if DocumentoEstaPreenchido then
begin  
  if ConfirmarEnvioDocumento then  
  begin    
    if ValidarConfiguracoesEmail then    
    begin      
      EnviarEmailComDocumento;    
    end;  
  end;
end;

Essas condições aninhadas exigem a construção de uma “sequência lógica” em nossa memória para que possamos acompanhar o fluxo de execução. Entretanto, em certo ponto, naturalmente nos perdemos em meio à tantas condições, que se agravam ainda mais quando há fluxos alternativos (else).

Para “limpar” este código, pode-se empregar condições de guarda com instruções de saída do método:

Code Block
languagepas
if not DocumentoEstaPreenchido then  
  Exit;  

if not ConfirmarEnvioDocumento then  
  Exit;  

if not ValidarConfiguracoesEmail then  
  Exit;  

EnviarEmailComDocumento;

6 - Chamadas repetidas com longos namespaces

Já encontrei códigos parecidos com este:

Code Block
languagepas
Self.Controller.Servico.Regras.Funcoes.AtualizarPagamentos; 

if Self.Controller.Servico.Regras.Funcoes.ExistemPendencias then  
  Self.Controller.Servico.Regras.Funcoes.NotificarPendencias;

Para a leitura, é muito mais cômodo atribuir parte dos namespaces à uma variável e utilizá-la nas instruções seguintes:

Code Block
languagepas
var  
  Funcoes: TFuncoes;
begin  
  Funcoes := Self.Controller.Servico.Regras.Funcoes;    
  Funcoes.AtualizarPagamentos;   
  
  if Funcoes.ExistemPendencias then    
    Funcoes.NotificarPendencias;

7 - Tipos de dados inadequados

Cada tipo de dado usa uma porção de espaço na memória. Por exemplo, o tipo integer ocupa 4 bytes devido à sua dimensão, que pode atingir um valor de até pouco mais de 2 bilhões. Pensando assim, será que faz sentido criar uma variável que se refere a um dia do mês como integer?

Code Block
languagepas
var  Dia: integer;

Sabe-se que o valor máximo para o dia do mês é 31, então se o tipo integer passa de 2 bilhões, o espaço total alocado na memória jamais será utilizado. Então a recomendação é que seja substituído o integer pelo byte.

Note

Atualmente os computadores possuem alta capacidade de memória e que detalhes como este do tipo ideal de dados podem ser ignorados. Porém, lembre-se que a sua aplicação declara, preenche e acessa variáveis a todo momento, incontáveis vezes por dia.

Então, quanto menos memória uma aplicação exige durante a sua execução, melhor será o aproveitamento de recursos do sistema operacional para outras tarefas e diminuíra a chance de Overflow, travamentos e Out of Memory em determinado momento, dependendo do uso.

Info

Para mais informações sobre o limite de valores de cada tipo, acesse https://docwiki.embarcadero.com/RADStudio/Sydney/en/Simple_Types_(Delphi)#Integer_Types