Boa noite!
Hoje venho falar de um assunto muito importante mas que passa despercebido pela maioria dos programadores Java (até mesmo os mais experientes!).
Todos sabemos que é um saco encontrar um código bagunçado e mal formatado, com vários "if's" infinitamente aninhados, laços mal identados e variáveis com nomes ridiculamente estranhos. E poderia ficar aqui acrescentando tudo de ruim que poderemos encontrar em um código mal formatado e fora dos PADRÕES.
Bom, mas o que esse cara tá falando? Você que se considera um programador Java de verdade, com certeza já sabe. As Convenções de Código em Java estão aí para nos dizer qual é o melhor caminho para formatarmos o nosso código, desde declaração de variáveis até nome de métodos. Você sabe, tudo que segue um padrão é mais fácil e rápido de olhar e dar manutenção.
Vejamos dois fragmentos de código, que por mais que sejam simples, dão uma diferença tremenda quando estamos falando de duzentas ou quinhentas linhas:
if (a == b && c == d) // EVITAR!
if ((a == b) && (c == d)) // CORRETO
Segundo a documentação, é uma boa prática usar parênteses em operações que envolvem vários operadores para evitarmos problemas de precedência, mesmo que a precedência esteja clara para VOCÊ, pode não parecer tão clara assim para as outras pessoas - Java Code Conventions, 10.5 Miscellaneous Practices.
Além desse exemplo simples, as convenções de código em Java nos mostram como devemos programar a nossa API para que terceiros possam fazer uso dela. Você já viu como é intuitivo achar os métodos das classes em Java? Pois elas seguem exatamente esse padrão. E nada melhor do que seguir a recomendação que os próprios CRIADORES da linguagem elaboraram.
Pense nisso, um código limpo e fácil de entender significa qualidade!
Por hoje é só pessoal, um abraço e até a próxima!
segunda-feira, 17 de dezembro de 2012
quinta-feira, 13 de dezembro de 2012
Por que é tão difícil manipular esses benditos objetos?
Boa noite galera!
Estou estreando meu humilde blog com o objetivo de colocar algumas dicas e problemas cotidianos na vida deste simples programador (se você está procurando um blog de auto ajuda ou desabafos, aqui não é o seu lugar).
Para começar com o pé direito (ou não), resolvi dedicar este primeiro POST à incrível dificuldade em se trabalhar com datas, seja em qualquer âmbito, bancos de dados, linguagens de programação e por aí vai.
Como sou entusiasta Java e já sofri (muito) com esses malditos objetos de data, hoje tirei a noite para desvendá-los de vez e quem sabe diminuir meu ódio por eles. E sabe que funcionou?
Não falando ainda de API de terceiros para manipular datas, se olharmos com carinho para a API nativa do Java para trabalhar como tal, temos as seguintes classes:
- java.util.Date: Representa uma data e hora/mutáveis, ou seja, poderemos criar um objeto date simplesmente desta forma: Date data = new Date() e posteriormente realizar operações na data obtida (porém com outros objetos que serão listados a seguir);
- java.util.Calendar: Esta poderosa classe nos permite diversas operações com data, desde acrescentar meses, dias, etc, até descobrirmos em que dia da semana será 22/01/2030;
- java.text.DateFormat: Esta classe é usada para nos ajudar com a formatação de datas para todos os locais do mundo, ou seja, dependendo do local que a sua aplicação tiver rodando, poderá apresentar a data de acordo com o local;
- java.util.Locale: É a classe que permite trabalhar com todos os locais do mundo. Ela é utilizada em conjunto com Calendar e DateFormat. Podemos especificar por exemplo, que estamos trabalhando com formato de data/hora do Japão (mais sobre isso a seguir).
Aqui vai um pequeno trecho de código que mostra o que já foi falado:
//Criando dois Locale's: um para o Japão e um para Portugal
Locale locJapan = new Locale("ja", "JP");
Locale locPortuguese = new Locale("pt","PT");
//Criando dois Calendar passando os locais especificados
Calendar dataJapao = Calendar.getInstance(locJapan);
Calendar dataPortugal = Calendar.getInstance(locPortuguese);
//transformando os objetos Calendar em Date para que possamos formatá-los e apresentá-los na tela
Date dataJapaoEmDate = dataJapao.getTime();
Date dataPortugalEmDate = dataPortugal.getTime();
//aqui utilizamos o objeto DateFormat para especificarmos o formato desejado e o local
DateFormat dfJapao = DateFormat.getDateInstance(DateFormat.FULL,locJapan);
DateFormat dfPortugal = DateFormat.getDateInstance(DateFormat.FULL, locPortuguese);
//Obtendo um String com as datas formatadas
String dataFormatadaJapao = dfJapao.format(dataJapaoEmDate);
String dataFormatadaPortugal = dfPortugal.format(dataPortugalEmDate);
System.out.println("Data no formato Japonês: " + dataFormatadaJapao.toString());
System.out.println("Data no formato Português (Portugal): " + dataFormatadaPortugal.toString());
O resultado dessa "bagunça" é a seguinte:
//Criando dois Locale's: um para o Japão e um para Portugal
Locale locJapan = new Locale("ja", "JP");
Locale locPortuguese = new Locale("pt","PT");
//Criando dois Calendar passando os locais especificados
Calendar dataJapao = Calendar.getInstance(locJapan);
Calendar dataPortugal = Calendar.getInstance(locPortuguese);
//transformando os objetos Calendar em Date para que possamos formatá-los e apresentá-los na tela
Date dataJapaoEmDate = dataJapao.getTime();
Date dataPortugalEmDate = dataPortugal.getTime();
//aqui utilizamos o objeto DateFormat para especificarmos o formato desejado e o local
DateFormat dfJapao = DateFormat.getDateInstance(DateFormat.FULL,locJapan);
DateFormat dfPortugal = DateFormat.getDateInstance(DateFormat.FULL, locPortuguese);
//Obtendo um String com as datas formatadas
String dataFormatadaJapao = dfJapao.format(dataJapaoEmDate);
String dataFormatadaPortugal = dfPortugal.format(dataPortugalEmDate);
System.out.println("Data no formato Japonês: " + dataFormatadaJapao.toString());
System.out.println("Data no formato Português (Portugal): " + dataFormatadaPortugal.toString());
O resultado dessa "bagunça" é a seguinte:
Data no formato Japonês: 2012年12月13日
Data no formato Português (Portugal): Quinta-feira, 13 de Dezembro de 2012
Porém, fui muito superficial ao explicar o código. Como eu sei que havia um tal de DateFormat.FULL, ou ainda, como eu sei os códigos passados no construtor de Locale para o Japão e Portugal?
Bom, quanto a primeira pergunta, a classe DateFormat possui várias constantes que nos permitem escolher o formato desejado. Elas representam inteiros e o nome delas fica bem fácil de usar. No exemplo acima, foi utilizado FULL porque desejei a data no seu formato completo (dia, mês e ano - não necessariamente nessa ordem, vai variar de acordo com o local). Quanto a segunda pergunta, há referências na Internet para sabermos quais códigos podemos passar para o Locale, sendo lista de linguagens e lista e código de países.
Mas nem tudo são flores. Quem já precisou fazer operações de verdade com datas (saber a diferença de um período ou de horas) sabe que é praticamente impossível trabalhar com a API nativa do Java. Mas calma, há uma solução muito elegante e funciona que é uma beleza, a Joda Time - Java date and time API que permite fazer DIVERSAS operações complexas com datas e horas!
Bom, o exemplo mostra que se lermos com carinho a documentação (de verdade) podemos sim "fazer miséria" com datas.
Por hoje é só, obrigado e até a próxima.
Assinar:
Postagens (Atom)