Lazy loading
Lazy loading é um padrão de projeto de software, comumente utilizado em linguagens de programação, para adiar a inicialização de um objeto até o ponto em que ele é necessário. Isso pode contribuir para a eficiência no funcionamento de um programa, se utilizado adequadamente[1]. O oposto do carregamento lento (lazy) é o carregamento imediato (eager). Os ganhos de desempenho são especialmente significativos quando inicializar um objeto é custoso, como no caso de acesso a serviços de rede e a listas de objetos de banco de dados (ver JPA e Hibernate). Isso o torna ideal em casos onde o conteúdo é acessado em um servidor de rede, como no caso de sistemas Web[2].
Implementações[editar | editar código-fonte]
Existem quatro formas comuns de aplicação do padrão lazy loading: a inicialização lenta; um proxy virtual; um fantasma; e uma interface value holder.[3][4] Cada uma tem suas vantagens e desvantagens.
A inicialização lenta[editar | editar código-fonte]
Com a inicialização lenta, o objeto a ser carregado de modo lazy é originalmente definido como nulo, e todos os pedidos para o objeto verificam antes se ele está nulo e o criam "on the fly" antes de retorná-lo, como no seguinte exemplo em C#:
private int myWidgetID;
private Widget myWidget = null;
public Widget MyWidget
{
get
{
if (myWidget == null)
{
myWidget = Widget.Load(myWidgetID);
}
return myWidget;
}
}
Outro exemplo:
private int myWidgetID;
private Widget myWidget = null;
public Widget MyWidget
{
get { return myWidget = myWidget ?? Widget.Load(myWidgetID); }
}
Este método é o mais simples de implementar, embora se o valor nulo é um valor legítimo de retorno, pode ser necessário o uso de um objeto reservado para sinalizar que o objeto principal não foi inicializado.
Proxy virtual[editar | editar código-fonte]
Proxy Virtual é um objeto com a mesma interface que o objeto real. A primeira vez que um de seus métodos é chamado ele carrega o objeto real, que é, em seguida, delegado.
Fantasma[editar | editar código-fonte]
Um "fantasma" é um objeto que será carregado em um estado parcial. Ele pode conter apenas o identificador do objeto, mas carrega seus próprios dados na primeira vez que uma de suas propriedades é acessada. Por exemplo, considere que um usuário está prestes a solicitar um conteúdo através de um formulário on-line. No momento da criação, tudo que sabemos é que o conteúdo será acessado, mas qual ação ou conteúdo será utilizado é desconhecido. Exemplo em PHP:
$userData = array (
"UID" = > uniqid(),
"requestTime" => microtime( true ),
"dataType" => "",
"request" => ""
);
if (isset( $_POST['data'] ) && $userData) {
//...
}
Interface value holder[editar | editar código-fonte]
É uma interface (genérica) utilizada na manipulação do carregamento lento, fazendo as vezes do objeto:
private ValueHolder<Widget> valueHolder;
public Widget MyWidget
{
get
{
return valueHolder.GetValue();
}
}
Veja também[editar | editar código-fonte]
Referências
- ↑ «O que é Lazy Loading e Eager Loading?». pt.stackoverflow.com. Consultado em 23 de fevereiro de 2018
- ↑ «Lazy Loading». webpack.js.org. Consultado em 23 de fevereiro de 2018
- ↑ Martin Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley, 2003, pp.200-214. ISBN 0-321-12742-0.
- ↑ «How to: Use Lazy Loading to Load Related Objects». msdn.microsoft.com. Consultado em 23 de fevereiro de 2018