簡體   English   中英

FP:在沒有實際狀態變化的情況下反映狀態?

[英]FP: Reflecting state in absence of actual state change?

我是一些高級函數式編程思想的新手,特別是:如何使用不可變數據。 數據結構通常是復合材料,由較小的數據結構組成。 例如,如果我們有一個家庭集合,它由一個家庭的所有成員組成。 我們可以建造這個家庭:

var flintstones = new Family().
    add(new Member({name: 'Fred'})).    //returns new instance of family 
    add(new Member({name: 'Wilma'}).    // "
    add(new Member({name: 'Pebbles'})); // "
var fred = flintstones.get({name: 'Fred'}).set({lname: 'Flintstone'});
flintstones = fred.family(); //new instance of family with latest fred.

注意改變fred並沒有真正改變flintstones 我可以抓住一個新的flintstones參考,但出於什么目的? 由於所有對象都只是快照,我無法看到保留引用的重點。 狀態更改已被抽象出來,因此我們不會使用Observer模式。 那么,關心狀態變化的GUI等依賴性事物如何處理呢? 保持事物同步的觀察功能替代方案是什么? 我沒有看到對象本身在渲染自己時有任何業務。 功能程序如何處理保持單頁webapp GUI的狀態同步?

值得一提的是Rich Hickey的講話激勵我去探索函數式編程。 我得到了他的概念,但我很難實現實際的實現(在JavaScript中)。

在你的例子中, Family應該是不可變的。 因此每次調用add必須返回一個基於現有對象內容的全新對象(它們本身是不可變的,因此復制它們不是問題)加上新的東西。 同樣,你在Fred調用的set必須返回一個基於Fred的全新系列成員,但使用不同的姓氏。 (因此, Flintstones的原始Fred根本沒有改變。)

這種功能風格的優點是,一旦你有一個對象的引用,你知道它不會改變。 如果它在構造時有效,則不必繼續檢查它是否仍然有效。 任何你可以將對象從代碼中傳出,而不必首先克隆它以保護內部副本不被更改。

如果你想了解更多關於函數式編程的知識,你可能最好嘗試一種純函數式語言,比如Haskell或F#; 嘗試在JavaScript中進行函數式編程可能會讓人感到困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM