Convenção vs Configuração

Estava criando um managedBean com Jsf 1.2 chamado PrevisaoConsumoBean

public class PrevisaoConsumoBean {
//atributos e métodos
}

E, consequentemente, precisei mapear o mesmo no xml, configurando as futuras instâncias desta classe para o nome  previsaoConsumoBean

<managed-bean>
<managed-bean-name>previsaoConsumoBean</managed-bean-name>
<managed-bean-class>acaoComercial.gui.bean.PrevisaoConsumoBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Isto, de fato, é uma configuração necessária para que, as páginas web, ao invocarem o controller do MVC  (no nosso caso o managedBean), invoquem o nome correto referente à instância do managedBean.  Em um sistema relativamente grande, poderíamos ter até mais de 100 managedBeans, com diversas configurações como a mostrada acima, transformando o nosso arquivo .xml em uma enxurrada de configurações.

Pensando nisso, será que não seria possível fazer algo como

@ManagedBean

public class PrevisaoConsumoBean {
//atributos e métodos
}

Sendo que assim,  a convenção de nomes poderia ser o primeiro nome em minúsculo e o restante igual ao nome da classe, ou seja, previsaoConsumoBean. Caso desejássemos um nome fora da convenção como, por exemplo, “previsao”, poderia facilmente ser modificado para

@ManagedBean(name=”previsao”, scope=”session”)

public class PrevisaoConsumoBean {
//atributos e métodos
}

Pois bem, esta abordagem funciona de forma diferente da configuração xml abordada anteriormente, porque existem convenções, ou seja, se nada for especificado, a convenção é previsaoConsumoBean, diferente do xml onde é obrigatória a configuração.

Trabalhar com convenções é muito importante para a produtividade.  Fazendo uma analogia com outros mundos, ao dirigir por uma cidade nova, não é necessário ler nenhuma placa com arquivos .xml explicando como funciona o trânsito da cidade em questão. As regras de trânsito são convenções. Cardumes de peixes nadam juntos por convenção, o padrão JavaBean é uma convenção (arquivo xml para get/set? nem morto!), com isso, com todos adotando convenções, o conhecimento sobre os processos são melhores difundidos não somente entre  equipes, mas em qualquer um que precise, por algum motivo, analisar nosso código.

Repare que, as anotações por si só não são uma convenção, seria apenas mais uma forma de configuração caso não existissem os seus defaults, ou seja, suas convenções, como citado no parágrafo acima.  No mundo Java, obviamente, estas convenções não são exclusivas do JSF. Utilizando frameworks como Spring, ao criar uma classe como

@Repository

public class ProdutoDAO {

             //funcionalidades de produtoDAO

}

Automaticamente o bean desta classe pode ser chamado por qualquer outra classe gerenciada pelo Spring, pelo nome produtoDAO.  Portanto, se criarmos outra classe chamada

@Service

public class ProdutoFacade {

      @AutoWired

      private ProdutoDAO produtoDAO;

     //funcionalidades de produtoService

}

A classe ProdutoFacade receberá uma instância de ProdutoDAO automaticamente pelo contêiner do Spring, sem necessidade de qualquer configuração, porque foi utilizada a convenção, ou seja, o nome do atributo em ProdutoFacade é produtoDAO, e por convenção, este é o mesmo nome do bean no repositório ProdutoDAO.

obs: a convenção do managedBean que foi mostrada já se encontra disponível no Java EE 6 com o Jsf 2.0

About CarlosEduardoXP

Especialista em desenvolvimento de Sistemas Distribuídos, sempre aplicando boas práticas e padrões difundidos na comunidade. Auto didata, fanático por refatoração e performance, sempre buscando reutilização e testes automatizados cada vez mais eficazes.
This entry was posted in Software Development. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s