Usuário com melhor resposta
Dúvida sobre Orientação a Objetos

Pergunta
-
A empresa que trabalho começou a projetar a migração do sistema atual que é estruturado para OO e surgiu uma dúvida quando começamos a modelar as classes.
Imaginem que tenho um objeto que tem várias referências a outros objetos. No momento que estou consultando o banco de dados para carregar esse objeto, devo criar todas as instâncias existentes nesse objeto ou devo criar esses objetos de referência apenas quando for utilizá-los de fato na aplicação?
Respostas
-
Olá Eduardo_Luiz,
A sua pergunta pede a resposta clássica: depende! Se você for utilizar mais frequentemente os dados do seu agregador (o objeto que possui as referências) e apenas as vezes os dados dos agregados, vale mais a pena carregar apenas o agregador (na primeira consulta) e os agregados sob demanda (lazy loading). Se você for utilizar todos os dados, para exibir em um relatório, por exemplo, vale mais a pena carregar tudo de uma vez (eager loading).
Uma boa idéia seria pesquisar sobre lazy loading e eager loding.
Cada caso é um caso e você deve avaliar as suas necessidades. Te recomendo utilizar alguma ferramente ORM para fazer este trabalho, como NHinbernate (http://nhforge.org/Default.aspx) ou o Linq to Entity (http://msdn.microsoft.com/en-us/library/bb386964.aspx)
Espero ter ajudado
Allan- Sugerido como Resposta André Borges Medeiros quinta-feira, 7 de abril de 2011 14:06
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 12 de abril de 2011 20:28
-
Olá Eduardo_Luiz,
Onde eu trabalho tivemos o mesmo caso, então decidimos que toda classe que possui referências de outras classes deveria ter um uma classe View(é como chamamos aqui) que herda os atributos e contém as referências para as outras classes, assim quando não precisamos usar as referências nós instanciamos a superclasse e quando precisamos usar as referências instanciamos a classe view carregando os dados nas referências.
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 12 de abril de 2011 20:29
Todas as Respostas
-
Olá Eduardo_Luiz,
A sua pergunta pede a resposta clássica: depende! Se você for utilizar mais frequentemente os dados do seu agregador (o objeto que possui as referências) e apenas as vezes os dados dos agregados, vale mais a pena carregar apenas o agregador (na primeira consulta) e os agregados sob demanda (lazy loading). Se você for utilizar todos os dados, para exibir em um relatório, por exemplo, vale mais a pena carregar tudo de uma vez (eager loading).
Uma boa idéia seria pesquisar sobre lazy loading e eager loding.
Cada caso é um caso e você deve avaliar as suas necessidades. Te recomendo utilizar alguma ferramente ORM para fazer este trabalho, como NHinbernate (http://nhforge.org/Default.aspx) ou o Linq to Entity (http://msdn.microsoft.com/en-us/library/bb386964.aspx)
Espero ter ajudado
Allan- Sugerido como Resposta André Borges Medeiros quinta-feira, 7 de abril de 2011 14:06
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 12 de abril de 2011 20:28
-
Olá Eduardo_Luiz,
Onde eu trabalho tivemos o mesmo caso, então decidimos que toda classe que possui referências de outras classes deveria ter um uma classe View(é como chamamos aqui) que herda os atributos e contém as referências para as outras classes, assim quando não precisamos usar as referências nós instanciamos a superclasse e quando precisamos usar as referências instanciamos a classe view carregando os dados nas referências.
- Marcado como Resposta Wagner dos Santos VasconcellosModerator terça-feira, 12 de abril de 2011 20:29
-
Vou te exemplificar com um caso real que tivemos aqui.
Estavamos fazendo um sistema crítico.. que fazia em média trezentos inserts e várias consultas a cada 5 segundos.
Banco normalizado? Sim!
Então.. tinhamos um monte de referências na nossa tabela principal. Trazer esses dados persistidos era impossível, pois os inserts começaram a demorar mais tempo para entrarem na base do que o fluxo de novos dados.
Sendo assim, tivemos que habilitar o Lazy loading, para que os dados fossem carregados somente quando fossem realmente necessários.
Esse foi um exemplo de quando não podiamos carregar todas as referências na hora de montar o objeto.
Agora.. tenho um pooler que faz desarquivação de requisições, em um outro sistema, que carrega todos os objetos de referência da tabela, pois são necessários, para todas as requisições. Ele roda uma vez ao dia e a criticidade é muito baixa.
Sendo assim, temos um outro cenário onde o carregamento pode ser feito para todas as referências.
Para responder a sua pergunta com certeza.. você precisa efetuar alguns testes de carga.. analisar a freqüência de utilização dessas referências.. para ai sim ter certeza se você precisa habilitar um lazy loading ou outro recurso.
Abraços
Yan Borowski Machado Analista Desenvolvedor .Net