segunda-feira, 17 de dezembro de 2012

Então você quer programar em Java?

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!

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:
Data no formato Japonês: 2012年12月13日
Data no formato Português (Portugal): Quinta-feira, 13 de Dezembro de 2012

Vejam só que bacana! E não é que a coisa funciona mesmo? Prometo odiar menos as queridas classes básicas da API do Java :)
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.