Cassic

Padrões de Codificação

Autor: Tadeu Pereira


  Por que usar um padrão de codificação?

  A organização do código fonte facilita os processos de desenvolvimento, retirada de bugs, atividades de validação e manutenção. O uso de um padrão de codificação também aumenta a produtividade num projeto, uma vez que a comunicação dentro da equipe de desenvolvimento fica mais fácil, mas vale ressaltar que partes desses padrões são vistas, algumas vezes, como sugestões por empresas que adotam seus próprios padrões.

  - Comentá;rios: Usamos as chaves - { }- para iniciar e terminar um comentário com mais de uma linha, esse tipo de comentário é comum para se informar dados gerais e específicos de Unit e métodos, vindo no seu inicio. Dentro dos comentários com chaves não devemos usar asteriscos, símbolos ou caracteres especiais. Outro tipo de comentário usado é a barra de data digitada duplamente - // - neste caso o comentário se ressume a uma linha, devendo ser dado um espaço após a segunda barra para começar o texto desejado.

     - Indentação: Ato de separar os níveis de codificação por espaços em branco. No caso da Linguagem Delphi a indentação deve ter dois espaços, não se podendo usar tabulação.

Observação1
     As palavras reservadas program, unit, interface, uses, type, var, implementation, initialization, finalization e end. não podem ser indentadas.
Observação2
     Se desejar indentar várias linhas simultaneamente, selecione-as e em seguida pressione Ctrl+Shift+I que a IDE faz a indentação automaticamente. Caso precise remover uma indentação de um código selecionado pressione Ctrl+Shift+U.

  - Espaços em branco: Os espaços em branco, assim com a linhas, ajudam na legibilidade do código, mas existem as exceções:

   * Entre o método e o parâmetro de abertura:
   procedure CalcularSalario(ID_Funcionario: integer); // Correto
   procedure CalcularSalario (ID_Funcionario: integer); // Incorreto

  * Após um parêntese de abertura ou antes de um parêntese de fechamento:
   procedure CalcularSalario(ID_Funcionario: integer); // Correto
   procedure CalcularSalario( ID_Funcionario: integer); // Incorreto
   procedure CalcularSalario(ID_Funcionario: integer ); // Incorreto
   procedure CalcularSalario( ID_Funcionario: integer ); // Incorreto

  * Após um colchete de abertura ou antes de um colchete de fechamento:
   Valor := Matriz[1] // Correto
   Valor := Matriz[ 1] // Incorreto
   Valor := Matriz[1 ] // Incorreto
   Valor := Matriz[ 1 ] // Incorreto

  * Entre um operador unário(+ ou -) e o seu operando:
   Valor := -1 // Correto
   Valor := - 1 // Incorreto

  * Antes ou depois de um operador ponto( . ):
   Button1.Caption := 'Correto'; // Correto
   Button1. Caption := 'Incorreto'; // Incorreto
   Button1 .Caption := 'Incorreto'; // Incorreto
   Button1 . Caption := 'Incorreto'; // Incorreto

  * Antes de uma virgula:
   Variav1, Variav2: Integer; // Correto
   Variav1 , Variav2: Integer; // Incorreto

  * Antes de dois pontos:
   Variav1, Variav2: Integer; // Correto
   Variav1, Variav2 : Integer; // Incorreto

  * Antes de ponto e virgula:
   Variav1, Variav2: Integer; // Correto
   Variav1, Variav2: Integer ; // Incorreto

  ;- if, for, while, repeat, try, with: Devem estar em mais de uma linha e indentado entre os níveis. Quando houver begin o mesmo deve estar em uma nova linha e o seu end deve estar no mesmo nível.

Exemplos:

if Teste then
     Valor := 10;

if not Teste then
begin
     Valor1 := 10;
     Valor2 := 20;
end;

for I := 0 to ValorFinal do
begin
     Valor[I] := ValorFinal * I;
end;

while Tabela.Eof do
begin
     ShowMessage(Tabela.FieldByName('Nome').AsString);
     Tabela.Next;
end;

repeat
     Inc(Valor);
until Valor > 10;

try
     try
          Tabela.Open;
          Form1.ShowModal;
     finally
          Tabela.Close;
     end;
except
     ShowMessage(‘Localizado um erro’);
end;

with Tabela do
begin
     Append;
     FieldByName('Nome').AsString := 'Tadeu Pereira';
     Post;
end;

     - case: As opções ficam num nível abaixo do case, sendo assim elas devem estar indentadas. Caso seja necessário usar o begin, o mesmo deve ser indentado em consideração a opção. O bloco de comandos deve estar indentado em consideração ao begin.

Exemplos:

case Controle of
     0..9: Valor := Controle * 3;
     10: Valor := Controle * 2;
     else Valor := Controle;
end;

case Objeto.Color of
     clBlack:
          begin
               ShowMessage('A cor á preta');
          end;
     clWhite:
          begin
               ShowMessage('A cor á branca');
          end;
end;

  - Quebras de linha: A linha deve ter no máximo oitenta caracteres, se for ultrapassado esse limite a linha deve ser quebrada. As linhas seguintes devem ser indentadas e quebradas da mesma maneira.
  - Organização de Classes:
  - Quanto aos nÃíveis: Primeiro devem ser feita as declarações em private seguidas pelas feitas em protected, public e published.
  - Quanto a ordenação: Primeiro os campos, seguido pelos métodos e por fim as propriedades.

Convenções de nomenclatura

  As convenções adotas para fazer nomeação na Linguagem Delphi é uma seção a parte, uma vez que o padrão muda de acordo com o que se deseja atribuir o nome.

  - Arquivos: O nome do arquivo deve ser iniciado com letra maiúscula e o restante deve ter letras minúsculas, salvo os casos em que esse nome é composto por mais de uma palavra, nesse caso cada palavra deve iniciar com letra maiúscula acompanhada por letras minúsculas – chamamos esse uso de maiúsculas e minúsculas de camel caps ou infix caps. A extensão do arquivo deve conter apenas letras minúsculas.
  Exemplo: Cadastro.pas – UntPrincipal.dfm – MeuSistema.dpr

  - Classes: A classe deve ser iniciada pela letra T maiúscula acompanhada pelo nome seguindo o padrão infix caps.
  Exemplo: TNovaClasse – TPessoa – TDiario

  - Campos: Semelhante a classe, só que nesse caso devemos trocar a letra T pela letra F tambúm maiúscula.
  Exemplo: FNome – FCidade – FLimiteCompra

  - Métodos: Os métodos devem ter nomes de verbos no imperativo e seguir o padrão de infix caps.
  Exemplo: CalcularSalario(); – GravarNome(); – VerificarLimite();

  - Parâmetros: Também semelhante a classe, e assim como os campos trocamos a letra T, só que nesse caso pela letra A maiúscula. Esse padrúo é uma sugestão que a própria VCL não a segue completamente, sendo usada como opcional.
  Exemplo: NomeMétodo(AParam1, AParam2: Integer; AParam3: string);

  - Variáveis: Deve seguir o padrão Infix caps.

  - Constantes: Assim como as variáveis, as constantes seguem o padrão Infix caps.

  - Tipos enumerados: As iniciais fixas dos valores possíveis dos tipos enumerados devem começar com letras minúsculas, o restante deve seguir o padrão Infix caps.
  Exemplo: TAlignment = (taLeftJustify, taRightJustify, taCenter);