Mudanças entre as edições de "Boas práticas de programação Delphi"

De UniWiki
Ir para: navegação, pesquisa
Linha 78: Linha 78:
 
Utilizar uma query, instanciada antes do loop de interação com o banco, a SQL também fica fora.
 
Utilizar uma query, instanciada antes do loop de interação com o banco, a SQL também fica fora.
 
Chamar somente os GraveParametro() vai ganhar desempenho ao usuário;
 
Chamar somente os GraveParametro() vai ganhar desempenho ao usuário;
 +
 +
==== Try ... except ... raise ====
 +
Em um bloco "try... except on e: Exception" não utilizar raise e!!! Ao invés disso usar só raise; senão a exceção é passada adiante com a mensagem em branco.
 +
 +
Exemplo errado:
 +
try
 +
  ...
 +
except
 +
  on e: Exception do begin
 +
    ...
 +
    raise e;
 +
  end;
 +
end;
 +
 +
Exemplo correto:
 +
try
 +
  ...
 +
except
 +
  on e: Exception do begin
 +
    ...
 +
    raise;
 +
  end;
 +
end;
 +
 +
Outro exemplo correto:
 +
try
 +
  ...
 +
except
 +
  on e: Exception do begin
 +
    ...
 +
    raise Exception.Create('mensagem '+e.message);
 +
  end;
 +
end;

Edição das 10h16min de 26 de março de 2013

Blocos

Utilizar o begin na mesma linha do início do bloco. Ex:

if condição then begin
  bloco de comandos;
end;
while condição do begin
  bloco de comandos;
end;

Utilizar begin e end mesmo que o bloco de comandos seja composto de uma única linha.

Não utilizar o bloco de comandos na mesma linha do if, while, etc... (Motivo foge da padronização e dificulta o debug) Ex:

if condição then comando;

Conversões

Sempre fazer conversões seguras.

StrToInt(uma string)

garantir que a string contenha um número válido, ou tratar a exceção.

De preferência utilizar funções que já fazem este tratamento:

  • Fun_Convert.SafeStrToInt
  • Fun_Convert.SafeStrToDateTime
  • Fun_Convert.DateTimeToSTR
  • Fun_Convert.StrFloatAcert
  • Fun_Convert.SafeStrToFloat

Usar os TUQuery.AsString(), TUQuery.AsInteger(), etc.. ao invés de TUQuery.FieldByName().AsString ou TUQuery[]

Variants

Evitar ao máximo o uso de variants. Se utilizar, quando for converter o conteúdo sempre tratar possíveis erros de conversão.

Usar IfNull nas strings. Se for conversão para inteiro, data, float, garantir que o dado é válido ou tratar exceção.

O tipo Variant do Delphi quando recebe um tipo ponto flutuante ele trunca em 5 decimais!!!!!!!!

Função Vazio

NÃO usar a função Vazio para Tipos que não são Variant. Ex: TDateTime não funciona e tem mais uma lista de tipos que não funcionam com a função Vazio. Para inteiro e string funciona.

Criação de objetos

Sempre que criar um objeto garantir a destruição dele com try ... finally.

Transações

Sempre que abrir uma transação garantir que ela será comitada ou dado rollback com try ... except.

Tratamento de exceções

Tratar todas as exceções possíveis com try ... except. Se a exceção não foi totalmente tratada, ao capturá-la fazer o tratamento parcial e dar raise; (jogar a exceção adiante)

Carga de configurações da ConfigSis

Sempre carregar parâmetros do sistema na carga da tela e não ficar carregando sob demanda depois. Evitar principalmente esta carga dentro de loops o que além de correr o risco da configuração mudar no meio do caminho (gerando um bug) estará degradando o desempenho.

Cálculos com divisão

Sempre que tiver um cálculo de divisão no código tem que ter um if o divisor for zero não faça a conta.

Reanálise

Sempre que alguma situação não foi prevista na análise, analisar o que precisa em conjunto. Não tentar decidir sozinho.

Campo novo no banco

  1. Sempre que possível criar uma foreign key para garantir a integridade do banco. Se não criar a FK tem que criar o índice.
  2. Sempre documentar o campo no banco
  3. Sempre considerar a necessidade de popular com algum valor este campo nos registros já existentes.
  4. Sempre considerar a necessidade de criar um índice para o campo.

Componentes sem função

Uma tela que tem um componente que não é utilizado, excluí-lo da tela. Se não puder, tornar o componente invisível ao invés de deixá-lo desabilitado e aparecendo. Ex: Botões de alterar em telas de seleção, quando é uma tela que não tem alteração.

Componente Combo

Usar o Style csOwnerDrawFixed quando for um combo da biblioteca.

Se não for da biblioteca por padrão usar csDropDownList.

Interação massiva no banco

(ex: Gravar xxxxx registros no banco) Utilizar uma query, instanciada antes do loop de interação com o banco, a SQL também fica fora. Chamar somente os GraveParametro() vai ganhar desempenho ao usuário;

Try ... except ... raise

Em um bloco "try... except on e: Exception" não utilizar raise e!!! Ao invés disso usar só raise; senão a exceção é passada adiante com a mensagem em branco.

Exemplo errado:

try
  ...
except
  on e: Exception do begin
    ...
    raise e;
  end;
end;

Exemplo correto:

try
  ...
except
  on e: Exception do begin
    ...
    raise;
  end;
end;

Outro exemplo correto:

try
  ...
except
  on e: Exception do begin
    ...
    raise Exception.Create('mensagem '+e.message);
  end;
end;