Carregamento lento
O carregamento lento é um padrão de projeto comumente usado em programação de computadores que consiste em atrasar o carregamento ou a inicialização de um objeto até o momento de seu uso . Isso contribui para a eficiência dos programas, evitando o pré-carregamento de objetos que podem não ser utilizados. O oposto de carregamento lento é pré-carregamento, pré-carregamento ou carregamento antecipado .
Implementações
Existem quatro maneiras comuns de implementar o carregamento lento: inicialização lenta ; proxy virtual ; fantasma e detentor de valor . Cada um tem suas próprias vantagens e desvantagens.
Inicialização lenta
Com a inicialização lenta, o objeto a ser carregado com preguiça é originalmente atribuído a um valor nulo e cada solicitação para o objeto verifica se é nulo e o cria "on the fly" antes de retorná-lo, como pode ser visto neste exemplo escrito em C# :
private int myWidgetID ;
privado Widget meuWidget = null ;
public Widget MeuWidget
{
get
{
if ( meuWidget == null )
{
meuWidget = Widget . Carregar ( myWidgetID );
}
return meuWidget ;
}
}
Ou com o operador coalescente para nulidade '??'
private int myWidgetID ;
privado Widget meuWidget = null ;
public Widget MeuWidget
{
get { return meuWidget = meuWidget ?? widget . Carregar ( myWidgetID ); }
}
Esse método é o mais simples de implementar, porém se null for um valor legítimo, pode ser necessário usar um objeto placeholder para indicar que ele não foi inicializado.
Proxy virtual
É um objeto com a mesma interface que o objeto real. Na primeira vez que seu método é chamado, ele carrega o objeto real e o delega.
Fantasma
Um "fantasma" é o objeto que você deseja carregar em um estado parcial. Bem, ele contém apenas o identificador do objeto, mas carrega seus próprios dados desde a primeira vez que uma de suas propriedades é acessada. Por exemplo, considere que o usuário está prestes a fazer uma solicitação de conteúdo de um formulário online. No momento da criação tudo o que sabemos é que algum conteúdo será acessado, mas ainda não se sabe como ou qual conteúdo. Exemplo com PHP:
$usrData = array (
"UID" = > uniqid (),
"requestTime" => microtime ( true ),
"dataType" => "" ,
"request" => "" ,
);
if ( isset ( $_POST [ 'data' ] ) && $usrData ) {
//...
}
Contêiner de Valor
Um Value Holder é um objeto genérico que lida com o comportamento de inicialização lenta e aparece no lugar dos campos do objeto:
private ValueHolder < Widget > valueHolder ;
public Widget MeuWidget
{
get
{
return valueHolder . ObterValor ();
}
}