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 |
---|
|
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 |
---|
|
result := ValorTempo > 0; |
2 - Negando a negação
Seja cauteloso no código para evitar condições que neguem negações:
Code Block |
---|
|
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 |
---|
|
if VerificarClienteEstaAtivo then |
3 - Concatenação de strings
É comum encontramos códigos como esse:
Code Block |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
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. |