Lusta betöltés

A lusta betöltés egy létrehozási programtervezési minta. Lényege, hogy elhalasztják az objektum létrehozását akkorra, amikor tényleg szükség van rá. Megfelelő használat esetén javíthatja a program válaszadási képességét és növelheti sebességét. Ellentéte a mohó betöltés. Akkor lehet vele sokat nyerni, ha nem feltétlenül van szükség arra, hogy inicializálódjon egy objektum, aminek inicializálása költséges.

Megvalósításai szerkesztés

A mintának négy gyakran használt megvalósítási módja van: lusta inicializáció; virtuális helyettes; szellem; értéktartó.[1] Mindegyiknek megvan a maga előnye és hátránya.

Lusta inicializáció szerkesztés

Lusta inicializáció esetén az objektum referenciája először nullra állítódik. Az objektum hívásai ellenőrzik, hogy az objektum null-e, és ha igen, akkor létrehozzák. Példa C#-ban:

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

Vagy a '??' operátorral

private int myWidgetID;
private Widget myWidget = null;

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

Ezt a legegyszerűbb megvalósítani, de mivel a null antimintának is tekinthető, szükség lehet egy null objektumra a null helyett.

Virtuális helyettes szerkesztés

A virtuális helyettes megvalósítja az objektum interfészeit. Ha először hívják az objektum metódusát, akkor betölt, és delegál.

Szellem szerkesztés

A szellem egy objektum, ami betölthető részlegesen. Először csak az objektum azonosítóját tartalmazza, és a többi adatot csak akkor tölti be, amikor először szükség van rájuk. Példaként tegyük fel, hogy a kliens a tartalomhoz online formában akar hozzáférni. Létrehozáskor tudjuk, hogy magára az objektumra szükség lesz, de nem tudjuk, hogy mely adatok kellenek, és mely metódusokat fogják hívni. PHP példa:

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

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

}

Értéktartó szerkesztés

Az értéktartó generikus objektum, ami megvalósítja a lusta betöltést, és az objektum adatmezői helyett jelenik meg.

C# példa:

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

Jegyzetek szerkesztés

  1. Martin Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley, 2003, pp.200-214. ISBN 0-321-12742-0.

Fordítás szerkesztés

Ez a szócikk részben vagy egészben a Lazy loading című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.