2015-09-12 46 views
5

Altyazı belgelerine bakarak ve daha sık kullanılan işlevlerin kendi sürümlerimi yazmaya çalışırken, işlevsel programlama hakkında daha fazla bilgi edinmeye çalıştım.Altyazı ve lodash'ta "memoise" işlevinin uygulanması ve anlaşılması

"Memoize" ile karşılaşıyorum - kafamın etrafına dolanmakta zorluk çekiyordum ve Crockford'un 'The Good Parts' bölümünden bazı bilgiler buldum.

_.memoize = function(func) { 
    // 'cache' object is used to hold the result of the memoized fn's call 
    var cache = {}; 
    var recur = function(n) { 
     var result = cache[n]; 
     if (typeof result === 'undefined') { 
     result = func.apply(this, arguments); 
     cache[n] = result; 
     } 
     return result; 
    } 
    return recur; 
    }; 

sen .apply kullanımım bile gerekli olmadığını anlamama yardım ve misiniz ben bu koda yapabilirsiniz herhangi çekirdek iyileşme olmazsa? Yardımın için minnettarım!

+0

Evet, uygulamanızın yararı vardır, çünkü func'in kaç argümanının –

+0

koduna sahip olacağının farkında değilsiniz. Ve anlamadığın bir şey yok mu? Ya da altyazının hangi kısımlarını anlamıyorsun? – Bergi

+0

@Bergi - Bu çözüme ulaşabildim, ancak yapabileceğim herhangi bir hata veya iyileştirme olup olmadığını görmek istedim. Aşağıda bahsettiğim gibi, o zamandan beri tipolojinin kullanımını değiştirdim ve bunun yerine hasOwnProperty'ye güveniyorum. Ancak, anımsanan fonksiyonun ihtiyaç duyulandan daha fazla çalışmasını nasıl engelleyebileceğimi anlamaya çalışıyorum. – tsaiDavid

cevap

6

doğruluğu ile bazı açık konular vardır:

1) Çok yanlış sonuç verir, farklı argümanlarla bir işlev çağırarak, sadece ilk argüman değerine dayalı sonucu önbelleğe!

let add = memoize((a, b) => a + b) 
add(1, 2) 
> 3 
add(1, 3) 
> 3 

Henüz çağrılmadıysa bir işlevi temsil etmek undefined kullanmak 2), ancak undefined geçerli bir dönüş değeridir. yan etkisi iki kez olur Bakın nasıl: yerine bir şey önbellekteyse algılamak için cache.hasOwnProperty kullanabilirsiniz

let log = memoize(() => console.log('hello')) 
log() 
> hello 
log() 
> hello 

.

Bir test paketi yazmanızı öneririm. Bu hataları bulmak için testler oldukça değerlidir. İşlevinizin düzgün çalışmayabileceği diğer kenar durumlarını düşünün. Bunun gibi bağımsız programlar gerçekten test odaklı kodlamaya kendini borçludur.

+0

Hey, net cevap için çok teşekkürler. Çok yardımcı oluyor. Ben 'undefined' kullanarak hala geçerli bir geri dönüş değeri verebileceğini dikkate alarak devam ettim. Bunun yerine satır yerine "if (! Cache.hasOwnProperty (sonuç)) {' – tsaiDavid

+1

Think hakkında "var log = memoize (console.log.bind (console))); ("HasOwnProperty") giriş; ("HasOwnProperty") log ' – Bergi