# Lazy Loading

Lazy Loading, wörtlich „faules Laden“ (treffender etwa: „müßiges Laden“), bezeichnet in der Softwareentwicklung ein Entwurfsmuster, bei dem Datenobjekte grundsätzlich Werte oder andere, abhängige Objekte bereitstellen, diese aber erst bei einer konkreten Anfrage aus der Datenquelle holen.
Das Gegenteil wird als „eager loading“ bezeichnet; hierbei werden möglichst effizient sofort alle absehbar benötigten Daten geholt.

## Gründe für die Anwendung

Grund für die Anwendung kann sein, dass es zeit- oder ressourcenaufwendig ist, den Inhalt zu holen, etwa bei einer Datenbankabfrage, einem Webservice-Request oder einer komplexen Bearbeitung, und es anfangs noch nicht klar ist, welche Daten tatsächlich benötigt werden. Bei starker Vernetzung von Datenstrukturen würden außerdem sonst u. U. umfangreiche Kaskaden immer weiterer Ladevorgänge ausgelöst.

## Implementierungsmöglichkeiten
### Verzögerte Initialisierung (lazy initialization)

    meist mit Eigenschaften (properties) im Programmcode realisiert; diese sind, von außen betrachtet, Werte oder Objekte, wobei erst bei deren Abfrage oder Veränderung der initialisierende Programmcode ausgeführt wird. So führt dann der Abruf eines erwarteten Inhalts einer Eigenschaft zur Ausführung dieses Initialisierungscodes, der diesen Inhalt tatsächlich beschafft, z. B. aus einer Datenbank.

### Virtueller Proxy

    ein nach außen gleiches Objekt mit gleicher Schnittstelle steht an Stelle des echten Objekts; bei der ersten Verwendung beschafft es die nötigen Daten und stellt sie bereit, bzw. wird ersetzt durch ein vollwertiges Objekt.

### Geist (Ghost)

    Spezialform eines Proxy, die einzelne, bekannte Eigenschaften des zu holenden Datenobjekts von Anfang an beinhaltet (z. B. ID-Nummer), so dass er eingeschränkt verwendet werden kann, ohne die echten Daten holen zu müssen.

### Value holder

    ein Hilfsobjekt, das die verzögerte Datenbeschaffung verwaltet und Daten bei Bedarf ausgibt, so dass es z. B. hinter den Wert-Eigenschaften eines Datenobjekts stehen und für dieses im Hintergrund die Werte bereitstellen kann.

## Webdesign

Im Webdesign wird Lazy Loading verwendet, um sicherzustellen, dass die Elemente, die sich aktuell innerhalb des Viewports befinden, so schnell wie möglich geladen werden. Dies wird erreicht, indem Elemente, bei denen dies nicht der Fall ist, aufgeschoben werden. So sollten beispielsweise Bilder, die sich weiter unten auf einer Website befinden, erst dann geladen werden, wenn der Nutzer zu ihnen scrollt. Ursprünglich mussten für Lazy Loading bestimmte JavaScript-Bilbiotheken verwendet werden. Seit 2019 gibt es eine native Browser-Unterstützung für Lazy Loading von Bildern und iFrames in Google Chrome, bei der Elementen, die verzögert geladen werden sollen, lediglich das Attribut loading=lazy hinzugefügt werden muss. Im Februar 2020 wurde dieses Feature in die HTML-Spezifikation der WHATWG aufgenommen. Seit April 2020 bzw. März 2022 unterstützen auch Mozilla Firefox und Safari Lazy Loading mittels HTML-Attribut.

## Risiken

Lazy Loading ist oft ein Versuch, die Zahl der Datenzugriffe zu minimieren, jedoch meist zu Lasten der Effizienz bei mehreren Zugriffen. Werden sehr viele Werte oder Unterobjekte benötigt und per Lazy Load geholt, indem beispielsweise im Programm der Objektbaum durchlaufen und die Werte und Objekte so initialisiert werden, kommt es zu einer großen Zahl von Einzelabfragen. Viele Datenquellen, wie Datenbanken, sind dafür konzipiert, mit möglichst wenigen Anfragen viele Daten zu bearbeiten und komplette Ergebnisse zurück zu liefern. Werden viele Datensätze statt mit wenigen, beschreibenden Abfragen mit einer Vielzahl von Einzelabfragen ausgelesen, ist das für die Datenquellen und Netzwerkstruktur oft eine erhebliche Belastung. Im Datenbank-Kontext wird daher auch vom SELECT N+1-Problem gesprochen: mit einer (1) Abfrage werden zunächst N Objekte geladen; dann werden für jedes dieser Objekte, also N mal, einzelne Abfragen für abhängige Werte und Objekte abgerufen.