Meydan okuma - Generator ve Closure
Generator, yield from ve closure'la büyük veri akışı işleyen bir ETL yazarsın.
Generator ile lazy ETL hattı
Bu beş derslik uzman finalinde tüm expert konuları birleştiren bir mini uygulama yapacaksın. İlk derste ETL hattı kuruyorsun: readRows satırları tek tek yield ile üretir, transform bir closure ile her satırı dönüştürür, pipeline yield from ile iki generatorü devreder, loadAll sonucu diziye toplar.
Generator'lar büyük veriyi belleğe yüklemeden işler; her satır istendiğinde üretilir. Closure ve arrow function (fn) sayesinde dönüşüm adımı tek satırda yazılır. Bu temel, sonraki derslerde reflection ve performans katmanları için kullanılacak.
Uygulama ETL hattını yaz
ETL hattını yaz. readRows(array $rows): Generator her satırı tek tek yield ile üretir. transform(iterable $rows, callable $fn): Generator her satırı $fn ile dönüştürür. pipeline(array $rows, callable $fn): Generator yield from ile readRows + transform zincirini devreder. loadAll(iterable $rows): array tüm satırları diziye toplar.
Demo: $rows = [["name" => "kale", "price" => 5], ["name" => "defter", "price" => 15]]. pipeline'a arrow function ver: fn($r) => ["name" => strtoupper($r["name"]), "price" => $r["price"] * 2]. loadAll ile topla ve her satırı "{name}: {price}\n" olarak yazdır.
Örnek çözümü göster
her satırı yield ile üret. transform: callable fn ile her satırı dönüştür. pipeline: yield from ile readRows + transform zincirini devreder. loadAll: sonucu diziye topla. Demo'yu yaz ve çıktıyı üret.
Örnek çözüm:
<?php
// ETL hattı: readRows + transform + pipeline + loadAll
function readRows(array $rows): Generator {
foreach ($rows as $row) {
yield $row;
}
}
function transform(iterable $rows, callable $fn): Generator {
foreach ($rows as $row) {
yield $fn($row);
}
}
function pipeline(array $rows, callable $fn): Generator {
yield from transform(readRows($rows), $fn);
}
function loadAll(iterable $rows): array {
$out = [];
foreach ($rows as $row) {
$out[] = $row;
}
return $out;
}
// Demo:
$rows = [
["name" => "kale", "price" => 5],
["name" => "defter", "price" => 15],
];
$result = loadAll(pipeline($rows, fn($r) => [
"name" => strtoupper($r["name"]),
"price" => $r["price"] * 2,
]));
foreach ($result as $row) {
echo $row["name"] . ": " . $row["price"] . "\n";
}
Closure pipeline'ın gücü
Closure pipeline, veriyi adım adım işlemenin zarif bir yoludur. Her adım bir callable alır ve sonucu bir sonraki adıma aktarır. Generator'larla birleşince bellek dostu olur: binlerce satırı aynı anda belleğe yüklemeden işleyebilirsin.
Arrow function fn($r) => ifade tek satırlık dönüşümleri kısa yazar; dış değişkeni otomatik yakalar. yield from iç içe generator'leri tek akışta birleştirir. Bu desen sonraki derslerde reflection ve performans katmanlarına taşınır; her derste bir parça ekleyeceksin.
Kendini test et
-
yield anahtar sözcüğü ne yapar?
- Bir değeri üretir ve çağırana döndürür, sonra bekletir
- Fonksiyonu tamamen sonlandırır
- Tüm diziyi belleğe yükler
- Bir istisna fırlatır
Cevabı göster
Bir değeri üretir ve çağırana döndürür, sonra bekletir — Doğru. yield bir değer üretir, çağırana verir ve bir sonraki çağrıda kaldığı yerden devam eder.
-
yield from ifadesini tamamla
function pipeline(array $rows, callable $fn): Generator { ____ transform(readRows($rows), $fn); }Cevabı göster
function pipeline(array $rows, callable $fn): Generator { yield from transform(readRows($rows), $fn); } -
ETL ve generator kavramlarını eşleştir
- yield
- Tek değer üretir
- yield from
- İç generatorü devreder
- Generator
- Lazy iterator arayüzü
- callable
- Fonksiyon referansı