Archive

Posts Tagged ‘JSF’

Dica em JSF: não coloque negócio nos métodos gets/sets

junho 16, 2010 1 comentário

Esse problema começa, primeiramente, com a péssima prática de criar gets/sets indiscriminadamente. Essa é uma cultura que vem de casa, ou melhor, das universidades que ensinam os alunos a criar os objetos sem comportamento, os POJO como são mais conhecidos. Até então não há nada de errado, até porque essa é uma das maneiras mais simples de entender a orientação a objetos. O problema só ocorre quando você leva esse conceito para objetos que não deveriam ser tratados como um POJO.

Vejamos um exemplo: Temos uma classe Estoque, com um atributo capacidadeTotal. Em que momento você usaria o método setCapacidadeTotal no dia-a-dia da aplicação? A não ser que o espaço físico tenha aumentado, é pouco provável que esse método seja invocado. É preciso restringir esse tipo de liberdade para não causar problemas futuros na implementação. A dica por hora é a seguinte: Só crie gets/sets que você tem certeza que serão utilizados no presente momento.

Esse é um problema que poucas pessoam encaram realmente como um problema, visto que não causa danos no código. E como esse é um caso que volta e meia aparece na lista de JSF, esse post serve como tentativa de eliminar esse mau cheiro de dentro do código. Agora mais especificamente no contexto de JSF, vejamos o exemplo do código a seguir:

<h:selectOneMenu required=”true” label=”Origem Recurso”
value=”#{linhaCreditoBean.idcidade}”>

<s:selectItems var=”cidade”
value=”#{linhaCreditoBean.cidades}”
noSelectionLabel=”Selecione” itemValue=”#{cidade.id}”
label=”#{cidade.siglacidade}” />

</h:selectOneMenu>

A maneira mais simples de se implementar o gerenciador desta página é com um atributo List de Cidade, e o método getCidade() com a consulta no banco. Bem claro e simples. Acontece que no decorrer do ciclo de vida do JSF os métodos get/sets são chamados várias vezes, dependendo do estado que o seu bean estiver atuando. O resultado é consultas indevidas e sobrecarga na aplicação.

Uma maneira simples de se resolver é criando um método somente para popular a lista. Além, é preciso avisar ao JSF que esse método deverá ser executado antes dos demais. Isso pode ser feito com a annotation @PostConstruct do JSF, ou a annotation @Create do JBoss Seam. Algo assim:

@Create
public void carregarCidades() {
cidades = dao.recuperarCidades();
}

Veja que é importante criar métodos com esse comportamento, pois no decorrer do ciclo de vida do JSF os métodos get/sets são chamados indiscriminadamente, dependendo do estado que o seu bean estiver atuando, o que gera consultas indevidas no projeto.

<h:selectOneMenu required=”true” label=”Origem Recurso”
value=”#{linhaCreditoBean.idcidade}” id=”cidade”>

<s:selectItems var=”cidade”
value=”#{linhaCreditoBean.cidades}”
noSelectionLabel=”Selecione” itemValue=”#{cidade.id}”
label=”#{cidade.siglacidade}” />

</h:selectOneMenu>