Objetos Dependentes

Pessoal,

Como faço, em uma aplicação de grande porte, para instanciar um objeto que possue um grande número de objetos dependentes. Por exemplo, a classe Produto possue uma propriedade do tipo Fornecedor, que por sua vez possue uma propriedade do tipo Grupo.

Quando eu instanciar a classe Produto, esta irá instanciar a classe Fornecedor, que por sua vez irá instanciar a classe Grupo. Os construtores das classes citadas recebem como parâmetro um Id e acessam o banco de dados para preencher suas propriedades. Entenderam o problema? Eu corro um sério risco de instanciar um objeto e este instanciar dezenas de outros objetos.

Gostaria de saber se existe um Pattern para resolver este tipo de problema.

Qual a melhor forma de instanciar objetos de negócio que acessam o banco para preencher as propriedades?

Qualquer ajuda será de grande valia.

Muito obrigado,
Rodrigo

Procure por lazy initialization.

A idéia é só construir os objetos no momento em que o get numa dessas propriedade for dado. Isso evita instancias em demasia já que, via de regra, dificilmente todas as propriedades de todos os objetos serão vistas por seu usuário numa única execução da aplicação.

[quote=ViniGodoy]Procure por lazy initialization.

A idéia é só construir os objetos no momento em que o get numa dessas propriedade for dado. Isso evita instancias em demasia já que, via de regra, dificilmente todas as propriedades de todos os objetos serão vistas por seu usuário numa única execução da aplicação.[/quote]

Nestas horas devo dizer: “como não pensei nisso antes…”.
A idéia é perfeita, era exatamente oque eu estava precisando.

Resta apenas uma dúvida: Onde eu armazeno o “Id” dos objetos dependentes? Para que eles possam ser recuperados do banco assim que o get da propriedade for chamado. Neste caso eu devo armazenar atributos privados para armazenar os ids dos objetos dependentes?

Seguindo o exemplo anterior:
A classe Produto teria uma Propriedade do tipo Fornecedor e um atributo privado “idFornecedor”. Seria isso?

Obrigado.

Você está fazendo a persistência no braço?

Geralmente o lazy initialization é usado nas listas. Afinal, é ali que está o “grosso” dos objetos. Aí vc pode simplesmente fazer:

[code]public class Fornecedor {
public Grupo grupo = null;

public Grupo getGrupo() {
    if (grupo == null) {
         grupo = Grupo.loadFromDb(this); //Carrega a lista de grupos do fornecedor.
    }
    return grupo;
 }

}[/code]

Ah sim, outra coisa que se pode fazer é criar caches para valores que são pouco nomerosos no banco.
Sabe, daquele tipo de tabela que mais parece um enum?

Por exemplo, vamos supor que vc tenha a tabela “Cores”. Dificilmente haverá mais do que 100 cores cadastradas (já sendo bem otimista).

Então, ao invés de sempre criar um objeto Cor novo, crie um mapa com todas as cores possíveis do banco. E sempre utilize referências desse mapa.
Isso evita a duplicação de objetos que o valor é literalmente idêntico, e praticamente imutável.

Poupa memória o fato de não ter zilhões de instancias iguais, e também agiliza a performance da aplicação, já que vc não fica acessando o BD para isso. Só cuidado, lembre-se de refazer o cache se a tabela for alterada. Por isso a dica só é útil para tabelas relativamente fixas, e de poucos valores.

IoC?