Lazy loading
Veriyi yalnızca gerektiğinde yükleyen lazy loading yaklaşımlarını öğrenirsin.
Lazy loading nedir?
Lazy loading, bir veriyi yalnızca gerçekten gerektiğinde yüklemektir. Hemen yüklemek yerine bir referans tutar; ilk erişimde veriyi hazırlar ve önbelleğe alır, sonraki erişimlerde önbellekten döner. Bu, kullanılmayan büyük veriyi hiç yüklememek için etkilidir; ama N+1 sorununa yol açabilir.
Lazy initialization deseni en yaygın uygulamadır: bir özellik null ise yükler, değilse döner. PHP'de bunu ya bir sınıf özelliğiyle ya da closure yakalamayla yaparsınız.
Lazy initialization sınıfı
Lazy initialization bir sınıfta şu şekilde görünür: private ?array $data = null; ile null başlatılan bir özellik, get metodu içinde === null ile denetlenir; null ise yükler ve doldurur, değilse doğrudan döner.
İlk çağrıda yükleme maliyeti ödenir, sonraki çağrılar neredeyse bedavadır. Bu desen yapılandırma, çeviri ve veri tabanı lookup'ları için uygundur. Dikkat: lazy özellik bir kez yüklendikten sonra geçersiz kalmaz, bu yüzden kaynak değişirse elle sıfırlamanız gerekir.
Uygulama LazyConfig sınıfını yaz
LazyConfig sınıfı yaz. private ?array $data = null; özelliği olsun. get(string $key): ?string metodu: $this->data === null ise $this->data'yı ['name' => 'uygulama', 'version' => '1.0'] ile doldur. $this->data[$key] ?? null döndür. $config = new LazyConfig(); oluştur. get('name'), get('version') ve get('missing') çağır. İlk ikisini echo ile yazdır, üçüncüsü için null ise '0' değilse '1' yazdır.
Örnek çözümü göster
?string { if ($this->data === null) { $this->data = ['name' => 'uygulama', 'version' => '1.0']; } return $this->data[$key] ?? null; } }. $config = new LazyConfig(); echo $config->get('name') . "\n"; echo $config->get('version') . "\n"; echo ($config->get('missing') === null ? '0' : '1') . "\n";.
Örnek çözüm:
<?php
class LazyConfig {
private ?array $data = null;
public function get(string $key): ?string {
if ($this->data === null) {
$this->data = ['name' => 'uygulama', 'version' => '1.0'];
}
return $this->data[$key] ?? null;
}
}
$config = new LazyConfig();
echo $config->get('name') . "\n";
echo $config->get('version') . "\n";
echo ($config->get('missing') === null ? '0' : '1') . "\n";
Kendini test et
-
Lazy loading kavramlarını eşleştir
- lazy loading
- İlk erişimde yükle
- eager loading
- Başta yükle
- lazy initialization
- Null ise yükle, sonra önbellekle
- deferred loading
- Ertelenmiş yükleme
-
Lazy loading ne zaman sorun yaratır?
- Liste halinde birçok öğenin ilişkisini çekerken
- Tek bir öğenin özniteliğine erişirken
- Yapılandırma dosyasını bir kez okurken
- Çöp toplayıcıyı tetiklerken
Cevabı göster
Liste halinde birçok öğenin ilişkisini çekerken — Doğru. Liste işlerinde lazy her öğe için ayrı sorgu üretir; bu N+1'dir.
-
Lazy get metodunu tamamla
public function get(string $key): ?string { if ($this->data === ____) { $this->data = $this->load(); } return $this->data[$key] ?? null; }Cevabı göster
public function get(string $key): ?string { if ($this->data === null) { $this->data = $this->load(); } return $this->data[$key] ?? null; }