none
Dúvida sobre Orientação a Objetos RRS feed

  • 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?

    quarta-feira, 6 de abril de 2011 21:46

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
    quinta-feira, 7 de abril de 2011 13:27
  • 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.

    quinta-feira, 7 de abril de 2011 16:03

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
    quinta-feira, 7 de abril de 2011 13:27
  • 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.

    quinta-feira, 7 de abril de 2011 16:03
  • 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
    quarta-feira, 13 de abril de 2011 12:32