Bir memoize fonksiyonu yazın. Ne zaman kullanışlıdır, riskleri nelerdir?

Cevap

Memoization, saf (pure) bir fonksiyonun sonucunu argümanlara göre cache'leyip aynı argümanlarla tekrar çağrıldığında hesaplamayı atlamaktır.

function memoize(fn, resolver = (...args) => JSON.stringify(args)) {
  const cache = new Map();
  return function (...args) {
    const key = resolver(...args);
    if (cache.has(key)) return cache.get(key);
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

const slowSquare = (n) => { for (let i = 0; i < 1e8; i++); return n * n; };
const fastSquare = memoize(slowSquare);
fastSquare(9); // yavaş
fastSquare(9); // anında, cache'ten

Nerede işe yarar?

  • Pahalı ve saf hesaplamalar (ör. recursive fibonacci, büyük veri dönüşümleri).
  • Selector'lar (Reselect), React'te useMemo/React.memo aynı fikrin uygulamalarıdır.

Riskler

  • Sınırsız cache = bellek sızıntısı. Boyut limiti (LRU) veya TTL ekleyin.
  • Saf olmayan fonksiyonlarda (tarih, rastgelelik, dış state) yanlış sonuç döner.
  • JSON.stringify key'i nesne argümanlarında pahalıdır ve fonksiyonları/sırayı doğru temsil etmez; tek nesne argümanı için WeakMap kullanılabilir.
  • Async fonksiyonlarda Promise'i cache'lemek eşzamanlı istekleri tekilleştirir, ama reddedilen Promise'leri cache'ten silmeyi unutmayın.
  1. var, let ve const arasındaki fark nedir?KolayJavaScriptFrontend
  2. == ile === arasındaki fark nedir?KolayJavaScriptFrontend
  3. Closure nedir? Bir örnekle açıklayın.OrtaJavaScriptFrontend
  4. Aşağıdaki kodun çıktısı nedir? (Event loop)OrtaJavaScriptFrontend
  5. this anahtar kelimesi nasıl belirlenir? Arrow function'larda ne değişir?OrtaJavaScriptFrontend
  6. Bir debounce fonksiyonu yazın.ZorJavaScriptFrontend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle