Lazy loading

De Wikipedia, la enciclopedia libre

La carga diferida (en inglés lazy loading) es un patrón de diseño comúnmente usado en la programación informática que consiste en retrasar la carga o inicialización de un objeto hasta el mismo momento de su utilización. Esto contribuye a la eficiencia de los programas, evitando la precarga de objetos que podrían no llegar a utilizarse. El opuesto de la carga diferida es la carga previa, precarga o eager loading.

Implementaciones[editar]

Existen cuatro formas comunes de implementar la carga diferida: lazy initialization; virtual proxy; ghost y value holder. Cada uno tiene sus propias ventajas y desventajas.

Inicialización diferida[editar]

Con inicialización diferida, el objeto a ser cargado de manera diferida es originalmente asignado como un valor nulo y cada petición para el objeto verifica si es nulo y lo crea "sobre la marcha" antes de devolverlo, como puede verse en este ejemplo escrito en C#:

private int myWidgetID;
private Widget myWidget = null;
 
public Widget MyWidget 
{
    get 
    {
        if (myWidget == null) 
        {
            myWidget = Widget.Load(myWidgetID);
        }
        
        return myWidget;
    }
}

O con el operador coalescente para nulidad '??'

private int myWidgetID;
private Widget myWidget = null; 

public Widget MyWidget 
{
   get { return myWidget = myWidget ?? Widget.Load(myWidgetID);  }
}

Este método es el más sencillo de implementar, sin embargo, si nulo es un valor legítimo, puede hacerse necesario usa un objeto como placeholder para indicar que no ha sido inicializado.

Proxy virtual[editar]

Es un objeto con la misma interfaz que el objeto real. La primera vez que su método es llamado carga el objeto real y lo delega.

Fantasma[editar]

Un "fantasma" es el objeto que se quiere cargar en un estado parcial. Pues solo contener el identificador del objeto, pero carga sus propios datos desde la primera vez que una de sus propiedades sea accedida. Por ejemplo, considere que el usuario está a punto de hacer una petición de contenido desde un formulario en línea. Al momento de la creación todo lo que sabemos es que se accederá a cierto contenido, pero que cómo o a qué contenido se desconoce aún. Ejemplo con PHP:

$usrData = array (
    "UID" = > uniqid(),
    "requestTime" => microtime( true ),
    "dataType" => "",
    "request" => "",
);

if (isset( $_POST['data'] ) && $usrData) {
    //...

}

Contenedor de Valor[editar]

Un Contenedor de Valor es un objeto genérico que se encarga del comportamiento de la inicialización diferida y aparece en lugar de los campos del objeto:

private ValueHolder<Widget> valueHolder;
 
public Widget MyWidget 
{
    get
    {
        return valueHolder.GetValue();
    }
}

Véase también[editar]

Referencias[editar]