2015-03-01 17 views
5

Bu oldukça genel bir sorudur. Fonksiyonel programlama, bir programın veriyi fonksiyonlar yoluyla dönüştürmek olduğu ve mutasyondan kaçınılması gerektiği fikrini (muhtemelen bir soyutlama birimi olarak görülen bir işlev dahilinde hariç) teşvik eder. İşlevsel stil JavaScript: argüman mutasyonundan kaçınmak için iyi bir uygulama?

Ancak bu programda

:

function foo (bar) { 
    bar.k1 = "bananas"; 
    return bar; 
} 

var o = { k1: "apples", k2: "oranges"}; 
var p = foo(o); 

harici değişken O sonunda, o === p (bunlar aynı nesneye referans), çubuk o için bir referans için foo içinde mutasyona uğramış, ve. Ancak işlevsel paradigma, p'nin yeni veriler olmasını bekler.

bariz çözüm argüman klonlamaktır (. E g kullanarak alt çizgi/lodash en _.clone.):

function foo (_bar) { 
    var bar = _.clone(_bar); 
    bar.k1 = "bananas"; 
    return bar; 
} 

Ama bu sorun hakkında düşünmek doğru yolu olup olmadığını merak ediyorum. FP perspektifinde, eğer mutasyona uğrayacaklarsa argüman olarak geçen nesneleri klonlamak için iyi bir uygulama olduğunu düşünür müsün? (Tüm nesnelerin kolayca klonlanamayacağını biliyorum, eğer olmasa da, basit vakalara sadık kalalım). Senin düşüncelerin?

+0

Benim 2 kuruş, dil ile çalışan ve programlama tekniklerine asılmayan kod yazmaktır. İşlevsel programlama gayet iyi ve zeki, ancak yeni bir cisme ihtiyacınız yoksa, orijinali değiştirdiğinizde, bir tane iade etme sebebiniz yok. – adeneo

+0

Bir şey yapmak istediğimde, nesneyi döndürmem gerekiyor: 'someOtherFunction (foo (o))'. Muhtemelen ne demek istediniz, bunun yeni bir nesne mi yoksa dışsal nesneye referans mı olduğu önemli değil. –

+0

Önemli mi, yoksa size bağlı değil mi? Orijinal nesneyi değiştirmeden, yeni bir tane oluşturmak için bir neden yoksa, yalnızca değiştirildikten sonra işleve iletileni döndürün. – adeneo

cevap

5

İdeal olarak, işlev her çağrıldığında yepyeni bir nesne döndürmelidir. Açıkçası performans nedenlerinden dolayı bu harika değil, bu yüzden persistent data structures var. JS için birkaç kütüphane var; immutable-js tartışmasız en popüler olanıdır. Aksi halde nesneyi mutasyona uğratmak gayet iyidir ve JS'de yaygın bir uygulamadır çünkü her proje, kalıcı veri yapılarından ve kütüphanenin ağırlığından hemen yararlanamaz.

Ayrıca, JavaScript'te her şeyin değer olarak geçtiğini, ancak değerlerin kendilerinin referans tutabileceğini unutmayın.