Frameworks: agindo com bom senso

Postado por Rafael Carneiro on 23rd May, 2008

Um pouco de conversa

Sempre que posso, acesso o fórum do Javaranch para ver as novidades e assuntos interessantes do mundo Java. No feriado de ontem estava eu navegando nesse fórum quando achei um tópico de título “When to use JSF or Struts“. Título este bem chamativo, por conta das diversas discussões e comparativos sobre esses frameworks na comunidade Java do mundo inteiro.

Nesse post, o autor pergunta qual a diferença entre os dois. A diferença é simples: a quantidade de artefatos criados e a complexidade de sua utilização. JSF é bem simples e com algumas configurações e artefatos criados já está apto para ser utilizado no seu sistema. Eu não sou xiita e não estou dizendo que JSF é melhor do que Struts ou qualquer outro framework, não estou afirmando que ele é a bala de prata. E não é.

Gostei muito de uma resposta desse post e ainda bem que ela foi logo a primeira resposta, evitando que outras respostas mudassem os pensamentos e opiniões dos leitores. Nessa resposta, o autor enfatiza: “How to choose? For me, I’ll choose a framework that team members familiar with“. Essa resposta foi bem coerente, pois se sua equipe possui experiência e produtividade com o framework X, não quer dizer que se adotar o framework Y aumentará a produtividade da equipe, pelo contrário, pode acontecer o inverso, já presenciei casos desse tipo.

É comum ver em fóruns, listas de discussão e até mesmo no dia-a-dia, profissionais discutindo com seus companheiros de trabalho, alegando que o Struts (versões 1.x) é obsoleto e está ultrapassado. Isso não é mentira, é fato. Porém o que não concordo é esse xiitismo e essa generalização em volta desse assunto. Você já trabalhou com Struts, já ganhou muito dinheiro com ele, eu também. O framework Struts foi por muito tempo o framework padrão de mercado, exigido por quase todas as empresas como requisito fundamental no currículo. Acredito que apenas uma fatia dos novos desenvolvedores que iniciaram a pouco tempo não tiveram a chance de trabalhar com ele. Mas este dia chegará, pois muito em breve esses teenagers irão prestar consultoria em sistemas que foram feitos com esse framework.

Por que o Struts está obsoleto?

É muito simples de explicar. Veja a imagem abaixo e tente comparar com qualquer outro framework da moda.

Arquitetura orientada a BOLOVO

Essa arquitetura é completamente orientada a BOLOVO. Note que é necessário a criação de vários artefados para a criação de um simples caso de uso.

Artefatos necessários:

  1. configuração do Servlet Front Controller do Struts no deployment descriptor (web.xml)
  2. criação de um XML denominado struts-config.xml
  3. criação de uma classe Java que estende a classe ActionForm (Struts)
  4. criação de uma classe Java que estende a classe Action (Struts)
  5. configuração do ActionForm no struts-config.xml
  6. configuração da Action no struts-config.xml
  7. se você for utilizar validação (que é necessária em todo sistema que se preze), é necessário a criação de outros artefados, como por exemplo um arquivo de propriedades.

Isso não acontece com frameworks da moda, nos quais são orientados a POJO. Por exemplo, o JSF necessita apenas da criação de uma classe POJO, configuração do Servlet no deployment descriptor e da criação de um XML chamado faces-config.xml. Três artefatos criados, eu disse apenas três artefatos criados.

Portanto, a sua utilização poderá acarretar em futuros problemas, como inúmeras refatorações. Também existe uma má utilização dos princípios da Orientação a Objetos e péssimas práticas de desenvolvimento de software, nos quais posso citar algumas: alto acoplamento, alta manutenabilidade e complexidade.

E agora, o que utilizar?

Muita calma nesta hora. Como mencionei acima, não sou xiita (a-rá, gosto de EJB e irei utilizá-lo em todos os meus projetos, até um hello world numa simples JSP, criarei diversos artefatos, farei várias configurações e utilizarei um servidor de aplicações parrudo). Ratificando: o intuito deste post não é mostrar que o framework X é melhor do que o framework Y.

Java está se tornando uma plataforma difícil de se dominar, por ser bastante abrangente e surgir novas funcionalidades todos os dias. Sem falar de frameworks, que todo dia nasce um no quarto de um desenvolvedor que está com seu ócio criativo em alta. Mas alguns frameworks estão me chamando bastante atenção, por serem produtivos, robustos e simples. São eles: JSF, VRaptor e Spring.

Lembrando mais uma vez: nenhum framework é a bala de prata!

frameworks-cadeia.jpg

Outros frameworks que estão chamando atenção da comunidade: Apache Wicket e Waffle. Implementações: Jersey e Metro.

Sobre frameworks caseiros

Se você acessar os maiores fórums brasileiros de Java como GUJ e PortalJava, verá inúmeras discussões sobre as vantagens e desvantagens de frameworks caseiros. Particularmente eu vejo muitas desvantagens, pois já passei por uma experiência que não me agradou muito. Há uma discussão no GUJ sobre esse assunto, ela é datada de 2005, que me chamou bastante atenção. Se em 2005 alguns dos membros mais ativos da comunida Java já falaram das desvantagens de construir tal geringonça, por que após três anos isso ainda continua?

Frameworks caseiros não são arquiteturas de referência, não são padronizados, não possuem uma comunidade em volta para dar apoio e não são padrões da insdústria de software. Construir frameworks caseiros com o dinheiro público é o pior caso de todos.

Nesse post do GUJ, Carlos Villela comentou:

Desenvolver um framework ANTES de desenvolver uma aplicacao nao da certo: ou voce acaba com a aplicacao tendo que fazer gambiarras em cima do framework, ou a aplicacao nao sai ate mudarem o framework. Eh melhor fazer uma aplicacao primeiro, refatorar ela e tirar os pedacos genericos e transformar num framework do que tentar advinhar o que eh generico e o que nao eh. Alias, risque a palavra advinhar do dicionario.

Ele adivinhou o que poderia acontecer utilizando essa abordagem e eu tive a péssima experiência de passar por isso.

Não sendo xiita, afirmo que cada caso é um caso. Está certo que em determinados projetos é necessário construir um determinado número de classes que executam processos comuns entre sistemas. Mas é para ser feito só o básico e o necessário, nada mais além do que isso, porque senão irá virar um framework!

Referências

Vídeo promocional do PUJ

Postado por Rafael Carneiro on 22nd May, 2008

Hildeberto Mendonça, coordenador do CEJUG, criou um vídeo promocional do PUJ (Prêmio Universitário Java). O PUJ foi criado pelo Felipe Gaúcho (também coordenador do CEJUG) e é um campeonato de trabalhos universitários para alunos que estão devidamente matriculados e que residem no Estado do Ceará.

Veja o vídeo:

You need to a flashplayer enabled browser to view this YouTube video

Comentários do Café com Tapioca de maio

Postado por Rafael Carneiro on 18th May, 2008

Comentários

Ocorreu no último sábado (17/05/08) na FLF o Café com Tapioca com as palestras Entendendo Domain Driven Design, Desmistificando JavaME e Integração Contínua com CruiseControl: qualidade e agilidade em projetos Java, ministrada pelo Rafael Ponte, Vando Batista e Luthiano Vasconcelos, respectivamente. O evento contou com a participação de 70 pessoas.

Os palestrantes transmitiram com objetividade e proficiência, atingindo a expectativa do público. Gostaria de parabenizar a performance de Luthiano Vasconcelos, que iniciou a sua apresentação sem o material estar disponível (por conta de problemas técnicos nos aparelhos da instituição). Luthiano falou por cerca de vinte e cinco minutos sem o auxílio de slides, abordando claramente o conteúdo de sua apresentação para os participantes.

Foi criado neste evento o movimento Shoes is watching, uma brincadeira criada para a palestra do Rafael Ponte. Como foi prometido na lista, os primeiros vinte participantes ganharam uma impressão do movimento.

Nos sorteios, os participantes ganharam livros (JavaME e CruiseControl), assinaturas de revistas (Java Magazine, SQL Magazine e WebMobile) e chícaras da Argohost. Após o evento, alguns membros foram para a confraternização no Parque Recreio.

Como no evento passado, o membro Rafael Tabosa falou um pouco sobre os principais programas do CEJUG, eventos internacionais e sobre o Café com Tapioca. A cada evento cresce o apoio dos membros nos eventos.

O evento foi transmitido ao vivo para todo o mundo, com o apoio da Argohost e da TV Software Livre. Em alguns dias o vídeo completo do evento estará disponível para download.

Material

Página do evento

Fotos

Vídeos

You need to a flashplayer enabled browser to view this YouTube video

You need to a flashplayer enabled browser to view this YouTube video

You need to a flashplayer enabled browser to view this YouTube video

You need to a flashplayer enabled browser to view this YouTube video

You need to a flashplayer enabled browser to view this YouTube video

You need to a flashplayer enabled browser to view this YouTube video

Alimentos arrecadados

Os alimentos doados pelos participantes deste mês e do mês de março serão entregues para instituições de caridade.

Próximo Café com Tapioca

Em junho ocorrerá o próximo Café com Tapioca que será ministrado por Augusto Pedroza, Marcelo Carvalheiro e Alan Fagot. Os temas das palestras serão incluídas em breve na página do evento.

Dúvidas, críticas e sugestões

cafecomtapioca@cejug.org

Série EJB 3.0: Interceptors

Postado por Rafael Carneiro on 12th May, 2008

Introdução

Uma das novidades da versão 3.0 do EJB são os Interceptors, uma maneira ainda rudimentar de utilizar AOP (Aspect Oriented Programming) em aplicações que utilizam EJB, o inverso do que ocorre com aplicações que utilizam o Spring (falarei sobre isso em outro post). AOP é um paradigma chamado de separation of concerns, que tem como característica quebrar o programa em diversas partes para interferir em seu processamento.

Segundo a especificação, um Interceptor é uma classe POJO (Plain Old Java Object) que não precisa ser anotada ou configurada como um session bean (utilizando as anotações @Stateless ou @Statefull). Ela deve conter um método método público anotado com @AroundInvoke, que retorna um Object, possuir o objeto InvocationContext como parâmetro e lançar a exceção Exception. Ela pode obter recursos do ENC (Enterprise Naming Context) JNDI, como injeção de dependências através da anotação @EJB, recursos através da anotação @Resource e o objeto EntityManager, através da anotação @PersistenceContext.

O objeto InvocationContext contém métodos que retornam a instância do objeto interceptado, bem como seus parâmetros e também um objeto Method que retorna o método que foi interceptado. A lógica de sua utilização gira em torno do método proceed desse objeto, pois quando ele é chamado o método interceptado será executado. Se no ciclo de processamento de um Interceptor um método tiver anotado com @AroundInvoke, o ciclo executará primeiro o Interceptor do método interceptado. Após isto o ciclo será executado normalmente.

Portanto, a lógica da utilização de Interceptors é gerar ou obter informações antes ou depois do método proceed ser chamado.

Para utilizar seus Interceptors em seus EJBs, basta utilizar a anotação @Interceptors(Class[] clazz). Essa anotação pode ser utilizada de duas formas: em métodos ou em classes. Se você utilizá-la em classes, todos os métodos dessa classe serão interceptados. Utilize a anotação @ExcludeClassInterceptors caso queira que seus métodos não sejam interceptados.

Caso não queira utilizar anotações, os Interceptors também podem ser configurados via arquivos XML. Registros (logs), segurança, auditoria e transações são exemplos mais comuns da utilização de Interceptors.

Criando a aplicação

Como IDE utilizei o Eclipse Europa (webtools) e o JBoss 4.2 como servidor de aplicação. No Eclipse, crie um projeto EJB Project (File - New - Project - EJB - EJB Project). Lembre-se de configurar o projeto com o JBoss 4.2, EJB 3.0 e Java 5.0 ou 6.0.

Para fazer o deploy do projeto basta clicar com o botão direito do mouse e escolha a opção Export - EJB JAR File. Feito isso, copie o arquivo gerado (.jar) e coloque na pasta ${CLASSPATH_DO_SEU_JBOSS}/server/default/deploy do seu JBoss. Inicialize o servidor pelo Eclipse (configure-o na opção Servers) ou pelo prompt de commando executando o comando ${CLASSPATH_DO_SEU_JBOSS}/bin/run.bat.

Códigos

AuditPersonInterceptor

public class AuditPersonInterceptor {	/**

  * This method contains the logic for intercepting the flow.

  *

  * @param invocationContext

  * @return

  * @throws Exception

  */

 @AroundInvoke

 public Object auditPerson(InvocationContext invocationContext)

 		throws Exception {

System.out.println("Before method execute...");

Object proceed = invocationContext.proceed();

System.out.println("After method execute...");

return proceed;

 }

}

PersonService

@Remote

public interface PersonService {	/**

  * Insert an Person.

  */

 public void insertPerson();

}

PersonServiceBean

@Stateless

public class PersonServiceBean implements PersonService {	/*

  * (non-Javadoc)

  *

  * @see org.rafaelcarneiro.service.PersonService#insertPerson()

  */

 @Override

 @Interceptors(AuditPersonInterceptor.class)

 public void insertPerson() {

System.out.println("Inserting an Person...");

}

}

Client

public class Client {	/**

  * Method main that obtain the EJB from JNDI and insert an Person.

  *

  * @param args

  * @throws Exception

  */

 public static void main(String[] args) throws Exception {

Context context = new InitialContext();

PersonService personService = (PersonService) context

 			.lookup("PersonServiceBean/remote");

personService.insertPerson();

}

}

Comentários dos códigos

  • AuditPersonInterceptor: representa o nosso Interceptor;
  • PersonService: interface remota para o session bean;
  • PersonServiceBean: session bean do tipo Stateless (sem estado) que implementa a interface remota PersonService e contém o método a ser interceptado;
  • Client: classe que obtém e executa o session bean PersonServiceBean.

Executando

Ao executar a aplicação no JBoss, você verá as mensagens abaixo no console do JBoss:

INFO [STDOUT] Before method execute…
INFO [STDOUT] Inserting an Person…
INFO [STDOUT] After method execute…

Conclusão

EJB 3.0 veio para simplificar o desenvolvimento de softwares baseado em componentes, usando massivamente annotations e diminuindo a quantidade de arquivos e o trabalho com configurações. Interceptor é fácil de ser implementado, basta a utilização de algumas anotações. Como mencionei na introdução desse artigo, os Interceptors do EJB 3.0 ainda tem muito a desejar comparando com o uso de AOP com Spring. Mas quem sabe o JCP (Java Community Procces) e a Sun melhorem seus recursos.

No próximo artigo da Série EJB 3.0 iremos abordar os Web services.

Download do código fonte

Application LearningInterceptors

Referências

Wikipedia: http://en.wikipedia.org/

The Java Community Procces: http://jcp.org/

Falando em Java 2008

Postado por Rafael Carneiro on 8th May, 2008

A tempos que acompanho o trabalho dos irmãos Silveira (Paulo e Guilherme). Ambos estão fazendo um excelente trabalho profissional mas também não esquecem da comunidade Java, onde sempre estão fazendo e participando de eventos, além de h1-logo.gifadministrarem o GUJ.

E a comunidade só tem a agradecer a eles. Este ano acontecerá a segunda edição do Falando em Java, evento técnico da Caelum, e um membro do CEJUG irá participar do evento. Renato Parente, desenvolvedor Java do NATI/UNIFOR, irá transmitir para o grupo de usuários java do Ceará as novidades do mundo Java, no Café com Tapioca de junho.

Obtenha mais informações nos blogs do Jeveaux e Edgar Silva.

Duke em: 24 horas

Postado por Rafael Carneiro on 8th May, 2008

O Jazoon 08 está cada vez mais perto! O evento acontecerá no próximo mês, para ser mais preciso no dia 23 de junho.

Você pode ver um post no meu blog sobre esse evento e um vídeo promocional abaixo:

You need to a flashplayer enabled browser to view this YouTube video

Café com Tapioca de maio - 2008

Postado por Rafael Carneiro on 6th May, 2008

No dia 17 de maio (sábado), acontecerá na FLF (Faculdade Lourenço Filho) o próximo Café com Tapioca.

Desta vez teremos mais três palestras, são elas:

  • Desmistificando o JavaME - Vando Batista
  • Entendendo Domain Driven Design - Rafael Ponte
  • Integração Contínua com CruiseControl: qualidade e agilidade em projetos Java - Luthiano Vasconcelos

Obtenha mais informações na página do evento, faça sua inscrição na página do JugEvents, não esqueça de levar um quilo de alimento não perecível e compareça na confraternização que ocorrerá após o evento.

CEJUG e você, fazendo a comunidade Java cearense crescer!

Chamada para projetos open source

Postado por Rafael Carneiro on 4th May, 2008

Participar de algum projeto open source é a melhor maneira de aprender novas tecnologias e ganhar experiência para a vida profissional. Mas, você sabe o que é um projeto open source? Open Source

Atualmente estou participando do desenvolvimento do CEJUG-Classifieds, um projeto open source que tem como objetivo retirar anúncios que não tem nada a ver com o conteúdo da lista de discussão do JUG, que é sobre Java.

Mas o que eu ganho com isso? Nada.

Pelo contrário, eu gasto tempo e energia elétrica. Mas você sabia que dá para ganhar dinheiro?

Posso enumerar vários motivos que me levam a participar de projetos open source, dois desses eu citei acima, mas vamos enumerar mais alguns:

  1. experiência
  2. ajudar a comunidade
  3. aprender inglês
  4. trabalho em equipe
  5. aprender novas tecnologias

Participo de diversas listas de discussão sobre Java do Brasil e do mundo e vejo a quantidade exorbitante de anúncios de todos os tipos, como: venda de livros e vouchers, cursos, revistas, aparelhos eletrônicos, computadores, etc.

Dentre as listas de discussão que participo, a lista do PBJUG é uma das que me chama mais atenção. São vários e-mails diários e membros competentes sanando as dúvidas.  Recentemente um membro enviou um e-mail anunciando a venda de um aparelho eletrônico, e o Rodrigo Rebouças perguntou se alguém queria implementar um sistema de classifidados. Bem, o CEJUG-Classifieds é open source e pode ser facilmente utilizado por outros JUGs.

Portanto, faço uma chamada para quem quiser participar desse projeto.

Material do Café com Tapioca de abril

Postado por Rafael Carneiro on 15th April, 2008

No último sábado (12/04/08), palestrei juntamente com o Tarso Bessa sobre o tema Os melhores do mundo: um comparativo entre Spring e EJB 3.0.

O intuito foi mostrar como fizemos as features de uma aplicação JavaEE utilizando as duas tecnologias, como: injeção de dependência, segurança, serviços de mensagens, web services, etc. Palestramos no evento técnico do CEJUG, Café com Tapioca, na FANOR.

Esse tipo de palestra (em par) enriquece o conteúdo da apresentação e faz com que chame bastante a atenção do público, por ser algo diferente. Paulo Silveira e Phillip Calçado fizeram uma palestra semelhante no JustJava do ano passado.

Apresentação

Exemplos

Spring | EJB 3.0

Café com Tapioca de abril

Postado por Rafael Carneiro on 8th April, 2008

No dia 12 de abril (sábado), acontecerá na FANOR o próximo Café com Tapioca.


Desta vez teremos mais três palestras, são elas:

  • OpenSocial: construa sua rede social - Christiano Milfont
  • Conhecendo o Spring - Igo Coelho
  • Os melhores do mundo: comparativo entre Spring e EJB 3.0 - Tarso Bessa e eu :)

Obtenha mais informações na página do evento, faça sua inscrição na página do JugEvents, não esqueça de levar um quilo de alimento não perecível e compareça a confraternização que ocorrerá após o evento.

CEJUG e você, fazendo a comunidade Java cearense crescer!


Copyright © 2007 Rafael Carneiro. All rights reserved.