Links novos na barra lateral

Na seção “Links” da barra lateral do blog, foram adicionados dois novos links …

um para o Blog do Mauro (Bit Code) e outro para o Blog do Jeveaux, dois conhecidos de longa data, que conheci no GUJ, e que se tornaram meus amigos com o tempo …

O Bit Code já conta com diversos artigos bastante interessantes, e principalmente para iniciantes que é coisa que não se vê muito por ai.

O blog do Jeveaux ta começando agora, mas se ele seguir a linha dos posts dele no GUJ e PJ o blog vai ser muito bom.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Quatro dias de Ruby On Rails - Segundo dia

Quatro dias de Ruby On Rails - Primeiro dia

Seguindo com a tradução do tutorial, vamos ao segundo dia.

Para prosseguir alem do ponto onde ja chegamos, precisaremos olhar com maiores detalhes o que acontece por traz dos panos, principalmente o código gerado pelo scaffold.

Com a ação “scaffold :entidade” o rails gera o código necessário dinamicamente, mas podemos também gerar o código para que possamos ler e alterar … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Frio de renguia cusco

Bom eu sei que o blog anda meio parado, a semana ta corrida, tenho uns 2 posts como draft para terminar de escrever …

Mas hoje quando cheguei no trabalho, sai do carro, apenas uma frase  me veio a cabeça …

Hoje ta “frio de renguia cusco“!

Para os não gaúchos, segue a tradução:

Cusco - cachorro, normalmente pequeno.

Rengo - Capenga, aquele que manca.

Ou seja, hoje ta tão frio, que aqueles cuscos que dormem na rua acordam mancando por causa das pernas quase congeladas.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Exemplos dos exercicios dos cursos de JPA e JSF (Ajuda no tema de casa dos alunos)

A pedido dos alunos dos cursos de JPA e JSF do fim de semana passado em pato branco, estou colocando aqui online dois zips com os resultados dos exercicios.
Não são aplicações completas, ambos os zips tem exercicios diversos.
Eles estão sem as libs, tem inks para onde baixar as libs na apostila, mas basicamente no de JPA utiliza o toplink-essentials+driver do banco de dados, e no de JSF a JSF-RI 1.1 (1.2 para a segunda forma de trabalhar com dataTables) + todas as bibliotecas do exemplo de JPA. Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Gerador de bla, bla, bla

Bom, me desculpem por este texto, mas eu vou ser obrigado a escrever isto … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Heroes - Final da primeira temporada!

Bom, assisti ontem a noite em casa o ultimo episódio da primeira temporada de Heroes!

A história estava bem legal, mas eu achei o ultimo episódio meio sem graça na verdade …

Tudo bem, aconteceu o que todos esperavam que acontecesse, mas acho que faltou um pouco de ação!

Bom, como eu não vou resistir, seguem alguns spoilers, quem não assistiu ainda, leia por sua conta e risco, a fonta esta em branco, selecionem o texto para ler … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Existem ferramentas com suporte a refactoring para linguagens fracamente tipadas?

Bom, hoje eu passei o dia refatorando uma parte de um projeto em que estou trabalhando …

A parte java foi tranquilo, fiquei até feliz com o código …

boa parte dele da para ler como se fosse inglês, ou seja, boa parte dele nem precisa de comentários …

Agora tem bastante Javascript no código, e nesta parte precisei fazer todos os refactorings na mão mesmo, ou seja, sem ajuda nenhuma …

Nem o eclipse nem o IntelliJ IDEA me ajudaram nisto … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Melhores teclas de atalho do Eclipse

Seguindo a ideia deste, e deste post no GUJ, resolvi postar aqui a minha lista de atalhos favoritos do eclipse, apenas aqueles que eu uso com uma certa frequencia para evitar tirar as mãos do teclado e precisar usar o mouse para realizar pequenas tarefas que são na maioria das vezes, realizadas com mais rapidez e facilidade apenas com o teclado …
Os atalhos não estão em nenhuma ordem especifica, fora os dois primeiros que com certeza são os mais importantes de todos eles: Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Manifesto pela legibilidade de código

Bom, este post foi inspirado por um aluno do curso que eu ministrei fim de semana passado em Pato Branco/PR, mas este post não é culpa só dele :D
O post é inspirado em coisas que eu já vi e já fiz muito por ai …

A idéia básica deste post é que:

Qualquer um pode escrever código que um computador entende, mas apenas um programador muito bom, escreve código que uma pessoa entende.

Como premissa básica, se você programa em uma linguagem, siga os padrões dela, por exemplo:

  • Java
    • Nomes de classes começam com letra maiúscula
    • Nomes de variáveis com letras minúscula
    • Classes nunca são criadas no package default, isto é desencorajado desde o java 1.3
  • Delphi
    • Nomes de classes começam com T
    • nomes de variáveis utilizam a notação ungara (se não estou enganado é este o nome)
      • Se o campo é um text box, txtNome por exemplo

E assim por diante, ou seja, siga os padrões básicos da linguagem que estiver trabalhando.

Alem dos padrões das linguagens, cada empresa normalmente possui um padrão de formatação, por tanto, siga o padrão da empresa, e de preferência, configure a sua IDE para te ajudar neste trabalho.

  • Nomes de classes obrigatoriamente precisam informar a quem lê, do que se trata esta classe.
  • Classes preferencialmente possuem comportamento.
  • “Coisas” no código fonte, devem ser agrupados por domínio de comportamento.
  • Aprenda com os padrões de outras linguagens, por exemplo, o principio DRY (Don`t Repeat Yourself) do Ruby On Rails, deve ser utilizado sempre em qualquer situação, independente da linguagem que esta sendo utilizada.
  • Métodos grandes são difíceis de ler, se um método estiver muito grande, com certeza absoluta você pode dividi-lo em métodos menores.
  • Nomes de métodos precisam, obrigatoriamente, dizer exatamente o que este método faz.
  • Classes não são tabelas, por tanto, se estiver criando uma classe persistente, ela pode ter um “id”, por exemplo a classe Cliente, pode ter um campo “id”, mas pelo amor de Jahl, ela não pode, em ipótese alguma, ter um campo “clienteid”.
  • Classes, por serem a forma de se definir um objeto, que por definição, possui estado e comportamento, 99% das vezes, possuem mais metodos do que “gets” e “sets”, se você olhar para uma classe que não os possui, provavelmente você os colocou no lugar errado.
  • Não crie “gets” e “sets” indiscriminadamente, crieos apenas quando forem necessários, muitos dos atributos de uma classe não devem ser alterados externamente.

Refactoring é seu amigo!

Refatore sempre que precisar para melhorar a legibilidade do código, ou quando perceber que alguma coisa esta implementada no lugar errado.

A boa noticia é que a maioria das IDEs, para diversas linguagens, tem suporte para diversos tipos refactoring.

A má noticia é que se a sua IDE ou linguagem, não tem suporte a refatoring, ou não tem suporte ao refactoring que você precisa, você vai ter que faze-lo manualmente.

DRY (Don’t Repeat Yourself)

Não se repita, se você escreveu alguma coisa em algum lugar, reuse, não escreva novamente!

Mas preste atenção, reuso não é igual a copiar e colar, se você precisar copiar e colar, é por que provavelmente fez errado da primeira vez.

Considere este exemplo (Retirado do livro encontrado aqui)

public class BookRental {
String id;
String customerName;
...
}
public class BookRentals {
private Vector rentals;
public String getCustomerName(String rentalId) {
for (int i = 0; i < rentals.size(); i++) {
BookRental rental = (BookRental) rentals.elementAt(i);
if (rental.getId().equals(rentalId)) {
return rental.getCustomerName();
}
}
throw new RentalNotFoundException();
}
}
public class RentalNotFoundException extends Exception {
...
}

Agora imagine que você precisa adicionar um método para remover um aluguel pelo ID:

public class BookRentals {
private Vector rentals;
public String getCustomerName(String rentalId) {
for (int i = 0; i < rentals.size(); i++) {
BookRental rental = (BookRental) rentals.elementAt(i);
if (rental.getId().equals(rentalId)) {
return rental.getCustomerName();
}
}
throw new RentalNotFoundException();
}
public void deleteRental(String rentalId) {
for (int i = 0; i < rentals.size(); i++) {
BookRental rental = (BookRental) rentals.elementAt(i);
if (rental.getId().equals(rentalId)) {
rentals.remove(i);
return;
}
} throw new RentalNotFoundException();
}
}

Você acha que este código esta OK? lembra-se do DRY? neste exemplo simples ja temos muito código duplicado, o que com certeza não é bom, então, podemos fazer o seguinte refactoring:

public class BookRentals {
private Vector rentals;
public String getCustomerName(String rentalId) {
int rentalIdx = getRentalIdxById(rentalId);
return ((BookRental) rentals.elementAt(rentalIdx)).getCustomerName();
}
public void deleteRental(String rentalId) {
rentals.remove(getRentalIdxById(rentalId));
} private int getRentalIdxById(String rentalId) {
for (int i = 0; i < rentals.size(); i++) {
BookRental rental = (BookRental) rentals.elementAt(i);
if (rental.getId().equals(rentalId)) {
return i;
}
}
throw new RentalNotFoundException();
}
}

Por que remover código duplicado?

Em geral, se um código esta duplicado em 10 lugares, se você precisar alterar este código precisara lembrar de todos os 10 lugares, o qe provavelmente não vai acontecer, por tanto vai criar bugs no sistema.

O seu código não precisa de comentários! des de que ele seja legivel!

Considere este outro exemplo do mesmo livro, em que é desenvolvida uma aplicação para gerenciamento de conferencias, e que existe uma barra lateral onde devem ser exibidas informações sobre o participante:

//It stores the information of a participant to be printed on his badge.
public class Badge {
String pid; //participant ID
String engName; //participant's full name in English
String chiName; //participant's full name in Chinese
String engOrgName; //name of the participant's organization in English
String chiOrgName; //name of the participant's organization in Chinese
String engCountry; //the organization's country in English
String chiCountry; //the organization's country in Chinese
//***********************
//constructor.
//The participant ID is provided. It then loads all the info from the DB.
//***********************
Badge(String pid) {
this.pid = pid;
//***********************
//get the participant's full names.
//***********************
ParticipantsInDB partsInDB = ParticipantsInDB.getInstance();
Participant part = partsInDB.locateParticipant(pid);
if (part != null) {
//get the participant's full name in English.
engName = part.getELastName() + ", " + part.getEFirstName();
//get the participant's full name in Chinese.
chiName = part.getCLastName()+part.getCFirstName();
//***********************
//get the organization's name and country.
//***********************
OrganizationsInDB orgsInDB = OrganizationsInDB.getInstance();
//find the ID of the organization employing this participant.
String oid = orgsInDB.getOrganization(pid);
if (oid != null) {
Organization org = orgsInDB.locateOrganization(oid);
engOrgName = org.getEName();
chiOrgName = org.getCName();
engCountry = org.getEAddress().getCountry();
chiCountry = org.getCAddress().getCountry();
}
}
}
...
}

Agora transforme os comentários em código, fazendo-o tão simples quanto os comentários.

//It stores the information of a participant to be printed on his badge.
public class Badge {
...
}

Para que precisamos deste comentário se podemos escrever assim:

public class ParticipantInfoOnBadge {
...
}

E nesta parte:

public class ParticipantInfoOnBadge {
String pid; //participant ID
String engName; //participant's full name in English
String chiName; //participant's full name in Chinese
String engOrgName; //name of the participant's organization in English
String chiOrgName; //name of the participant's organization in Chinese
String engCountry; //the organization's country in English
String chiCountry; //the organization's country in Chinese
...
}

Por que não transformas os comentários em variáveis assim:

public class ParticipantInfoOnBadge {
String participantId;
String participantEngFullName;
String participantChiFullName;
String engOrgName;
String chiOrgName;
String engOrgCountry;
String chiOrgCountry;
...
}

Ou destes comentários?

public class ParticipantInfoOnBadge {
...
//***********************
//constructor.
//The participant ID is provided. It then loads all the info from the DB.
//***********************
ParticipantInfoOnBadge(String pid) {
this.pid = pid;
...
}
}

Se podemos transforma-los em nomes de parametros:

public class ParticipantInfoOnBadge {
...
//***********************
//constructor.
//It loads all the info from the DB.
//***********************
ParticipantInfoOnBadge(String participantId) {
this.participantId = participantId;
...
}
}

Podemos tambem transformar comentários em partes do código do método:

public class ParticipantInfoOnBadge {
...
//***********************
//constructor.
//***********************
ParticipantInfoOnBadge(String participantId) {
loadInfoFromDB(participantId);
} void loadInfoFromDB(String participantId) {
this.participantId = participantId;
...
}
}

Agora pegue este outro fragmento de código:

void loadInfoFromDB(String participantId) {
this.participantId = participantId;
//***********************
//get the participant's full names.
//***********************
ParticipantsInDB partsInDB = ParticipantsInDB.getInstance();
Extract some code to form a method and use the comment to name the method 41
Licensed for viewing only. Printing is prohibited. For hard copies, please purchase from www.agileskills.org
Participant part = partsInDB.locateParticipant(participantId);
if (part != null) {
//get the participant's full name in English.
engFullName = part.getELastName() + ", " + part.getEFirstName();
//get the participant's full name in Chinese.
chiFullName = part.getCLastName()+part.getCFirstName();
//***********************
//get the organization's name and country.
//***********************
OrganizationsInDB orgsInDB = OrganizationsInDB.getInstance();
//find the ID of the organization employing this participant.
String oid = orgsInDB.getOrganization(participantId);
if (oid != null) {
Organization org = orgsInDB.locateOrganization(oid);
engOrgName = org.getEName();
chiOrgName = org.getCName();
engOrgCountry = org.getEAddress().getCountry();
chiOrgCountry = org.getCAddress().getCountry();
}
}
}

E me diga por que não transformas os comentários em nomes de métodos assim:

void loadInfoFromDB(String participantId) {
this.participantId = participantId;
getParticipantFullNames();
//***********************
//get the organization's name and country.
//***********************
//find the ID of the organization employing this participant.
OrganizationsInDB orgsInDB = OrganizationsInDB.getInstance();
String oid = orgsInDB.getOrganization(participantId);
if (oid != null) {
Organization org = orgsInDB.locateOrganization(oid);
engOrgName = org.getEName();
chiOrgName = org.getCName();
engOrgCountry = org.getEAddress().getCountry();
chiOrgCountry = org.getCAddress().getCountry();
}
} void getParticipantFullNames() {
ParticipantsInDB partsInDB = ParticipantsInDB.getInstance();
Participant part = partsInDB.locateParticipant(participantId);
if (part != null) {
//get the participant's full name in English.
engFullName = part.getELastName() + ", " + part.getEFirstName();
//get the participant's full name in Chinese.
chiFullName = part.getCLastName()+part.getCFirstName();
}
}

E assim por diante, seguindo algumas regras básicas, o código vai ser bastante legível, dispensando boa parte dos comentários, o que vai fazer com que o seu desenvolvimento seja mais rápido, e vai também fazer com que outras pessoas consigam ler o seu código sem problemas.
Mas eu não estou dizendo que não é para comentar nada, mas com certeza, boa parte os comentários é dispensavel, se o seu código for legível!

Bom, acho que é isto por enquanto …

Por favor, contribua sua ideia para melhorar este manifesto, e se gostou dele,divulge-o, isto ainda vai lhe poupar muito tempo!

<MODO SARCASMO ON>

Apenas para deixar claro, a maior parte das regras definidas neste post, esta acima de qualquer contestação, e é por definição, verdade absoluta. (Ou seja, até que se prove ao contrário, estas regras estão acima de contestação).

</MODO SARCASMO ON>

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Video propagandas do ruby on rails

Bom, só para propagar um pouquinho mais os novos videos sobre o RoR …

A ideia veio dos videos da apple, os videos fazem algumas comparações do tipo bananas X maças (por exemplo comparar RoR com Java é ilógico, ele poderia ser comparado com JSF, Struts, WebWork, VRaptor, …, mas não com Java ), mas os videos ficaram muito bons e engraçados, vale a pena dar umas risadas … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Posts mais populares de todos os tempos do ultimo mes :D

Bom, segue a lista dos posts mais populares de todos os tempos destes últimos dois meses :D

  1. Ambiente básico para desenvolvimento Java/Web + Configuração Eclipse.
  2. Pensamento do dia!
  3. Eclipse 3.3M5 + WebTools 2.0 = Drag`n`Drop para páginas WEB no Eclipse (WYSIWYG)
  4. Eclipse - Callisto : Europa! Tudo o que você queria, e mais um monte de coisas …
  5. Tutorial: Google Guice - Injeção de dependencias by Google
  6. Java é uma péssima linguagem para aplicações baseadas em plugins
  7. Spring-Annotations de casa nova (e precisando de ajudantes :D )
  8. Que qualidades fazem um bom programador? eu acredito que estas …!
  9. h:commandLink dentro de um h:dataTable==Problemas? Nops, apenas um problema de conceito …
  10. Linux MCE é show de bola :D
  11. Eclipse 3.3M5 - primeiras impressões

E alguns que eu acho que deveriam ser populares, mas parece que vocês não concordam comigo :D

  1. DAO Generico - um exemplo a pedidos
  2. Como ser uma pessoa organizada!
  3. 6 coisas que eu não gosto no Java SE/EE
  4. Sistemas de Integração Continua
  5. To Maven or not To Maven 2.0

Criticas, sugestões e comentários são sempre bem vindos :D

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

A solução definitiva (pelo menos por enquanto) para os Spams no blog

Bom, a maior parte dos visitantes do blog, pode não fazer nem ideia, mas com certeza os que também possuem um blog sabem a quantidade absurda de Spam que se recebe por dia no blog, eu estava utilizando des da semana passada um plugin que usa Javascript para impedir spams nos comentários, e ele até que funciona, mas a grande maior parte dos SPAMs vem via trackback … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

JDBC: Otimização de Performance (Migração de dados Postgres -> Mysql)

Bom, este é apenas um upgrade deste post.

O código abaixo resolve exatamente o mesmo problema que o anterior, que era migrar os dados da minha aplicação do Postgres para o MySQL (coisa que o MySQL Migration Tool não conseguiu fazer).

Foi alterada 1 linha do código original e adicionadas 7 linhas.

A performance da migração de dados melhorou 80% mais ou menos. Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Migração de dados Postgres -> Mysql

Bom, precisei esta semana migrar um banco de dados de postgres para MySQL …

A primeira tentativa foi utilizar o proprio MySQL Migration Tool, mas não deu certo por que ele não tem suporte nativo ao Postgres e se perdia direto nos campos Data, fazendo com que em qualquer tabela que tivesse um tampo Timestamp, ele não inserisse nenhuma linha … Read the rest of this entry »

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Mudança nos comentários

Bom, para diminuir o spam nos comentários do blog eu fiz algumas alterações, e queria a opinião de vocês …

Quem tem Javascript habilitado no browser não deve ter percebido alteração nenhuma no formulário de comentários, quem não tem, deve ter visto um campo a mais …

Normalmente este campo é preenchido via javascript, o que não deve causar problemas a nenhum de vocês.

A outra alteração é que agora o formulário de comentários não esta mais utilizando ajax para o envio dos comentários.

Ai fica a pergunta, vocês preferem assim ou com os comentários via ajax?

PS.: sim, eu sei que a grande maioria dos visitantes do blog não chegam nem perto do formulário de comentários …

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!