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'tenNerede işe yarar?
- Pahalı ve saf hesaplamalar (ör. recursive fibonacci, büyük veri dönüşümleri).
- Selector'lar (Reselect), React'te
useMemo/React.memoaynı 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.stringifykey'i nesne argümanlarında pahalıdır ve fonksiyonları/sırayı doğru temsil etmez; tek nesne argümanı içinWeakMapkullanılabilir.- Async fonksiyonlarda Promise'i cache'lemek eşzamanlı istekleri tekilleştirir, ama reddedilen Promise'leri cache'ten silmeyi unutmayın.
İlgili JavaScript soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.