Robo 3T – Ferramenta Gráfica para o MongoDB

Estou praticamente no início de minha jornada com o MongoDB, mas a cada dia que passa me sinto mais satisfeito em trabalhar com ele.

Além de usar o MongoDB diretamente no console, tenho trabalhado mais diretamente com o desenvolvimento Java + MongoDB através do Java Driver.

Até então não tinha procurado por nenhuma ferramenta gráfica para trabalhar com o MongoDB, mas hoje descobri o Robo 3T, antigo (e conhecido) Robomongo. Trata-se de uma ferramenta gratuita para se trabalhar com o MongoDB de forma gráfica.

Admito que não conhecia nenhum dos dois, mas a julgar pela comunidade do Robomongo trata-se de uma ferramenta bem popular, adquirida recentemente pela 3T Software Labs, desenvolvedora do Studio 3T, antigo MongoChef.

Para maiores detalhes sobre as funcionalidades acesse a página do projeto. A seguir mostro uma rápida visão da instalação e uso da ferramenta para criar uma primeira conexão e consulta a coleções.

Acesse a página de downloads do projeto e baixe o pacote para seu sistema operacional. No meu caso estou usando o Linux Mint.

Depois de feito o download descompacte o arquivo e acesse o diretório bin, executando o arquivo robo3t. A primeira tela solicitará a criação de uma conexão:

robo3t-1.png

Para uma instalação padrão em sua máquina local, o padrão será o suficiente:

robo3t-2.png

Ao salvar a conexão criada e fazer a conexão será possível visualizar todos os bancos de dados e suas coleções:

robo3t-4.png

E é claro, é possível realizar as operações básicas, e visualizar as estatísticas dos bancos e das coleções:

robo3t-5.png robo3t-6.png

robo3t-7.png

Por hora é isso galera, dica dada!

Eu por aqui vou explorar mais a ferramenta e o próprio MongoDB, e em breve pretendo postar exemplos de desenvolvimento Java com o MongoDB.

 

Abraços!

 

Anúncios

MongoDB: Instalação no Linux

Há algum tempo atrás me interessei pelo MongoDB e resolvi estudá-lo um pouco mais. Fiz um treinamento gratuito disponível no próprio site do fornecedor, e tenho desenvolvido algumas coisas com ele desde então.

Para quem decidir estudar e desenvolver com o MongoDB eu recomendo fortemente, pois apesar de ser uma abordagem totalmente diferente da relacional, à qual estamos mais acostumados, é muito simples de entender e bem satisfatório de usar.

A intenção deste post não é fazer uma introdução ao MongoDB (sugiro, para quem se vira um pouco com o inglês, fazer o curso oferecido pelo site oficial do produto), mas deixar um rápido passo-a-passo de como instalar o MongoDB em um sistema Linux e instalar os driver para algumas linguagens.

Os comandos de instalação abaixo foram os que utilizei com sucesso em minha distribuição Linux (Mint 17.3).

 

Instalação do MongoDB

 

1) Importar a chave pública usada pelo sistema gerenciador de pacotes:

$ sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv EA312927

2) Criar um list file para o MongoDB:

$ echo “deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse” | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

3) Atualizar informações dos pacotes:

$ sudo apt-get update

4) Instalar o MongoDB

$ sudo apt-get install -y mongodb-org

Depois de finalizada a instalação, execute o comando abaixo para verificar a versão do MongoDB instalada:

$ mongo –version

img-1

Para inicializar o MongoDB, execute o comando abaixo:

$ sudo service mongod start

img-2

A instância do MongoDB armazena seus arquivos de dados no diretório /var/lib/mongodb, e seus arquivos de logs no diretório /var/log/mongodb por padrão, e executa com a conta de usuário mongodb. Se necessário é possível alterar os diretórios de log e dados no arquivo /etc/mongod.conf.

A verificação de que o processo mongod iniciou com sucesso pode ser feita através do arquivo de log /var/log/mongodb/mongod.log, com uma linha como esta:

[initandlisten] waiting for connections on port <port> (where <port> is the port configured in /etc/mongod.conf, 27017 by default)

Para parar ou reiniciar o serviço do MongoDB use os comandos abaixo:

$ sudo service mongod stop

img-3

$ sudo service mongod restart

img-4

Para iniciar o console do MongoDB digite o comando abaixo:

$ mongo

img-5.png

> show dbs

img-6

Para sair do console do MongoDB basta digitar CTRL+C.

Para a instalação em outras distribuições ou sistemas operacionais, você pode consultar as instruções no site do projeto.

 

Instalação do Driver para Python

A instalação do driver do MongoDB para Python pode ser feita através do pip, com o comando abaixo:

$ sudo pip install pymongo

Caso não tenha ainda o pip instalado, execute o comando abaixo para instalá-lo:

$ sudo apt-get install python-pip

 

Instalação do Driver para PHP

A instalação do driver do MongoDB para PHP pode ser feita através do pecl, com o comando abaixo:

$ sudo pecl install mongo

Caso não tenha o pecl instalado, execute os comandos abaixo para a instalação:

$ sudo apt-get install php5-dev

$ sudo apt-get install php-pear

Depois de instalado o driver é necessário habilitar a extensão do MongoDB para o PHP, incluindo no arquivo php.ini a seguinte linha, na seção de extensões:

extension=mongo.so

O arquivo php.ini costuma estar no seguinte local:

/etc/php5/apache2/php.ini

Depois de salvar a alteração, reinicie o apache:

sudo /etc/init.d/apache2 restart

Depois disso você pode criar um arquivo chamado info.php com o conteúdo abaixo, e incluí-lo no seu diretório de publicação do apache:

<?php phpinfo(); ?>

Depois, ao acessar o arquivo, deve ser possível encontrar uma seção relacionada ao MongoDB:

img-10.png

 

Instalação do Driver para Java

Para o desenvolvimento em Java, supondo que você esteja usando o Maven, basta adicionar a dependência ao seu pom.xml:

img-9

 

Por hora é isto!

Em breve pretendo publicar posts com exemplos de utilização do MongoDB nestas linguagens, e algumas outras dicas conforme os estudos avançarem.

 

Abraços!

 

 

 

 

Habilitando o Módulo de Mensageria no JBoss 7

Se você já tentou utilizar recursos de mensageria (API JMS) no JBoss 7, deve ter percebido que este módulo não está habilitado na configuração padrão. Ao executar o servidor em sua configuração standalone e observar o console web de administração não encontraremos nenhuma referência a recursos como filas e tópicos:

 

jboss7_messaging1

 

A primeira vista isto pode ser estranho, pois em versões anteriores do servidor este serviço estava disponível na configuração padrão (default), mas o comportamento é realmente diferente no JBoss 7. Neste pequeno post vamos ver como habilitar este módulo para que seja possível utilizar o JBoss 7, através do serviço HornetQ, como um provedor JMS. Estarei utilizando a versão 7.1.2 do JBoss 7 nos exemplos.

 

Mãos a Obra

Ao executarmos o JBoss 7 em sua configuração standalone, através do arquivo de inicialização jboss-as-7.1.2.Final\bin\standalone.bat (para Windows, ou standalone.sh para linux), a configuração utilizada é a do arquivo jboss-as-7.1.2.Final\standalone\configuration\standalone.xml. Isto pode ser constatado através do arquivo de configurações de inicialização jboss-as-7.1.2.Final\bin\standalone.conf.bat (para Windows, ou jboss-as-7.1.2.Final\bin\standalone.conf para linux), que é utilizado pelo arquivo de inicialização. Nele encontraremos a seguinte linha indicando o arquivo de configurações do servidor utilizado por padrão:

jboss7_messaging2

No arquivo standalone.xml estão as configurações dos serviços (ou módulos) disponibilizados pelo servidor, e nele não encontraremos referências aos serviços de mensageria. Por outro lado, o arquivo standalone-full.xml possui alguns serviços a mais, dentre eles o serviço de mensageria.

Então, para habilitar o serviço de mensageria, temos duas opções: 1) copiar do arquivo standalone-full.xml os trechos de configuração referentes à mensageria e replicar no arquivo standalone.xml; 2) referenciar o arquivo standalone-full.xml no arquivo jboss-as-7.1.2.Final\bin\standalone.conf.bat. Se você possuir restrições quanto aos outros módulos habilitados no arquivo standalone-full.xml, além do serviço de mensagem, escolha a primeira opção.  No entanto se a habilitação de todos os módulos não for um problema escolha a segunda opção. É esta que escolherei. No final, o mesmo trecho de configuração do arquivo jboss-as-7.1.2.Final\bin\standalone.conf.bat estará assim:

jboss7_messaging3

Se agora observarmos o console web de administração encontraremos referências ao serviço de mensageria:

jboss7_messaging4

Incluindo Destinos Personalizados

Se observarmos as configurações de destinos (menu JMS Destinations) não encontraremos nenhum destino (fila ou tópico) previamente configurado:

jboss7_messaging5

Para o modo standalone de execução podemos incluir novos destinos JMS através do arquivo de configurações standalone-full.xml, que estamos utilizando (ou do arquivo standalone.xml, caso você tenha optado pela primeira forma de configuração ).

Inclua o seguinte trecho de código no arquivo de configurações, entre as tags <hornetq-server>…</hornetq-server>:

jboss7_messaging6

No exemplo acima foram incluídos uma fila (queue) e um tópico (topic). Se agora reiniciarmos o servidor e observarmos o console web de administração encontraremos as referências a estes destinos, que poderão ser utilizados para troca de mensagens:

jboss7_messaging7

É isto! Num próximo post vou mostrar como fazer conexões JMS com o servidor a partir de uma aplicação desktop.

Configurando o JBoss Tools 3.3.1 no Eclipse Indigo

Bem, depois de tanto tempo volto a me dedicar um pouco ao blog. Já faz realmente muito tempo desde que escrevi o último artigo.

Pretendo voltar à ativa por aqui com vários assuntos, muitos dos quais já de conhecimento de muitos desenvolvedores, mas procurando dar uma visão diferente e mais prática, como sempre tenho procurado fazer.

Bom, este post trata de um assunto que já foi tema de outros posts. No post Preparando um Ambiente de Desenvolvimento Java EE Baseado em Eclipse eu demonstrei como preparar um ambiente de desenvolvimento baseado no Eclipse utilizando os principais plugins. Já no post Adicionando Servidor de Aplicações JBoss ao Eclipse eu mostrei como adicionar o servidor de aplicações JBoss ao Eclipse, para facilitar o desenvolvimento das aplicações e controle do servidor através da IDE.

No entanto, mesmo que esta seja uma tarefa trivial para quem já desenvolve a um certo tempo, e para muitos nem mereça um post, para muitas pessoas esta não é uma tarefa tão simples e intuitiva. Prova disso são as experiências que tenho como professor em um curso de especialização em Java, onde muitas vezes os alunos não sabem sequer como configurar o workspace adequadamente com uma JDK.

Pensando nisto, e principalmente em meus atuais e futuros alunos, é que me disponho a postar coisas simples como esta, que são de grande ajuda para quem está começando.

Neste post não vou mostrar toda a configuração de um ambiente do ZERO novamente; para isto você pode consultar o post citado anteriormente, fazendo as devidas ressalvas com relação à versão da IDE e dos plugins.

O que vou mostrar aqui é algo mais direto: como instalar uma versão adequada do JBoss Tools ao Eclipse Indigo. Para isto vou assumir que você já tenha o Eclipse Indigo instalado, e se não tem você pode baixá-lo a partir do site http://www.eclipse.org/downloads/. Eu recomendo que você baixe a versão Eclipse IDE for Java EE Developers, que já traz alguns plugins voltados ao desenvolvimento JEE. Escolha a versão adequada para seu sistema operacional e, após efetuar o download, descompacte o arquivo em seu local de escolha.

Uma vez instalado, inicie o Eclipse:

Uma vez inicializado o Eclipse, é importante escolher a perspectiva Java EE para se trabalhar com o desenvolvimento JEE, e principalmente para facilitar a configuração de um servidor de aplicações. Se você selecionou, na inicialização, um workspace novo, o IDE terá a seguinte aparência (provavelmente):

Repare que, no canto superior direito a perspectiva Java EE está selecionada, e na parte inferior a aba de servidores está selecionada.

Se quisermos, por exemplo, adicionar o servidor de aplicações JBoss 6.1 em novo ambiente, podemos clicar no link “new server wizard”. Ao fazer isso um wizard será apresentado, e nele podemos observar que a opção de adicionar o JBoss 6.1 não está disponível:

Se clicarmos no link “Download additional server adapters”, a seguinte tela será apresentada, nos dando a opção de baixar mais plugins para outros servidores, dentre ele o JBoss Tools:

Ao selecionar a opção desejada e avançar, os procedimentos seguintes levarão à instalação do plugin. Os passos seguintes são bem intuitivo.

Outra maneira de instalar o plugin do JBoss Tools é através de um arquivo local, mas eu sinceramente não gosto desta opção. As experiências que tive mostraram que esta é uma opção mais demorada e propensa a erros, mas ainda assim pode ser uma opção para quem está sem conexão no momento de fazer a configuração. Para isso será necessário baixar o arquivo do site do projeto JBoss Tools, mas por não considerar esta opção a melhor, vou ignorá-la e apresentar a forma que, assim como a primeira forma apresentada, é para mim mais adequada.

Acesse o site http://www.jboss.org/tools/download. No link de downloads é possível encontrar a versão estável do plugin para o Eclipse Indigo. Esta é a principal razão pela qual não utilizo ainda o Eclipse Juno, que é a última versão do IDE Eclipse; o plugin do JBoss Tools ainda não é estável para ele.

Bem, após clicar no link voc~e será redirecionado à uma página onde é possível ter acesso ao update site do plugin, que é um link que usaremos para a configuração do mesmo no Eclipse:

Copie o link apresentado e, voltando ao Eclipse, selecione o menu “Install New Software…”:

Na tela seguinte clique no botão “Add…” e a seguinte janela de configuração será apresentada, onde é possível inserir o link copiado da página do plugin e indicar um nome para o mesmo:

Depois disso os recursos do plugin serão apresentados para que você escolha qual deles quer instalar. Eu aconselho a instalação de todos. Sendo assim selecione todas as opções apresentadas e clique no botão “Next >”:

Dependendo da banda de sua conexão, os passos seguintes podem ser bem demorados. Basicamente você terá que confirmar as escolhas feitas, aceitar alguns termos de licença e aguardar o download dos itens. Ao final será solicitado que a IDE seja reinicializada. Simplesmente aceite.

Depois de reiniciada a IDE, tente novamente adicionar o servidor de aplicações JBoss 6.1 à IDE. Você verá que o adaptador estará disponível.

Para os passos seguintes da configuração do servidor você pode consultar o post referenciado no início deste post, pois o processo será basicamente o mesmo.

É importante ressaltar que não basta ter uma JRE configurada no Eclipse. É preciso ter uma JDK configurada. Os procedimentos para esta configuração também podem ser encontrados em um dos posts citados no início deste post, referente à criação de um ambiente de desenvolvimento completo baseado no eclipse.

Bem, é isto. Espero que esta dica seja proveitosa para muitos que estão começando.

Até o próximo post!

Mensagens dinâmicas com MessageFormat

Esta é uma rápida dica sobre uma classe muito útil da API Java, a classe MessageFormat. Não vou dar muitas explicações, e mais detalhes podem ser encontrados na própria API: http://download.oracle.com/javase/1.4.2/docs/api/java/text/MessageFormat.html

Dentre as muitas coisas legais que esta classe permite fazer (formatação de valores monetários, data, hora), temos uma maneira de tratar mensagens internacionalizadas (ou não) cujo conteúdo muda de acordo com o valor específico de um parâmetro. Explico melhor:

Digamos que você precise internacionalizar, ou apenas armazenar em um properties, a seguinte frase:

“Duke, você nos visitou uma vez.”

Digamos que você precise tratar esta frase, de maneira que quando a quantidade de visitas for maior, ela mude para:

“Duke, você nos visitou (n) vezes”

Certo! O tal (n) alí pode ser qualquer número, então o que muita gente faz são concatenações para conseguir o resultado esperado, por exemplo:

“Duke, você nos visitou” + n + “vezes”;

Vamos Piorar a situação? E se o Duke nunca lhe visitou, ou seja, n é igual a zero? E é lógico que não é somente o Duke que lhe visita, então você ainda tem o seguinte:

m*, você nos visitou uma vez. (quando n = 1)

m* + você nos visitou + n + vezes. (quando n > 1)

m*, você nunca nos visitou. (quando n = 0)

*onde m pode ser o Duke ou qualquer pessoa.

Isto ainda pode ficar mais complicado quando você precisa passar a mensagem para mais de um idioma, pois a posição das partes variantes (m e n) pode ser diferente na mensagem. Este cenário é comum em sistemas internacionalizados.

Apesar de a maioria dos frameworks web com foco em componentes de apresentação apresentarem algum suporte a este tipo de situação, algumas vezes será necessário tratar mensagens assim no código Java.

Para estas situações a classe MessageFormat é ideal.

Em primeiro lugar, podemos ter apenas uma mensagem que trata todas as possibilidades, acredite. Basta colocarmos, para cada parte variável da mensagem, um placeholder, que identificará a presença de um valor dinâmico. Como no exemplo temos dois valores variáveis (n e m) teremos dois placeholders na mensagem. A sintaxe de um placeholder é um numérico entre chaves: {0} e {1}. Os valores indicam a posição dos parâmetros passados para o método que formatará a mensagem.

Nossa mensagem então ficaria assim:

{1}, você nos visitou {0} vezes.

Mas espere! Isto ainda não nos atende. Apenas uma das variações da mensagem está contemplada; precisamos do tipo de formato choice: este tipo de formato nos permite escolher dinamicamente uma parte da mensagem de acordo com o valor passado a um placeholder:

{1}, você {0,choice,0# nunca nos visitou.|1# nos visitou uma vez.|1<nos visitou {0,number,integer} vezes}.

Na mensagem acima, está em destaque a sintaxe do tipo de formatação choice; ele é colocado após o número do placeholder, depois de uma vírgula.

Em vermelho está o texto que será apresentado caso o valor passado ao placeholder seja zero. Em verde está o texto que será apresentado caso o valor passado ao placeholder seja um. Em azul está o texto que será apresentado caso o valor passado ao placeholder seja maior que um.

OK, mas como fazer a mágica da transformação? Basta passar a mensagem e os parâmetros para o método format, da classe MessageFormat. Abaixo coloco uma classe de exemplo, que mostra ainda a mesma mensagem traduzida em inglês e espanhol, para demonstrar que a localização dos placeholders pode mudar sem afetar o resultado esperado.


import java.text.MessageFormat;

public class FormatacaoMensagem{

private static String ingles = "You have {0,choice,0#never visited us|1#visited us once|1<visited us {0,number,integer} times}, {1}.";
private static String portugues = "{1}, você {0,choice,0#nunca nos visitou.|1#nos visitou uma vez.|1<nos visitou {0,number,integer} vezes}.";
private static String espanhol = "Usted {0,choice,0#nunca nos ha visitado, {1}|1#nos ha visitado una vez, {1}|1<nos ha visitado {0,number,integer} veces, {1}}.";

public static void main(String[] args){

Object[] nenhum = {
new Integer(0),
"Duke"

};

Object[] um = {
new Integer(1),
"Duke"

};

Object[] varios = {
new Integer(2),
"Duke"

};

System.out.println( MessageFormat.format(ingles, nenhum) );
System.out.println( MessageFormat.format(ingles, um) );
System.out.println( MessageFormat.format(ingles, varios) );

System.out.println( MessageFormat.format(portugues, nenhum) );
System.out.println( MessageFormat.format(portugues, um) );
System.out.println( MessageFormat.format(portugues, varios) );

System.out.println( MessageFormat.format(espanhol, nenhum) );
System.out.println( MessageFormat.format(espanhol, um) );
System.out.println( MessageFormat.format(espanhol, varios) );

}
}

Eis o resultado final:

Vale a pena conferir a API para as outras opções que a classe oferece.

Está dada a dica!

Dicas de Boas Práticas de Codificação

Este post não traz nenhuma novidade para quem já desenvolve há algum tempo, e a intenção é atingir aqueles que estão começando a programar em Java.

Resolvi juntar algumas dicas de padrões de codificação e melhores práticas para códigos a serem aplicados no desenvolvimento de aplicações Java.

São abordados padrões de nomes de arquivos, organização de código, endentação, comentários, declarações, sentenças, espaços em branco, convenção de nomes, práticas de programação e exemplos de código.

Estes padrões são baseados em princípios de engenharia de software que produzem códigos fáceis de entender, fáceis de manter e escaláveis. As convenções aqui adotadas foram fortemente baseadas no documento de Convenção de Codificação para a Linguagem de Programação Java, da Sun Microsystems.

Algumas constatações reforçam a necessidade de se adotar uma padronização durante do desenvolvimento:

  • 80% dos custos de um software é referente à manutenção.
  • Dificilmente qualquer software é mantido durante toda sua vida útil pelo autor original.
  • Convenções de código aumentam a legibilidade do software, permitindo que os desenvolvedores entendam novos códigos mais rapidamente e completamente.

No desenvolvimento de sistemas o uso de padrões de codificação promove o aumento da consistência do código e da produtividade da equipe. A seguir são descritas as principais instruções para a codificação de um código Java com padronizado e com qualidade.

Convenção de Nomes

Mantenha o tamanho dos nomes grande o bastante para transmitir o que eles representam. Exemplo: primeiroNome, sobrenome, ordemServico, etc.

Nomes de Classes e Interfaces

Os nomes de classe devem ser substantivos e, em caso de nomes compostos, utilize nomes com a primeira letra de cada palavra interna maiúscula. Use palavras inteiras evitando acrônimos e abreviaturas. Exemplo: Cliente ou ContaCliente.

Nomes de Métodos

Os nomes dos métodos devem ser verbos, em casos compostos com o primeiro nome minúsculo, e com a primeira letra de cada palavra interna em maiúsculo. Exemplo:

calcularPagamento().

Nomes de Variáveis

Os nomes de variáveis devem estar com uma primeira letra minúscula e, em caso de nomes compostos, com a primeira letra de cada palavra interna em maiúsculo. Exemplo: contraPeso, primeiroNome, etc.

Use abreviações consistentemente. Exemplo: numPedido, numChamado. Neste caso, num representa Numero.
Evite os nomes que são similares. Exemplo: o numCliente e numcliente.

Use nomes no plural para representar coleções tais como uma disposição ou um vetor. Exemplo: CustomerPK[] clientes ou Vector politicasDeAcesso.

Nomes de Constantes

Os nomes de constantes para tipos de dados ordinais devem ter todas as letras em maiúsculo, separadas por underscore. Exemplo:

public static final int MAX_POLICY_AMOUNT; ou
public static final char PROCESS_INFO_COMMAND;

Documente com Comentários

Adicione comentários para facilitar a compreensão do código. Mantenha o comentário simples e separe-os de tal forma o código fique limpo e legível. Escreva também os comentários onde alguma explanação é necessária. Não escreva comentários para as coisas óbvias. Forneça documentação de acordo com a especificação do javadoc, tal que os arquivos do Java código podem ser usados para produzir a documentação externa das classes.

Documentação de Classes

Para documentar classes forneça comentários imediatamente antes de sua definição, especificando a finalidade e histórico de desenvolvimento.

Documentação de Interfaces

Para documentar interfaces especifique a finalidade nos comentários da documentação, imediatamente antes de sua definição. Para cada método siga os padrões da documentação de métodos de membro.

Documentação de Pacotes

Forneça documentação que especifique o relacionamento de um pacote com suas classes e Interfaces.

Use Linhas em Branco

Forneça linhas em branco entre as seções do código para melhorar a legibilidade. Use uma linha em branco nas seguintes circunstâncias:

  • Para separar as definições de classes das definições de métodos;
  • Para separar as variáveis locais de um método;
  • Para separar blocos de código; e
  • Para separar comentários das seções lógicas do código.

Espaços em Branco e Tabulação

Use o espaço em branco para melhorar a legibilidade do código nas seguintes circunstâncias: Entre uma palavra-chave e um parêntese. Exemplo:

while (condicao) {
}

Após vírgulas na lista entre parênteses. Exemplo:


operacao(param1, param2, param3);

Entre um operador binário e seu operando. Exemplos:


x += y + z;
a = (a + b) / (c * d);

Entre expressões em uma declaração “for”. Exemplo:


for (expr1; expr2; expr3)

Na utilização de casts.


umMetodo((byte) num, (Object) x);

Variáveis Locais

Declare uma variável local por linha do código e adicione um comentário que identifique a variável. Exemplo:

int contador = 0; // contador para número de referências

Declare todas as variáveis locais no começo dos blocos. Isto facilitará a localização das definições variáveis pelo programador. Exemplo:


private void calcularProcessosPendentes() {
boolean processoEncerrado = false; // indica término do processamento
}

Use cada variável local para uma finalidade específica.
Inicialize todas as variáveis locais onde elas são declaradas. A única razão para não inicializar uma variável no local onde ela é declarada é quando o valor inicial da variável depende de um processamento que ocorrerá posteriormente.


int contador = 0; // contador para número de referências
int maxReferencias; // o número máximo de referências a serem processadas
…
maxReferencias = getMaxRefencias(…, …);

Evite as declarações locais que sobreponham declarações em níveis superiores. Exemplo:


int contador = 0; //…
…
metodo() {
    if (condicao) {
        int contador = 0;
        …
    }
    …
}

Atributos de Membro

Para declarar atributos de membro utilize os seguintes padrões:

Finalidade: Documente a finalidade do atributo;
Visibilidade: Mantenha a visibilidade tão baixo quanto possível;
Iniciação: Certifique-se de que todos os atributos estão inicializados antes que sejam alcançados. Inicialize todos os atributos no momento da criação do objeto. A inicialização posterior pode ser usada para os campos que não são acessados regularmente.

Métodos de Membro

Para declarar métodos de membro utilize os seguintes padrões:

Nomenclatura: use get/set como um prefixo do nome do campo para todos os métodos de ascensão, a menos que forem do tipo booleano. Use o prefixo “is” para nomes de métodos que referenciem campos booleanos. Utilize também a primeira palavra do nome do método de membro como um verbo forte, ativo. Exemplo:


getPotenciaMotor(), setPotenciaMotor(), isAutomatico(), reduzirMarcha().

Visibilidade: Mantenha a visibilidade de funções de membro tão restritiva quanto possível para minimizar o acoplamento entre as classes;
Documentação: Inclua um cabeçalho para especificar as seguintes informações da função de membro:

  • O propósito da função;
  • Seu valor de retorno;
  • Os parâmetros;
  • As mudanças nas versões do código.

Parâmetros

Evite nomear parâmetros com o mesmo nome que as variáveis de membro. Isto evitará referenciar cada variável de membro utilizando o operador “this”, dificultando a localização de erros. Documente os parâmetros de uma função de membro no header usando a tag @param do javadoc. A documentação deve ser obrigatória para descrever todas as limitações ou pré-condições.

Declarações ou Comandos

Cada linha deve conter no máximo um comando. Exemplo:

contador++; x = y; // EVITE ISSO!

Chaves ou Blocos

Siga um esquema consistente para a abertura e fechamento de chaves. Alinhe a abertura e fechamento das chaves verticalmente. Isto facilitará a identificação do começo e término dos blocos. Exemplo:

class Cliente
{
    public void operacaoParaCliente()
    {
        if(condicao)
        {
        }
    }
}

Alternativamente, ponha a chave da abertura na extremidade da linha que começa o bloco. A chave de fechamento deve começar uma nova linha e ser posicionada no começo do comando de bloco. Exemplo:


class Cliente {
    public void operacaoParaCliente() {
        if(condicao) {
        }
    }
}

Ordem dos Membros

Declare membros de acordo com a ordem de visibilidade, do mais visível para menos visível, conforme modelo abaixo:

construtores (constructors)
public member functions
protected member functions
private member functions

Minimize a utilização do modificador de acessos public e protected. Isto reduz o acoplamento e deixa o código mais compreensível. Evite usar nomes de objetos para acessar membros estáticos (static members), em vez disto, use o nome da classe preferivelmente.

Concatenação de Strings

Evite realizar a concatenação de Strings com o operador “+“. Strings são objetos imutáveis, e por esta razão, a cada vez que uma concatenação é realizada, novos objetos são criados na memória:

String a = “Evite“;
a = a + “realizar a concatenação“;
a = a + “de Strings assim!“;

Para concatenação, procure utilizar as classes StringBuilder ou StringBuffer:


StringBuilder a = new StringBuilder(“Procure“);
a.append(“realizar a concatenação“);
a.append(“de Strings assim!“);

Cuidados na Manipulação de Objetos que Podem Estar Nulos

Ao realizar a chamada de métodos em objetos que poderiam estar nulos, tenha sempre o cuidado de testá-lo antes, a menos que tenha a certeza de que o objeto não estará nulo.
Um exemplo útil, no caso de comparação de Strings:

Ao invés de realizar a comparação desta maneira:


if(umaString.equals(““)){
…

Faça o seguinte, chamando o método equals no valor literal:


if(““.equals(umaString)){
...

Remover Imports Desnecessários

É importante, por uma questão de economia de memória, manter nas classes e interfaces somente as definições de imports que são utilizadas.
Uma outra prática importante, que já é reforçada pelas IDE’s, é fazer o import classe a classe, ao invés de importar todos as classes de um determinado pacote.

Utilize Parênteses Sempre que Puder

Não economize na utilização de parênteses quando estes puderem deixar uma expressão mais clara.

Atribuição de Variáveis

Evite fazer múltiplas atribuições a uma mesma variável em uma única linha:

fooBar.fChar = barFoo.lchar = 'c'; // EVITE ISSO!

Referência a Atributos e Métodos Estáticos

Sempre referencie membros estáticos (atributos e métodos) através da classe, e não de uma instância da mesma:


UmaClasse.metodoEstatico(); // OK
instanciaDeUmaClasse.metodoEstatico(); // EVITE ISSO!

Utilize Chaves Sempre!

Sempre utilize chaves para delimitar blocos de comandos, mesmo que estes tenham apenas uma instrução:

if(determinadaCondicao) // EVITE ISSO!
    realizaOperacao();

if(determinadaCondicao){ // OK
    realizaOperacao();
}

Bom, definitivamente não há nada de novo aqui para quem já desenvolve há algum tempo, com uma ou outra adaptação.

O importante é definir quais práticas se adequam à sua realidade/equipe/projeto e seguí-la.

Está dada a dica!

Referência

http://www.oracle.com/technetwork/java/codeconv-138413.html

Dicas para Java Swing

Esta é uma dica rápida para quem está começando a aprender Java Swing!

O conjunto de componentes presente neste framework da API Java é robusto e avançado, e permite a criação de interfaces gráficas para o usuário com uma alta qualidade. Nas últimas versões da JDK o desempenho do Swing vem melhorando muito, e ainda é comum que empresas recorram a esta tecnologia para a criação de aplicações desktop, ainda que as aplicações web estejam em alta.

A grande flexibilidade e da tecnologia Swing, porém, é muitas vezes uma barreira para quem está começando a aprender a tecnologia Java. Seus componentes baseados no padrão MVC permitem a criação de datasources específicos para os compoentes, assim como renderizadores especializados, e aprender a trabalhar com tudo isso pode dar um bom trabalho.

O que muitos desconhecem, porém, é que a própria JDK vem com exemplos bem interessantes de como criar interfaces baseadas em Swing.

A dica de hoje é o aplicativo SwingSet, presente no diretório de exemplos da JDK. Você pode encontrar o aplicativo no seguinte diretório (onde JAVA_HOME é o diretório de instalção da JDK):

JAVA_HOME\demo\jfc\SwingSet2

Ao executar o arquivo SwingSet2. jar  será iniciada a aplicação:

Ela apresenta exemplos dos principais componentes da API Swing, como os complexos JTable e JTree:

E o melhor de tudo, o código fonte está disponível para a consulta:

Deixo ainda a dica do Swing Tutorial (em inglês) para a consulta. É excelente!

http://java.sun.com/docs/books/tutorial/uiswing/

Está dada a dica. Qualquer hora posto algo específico da tecnologia Swing por aqui.

[]’s