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.
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 … (more…)
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.
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. (more…)
Bom, me desculpem por este texto, mas eu vou ser obrigado a escrever isto … (more…)
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 … (more…)
Tags: Diversão
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 … (more…)
Tags: Trabalho
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: (more…)
Tags: Eclipse
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
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:
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.
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>
Tags: Trabalho
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 … (more…)