Design Patterns J2EE - Value Object
--------------------------------------

Sem dúvida este é o design pattern J2EE mais famoso que temos. Por ser o
primeiro a ser apresentado, irei reforçar a importância da correta
compreensão do modelo que estamos utilizando para a descrição de cada
padrão. Detalhes sobre este modelo estão no email anterior, que pode ser
encontrado em http://www.mail-archive.com/dicas-list@;soujava.org.br/.  Vamos
ao pattern:

Nome : Value Object

Outros nomes: Detail Object, Data Transfer Object, Replicate Object

Contexto: Aplicação cliente necessita trazer grande quantidade de
informações de um serviço remoto.

Problema: Buscar uma informação por vez tem um custo de rede e performance
extremamente alto.

Solução: Trazer todos os dados de uma só vez, em uma única requisição de
rede, em um objeto chamado Value Object.

Consequências:
+ Menos invocações remotas
+ Simplifica a interface remota e sua implementação
- Se não tomar cuidado, os dados carregados por um VO podem tornar-se
inválidos.

Estratégias: Implementar um JavaBean com todos os atributos que devem ser
transportados "numa única viagem".

Exemplo:
/**
 * Classe cliente de um session bean qualquer
 * @author alegomes
 */
class Cliente
{
    void lerDadosRemotos()
    {
        Object ref = InitialContext.lookup("MeuSession");
        MeuSessionBeanHome home = PortableRemoteObject.narrow(ref,
MeuSessionBeanHome.class);
        MeuSessionBean bean = home.create();

        /* Ao inves de fazermos isso, que envolve várias conexões de
rede.....
         * atr1 = bean.getAtributo1();
         * atr2 = bean.getAtributo2();
         * atr3 = bean.getAtributo3();
         *  (....)
         */

        /* ....fazemos isto, que trará o mesmo conjunto de  informações
         *     com apenas 1 chamada remota:
         */
         atr = bean.getValueObject();
    }
}

/**
 * Interface remota do session bean
 * @author alegomes
 */
public interface MeuSessionBean extends EJBObject
{
    /* Não precisa mais desses métodos:
     * public String getAtributo1() throws RemoteException;
     * public String getAtributo2() throws RemoteException;
     * public String getAtributo3() throws RemoteException;
     *
     * Declara apenas um:
     */

    public ValueObjectQualquer getValueObject() throws RemoteException;
}

/**
 * Implementação do ValueObject
 * @author alegomes
 */
public class ValueObjectQualquer implements Serializable
{
    private String atributo1;
    private String atributo2;
    private String atributo3;
    (...)

    public void setAtributo1(String a)
    {
        atributo1 = a;
    }

    public String getAtributo1()
    {
        return atributo1;
    }

    (....) /* gets e sets para os outros atributos */
}

Observações: Originalmente, o Value Object tinha entity beans como principal
ponto de utilização, ou seja, ao invés de fazermos diversos gets e sets para
obter e modificar todos os atributos do entity, poderíamos buscar ou
submeter todas as informações com uma única chamada de rede, através do VO.
Entretanto, a partir da especificação EJB 2.0, com a presença das interfaces
locais, a "exigência" de um Value Object para cada entity bean acabou caindo
no desuso, pois o overhead de rede foi naturalmente eliminado. Em
contrapartida, a idéia do Value Object ainda permanece ativa sempre que se
falar no transporte da muitas informações entre dois nós da sua arquitetura.

Próximo design pattern J2EE: Business Delegate

Bons patterns !!!

Alexandre Gomes
Sou Jedi, Sou Java!


================================================================================
[dicas-list] circula diariamente com pequenas dicas sobre a plataforma Java e é
mais um serviço da Sociedade de Usuários Java - http://www.soujava.org.br
      *** SouJava - Fortalecendo a Comunidade Java Brasileira! ***
- Para contribuir com uma dica, envie um e-mail para [EMAIL PROTECTED]
- Participe de outras listas de discussão sobre a linguagem Java.
  Saiba mais em http://www.soujava.org.br/lista.htm
--------------------------------------------------------------------------------
- Para assinar este boletim: mailto:dicas-list-subscribe@;soujava.org.br
- Para cancelar sua assinatura: mailto:dicas-list-unsubscribe@;soujava.org.br
- Dicas anteriores: http://www.mail-archive.com/dicas-list%40soujava.org.br
- Para discutir sobre as dicas, acesse o Mundo OO (http://www.mundooo.com.br)


Responder a