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:
[sourcecode language=”delphi”]
{
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;
[/sourcecode]
É isso pessoal, espero ter contribuído de alguma forma!
Abraços.
cara, vc e bom demais, obrigado,mas estou querendo passar minas aplicações delphi 7 para xe2…
Parabéns, seu artigo me ajudou muito.
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?
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;
Ok, muito bom mesmo!