Navegando pela internet em busca de inspiração para mais um post, encontrei numa lista de discussão o seguinte código:

.

Eis então que veio a inspiração. :)

Vemos acima alguns problemas que acabam por dificultar o entendimento e a manutenção do código. Problemas como: a criação de função desnecessária, falta de identação do código, comentários desnecessários, código aberto a bugs, etc.  Então, como diria Jack: vamos por partes.

A função “meses” tem como propósito devolver uma data no formato LongDateFormat, exemplo:

Data 01/01/2011, a função devolve: 01 de Janeiro de 2011

O problema é que não precisamos criar uma função específica para obter o resultado desejado. O próprio Delphi já nos dá isso pronto. Basta utilizar:

FormatDateTime(‘dd “de” mmmm “de” yyyy’) temos: 01 de janeiro de 2011

Se quisermos o dia da semana:

FormatDateTime(‘dddd dd “de” mmmm “de” yyyy’) temos: sábado 01 de janeiro de 2011

Digamos que o Delphi não possuísse tal função e fosse realmente necessário ter uma nos moldes apresentados acima (enfim, termos um desculpa plausível para continuarmos com o nosso artigo :)). Sendo assim, vamos continuar com a refatoração.

A falta de identação do código é algo que notamos logo de início, tornando-o mais difícil de ler. Para corrigir, você pode fazer a identação manualmente ou utilizar meios automáticos para isso, como por exemplo, utilizar o GExperts (www.gexperts.org/), o que é mais recomendável. Com ele instalado na IDE do Delphi, basta utilizar Ctrl+Alt+F e pronto! Lembrando que aqui estou utilizando Delphi 7. Para versões mais novas da IDE não é necessário lançar mão de ferramentas externas, visto que o Delphi já vem com esta função.

Alguns comentários que estão no código são desncessários, como: if mes = 1 then  // se mes for 1 devolve janeiro, e nem tão pouco ter o comentário que descreve o que função faz dentro dela, poluindo o código:

.

Agora que melhoramos a visualização, podemos seguir com a análise.

Olhando para as linhas 10, 11 e 12, verificamos que é um código que pode nos trazer problemas, pois dá margem a erros.  Tudo seria marvilhoso se sempre, em todo computador, a data viesse no formato “dd/mm/yyyy”, não é mesmo?!?. O problema é que nem sempre isso acontece. Pode ser que em determinado cliente o computador esteja com o formato “d/m/yy”. E em outro esteja “m/d/aaaa”. Ou seja, em qualquer uma destas hipóteses, teríamos um erro!

Para corrigir isto, primeiro precisamos mudar a chamada da função. Em vez de:

function meses(data: string): string;

Vamos utilizar:

function Meses(AData: TDateTime): string;

O código também possui um monte de “IFs”, o que é desnecessário. Vamos substituir por case.  Assim, temos:

O Delphi não diferencia maiúsculas e minúsculas, porém para uma boa visualização é aconselhável que inicie os nomes das variáveis com maiúsculas, veja por que:

estaminhavariavel

EstaMinhaVariavel

Percebeu a diferença?

Note que acima fiz isto, ou seja, capitalizei o nome das variáveis (Dia, Mes, Ano, NomeMes).

Para finalizar,  alterei o Result utilizando a função Format.

Temos agora uma boa melhora quando comparamos com a função inicial, mas caso você queira incrementá-la ainda mais, pode tratar possíveis erros com o try except:

{
 Função para retornar o formato "dd de mmmm de yyyy"
 Parâmetro: AData Formato: TDateTime
}
function Meses(AData: TDateTime): string;
var
  Mes, Dia, Ano: Word;
  NomeMes: string;
begin
  try
    DecodeDate(AData, Ano, Mes, Dia);
    case Mes of
      1: NomeMes:= 'Janeiro';
      2: NomeMes:= 'Fevereiro';
      3: NomeMes:= 'Março';
      4: NomeMes:= 'Abril';
      5: NomeMes:= 'Maio';
      6: NomeMes:= 'Junho';
      7: NomeMes:= 'Julho';
      8: NomeMes:= 'Agosto';
      9: NomeMes:= 'Setembro';
      10: NomeMes:= 'Outubro';
      11: NomeMes:= 'Novembro';
      12: NomeMes:= 'Dezembro';
    else
      raise Exception.Create('Data inválida!');
    end;
    Result := Format('%.2d de %s de %d', [Dia, NomeMes, Ano]);
  except
    on E: Exception do
    begin
      Application.ShowException(E);
    end;
  end;
end;

É isso pessoal, espero ter contribuído de alguma forma!

Abraços.

Desenvolvedor de software desde 1995. Em 1998, abriu sua própria empresa, a Lukas Sistemas, desde então passou a atender diversas empresas, principalmente autopeças. Apaixonado por Delphi, porém não o impede de flertar com outras linguagens sempre que possível. Mora na cidade de Balsas/MA com sua esposa e dois filhos.

5 thoughts on “Algumas boas práticas de programação”

  1. Mas é o tal négocio. Pra que facilitar se pode complicar né????? Reinventar a roda hoje em dia é o que há de melhor no mundo da programação.

    Se o Delphi já te dá isso mastigado através da FormatDateTime() pra que que ce vai montar função (com código tosco e mal estruturado) pra fazer a mesma coisa?

  2. Boa tarde
    Estive olhando o código, o que me diz de uma upgrade nele:

    {
    Função para retornar o formato “dd de mmmm de yyyy”
    Parâmetro: AData Formato: TDateTime
    }
    function Meses(AData: TDateTime): string;
    var
    Mes, Dia, Ano: Word;
    NomeMes: string;
    cNomeMes : array[1..12] of string = (‘Janeiro’,’Fevereiro’,’Março’,
    ‘Abril’,’Maio’,’Junho’,’Julho’,’Agosto’,’Setembro’,’Outubro’,’Novembro’,’Dezembro’);
    begin
    try
    DecodeDate(AData, Ano, Mes, Dia);
    if not(Mes in [1..12]) then
    raise Exception.Create(‘Data inválida!’);
    NomeMes := cNomeMes[Mes];
    Result := Format(‘%.2d de %s de %d’, [Dia, NomeMes, Ano]);
    except
    on E: Exception do
    begin
    Application.ShowException(E);
    end;
    end;
    end;

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.