發表文章

目前顯示的是有「開發技術類-FP-範例」標籤的文章

自救必看三大準則

範例應用程式

圖片
宣告式開發 從本章節開始,我們要開始轉變我們的觀念了,我們會停止告訴電腦該要怎麼去工作,而是透過撰寫規範來得到我們要的結果。我相信透過這種方式與無時無刻去關心所有程式碼細節相比,這會讓你感到輕鬆許多。 不同於命令式,宣告式意指我們將撰寫一些表達式的程式,而不是一步一步指示。 像是 SQL,就沒有「先做這個,再做那個」的命令。它有一個表達式來指定我們想要從哪個資料庫使用資料,我們不確定是如何執行的,要看表達式本身。當資料庫更新和 SQL 引擎優化,我們不需要改變我們查詢的方式。這是因為有許多方式來解析我們規範的表達式並得到相同的結果。 對於一些人來說,包含我自己,第一次很難掌握這種宣告式的概念,所讓我們列出一些範例來感受一下。 // 命令式 var makes = []; for ( var i = 0 ; i < cars.length; i++) { makes.push(cars[i].make); } // 宣告式 var makes = cars.map( function ( car ) { return car.make; }); 命令式第一次必須先實例化陣列。在執行後面的程式碼之前,直譯器必須先評估這個語句,然後才迭代整個 cars 的清單,在顯式的迭代中,手動增加計數器並顯示零碎的資訊給我們實在是不怎麼好。 map  版本是一個表達式。它對執行的順序沒有要求。在 map function 迭代並回傳的陣列集合,對於指定 做什麼 而不是 怎麼做 有很大的自由度。因此,它完全是一個宣告式的程式。 除了更簡潔明瞭外,map function 還可以進行優化,這樣我們的應用程式的程式碼就不需要改變了。 對那些認為「對啊,但是使用命令式迴圈比較快」的人,我建議你先去了解關於 JIT 優化的相關程式碼。這裡有一個 非常棒的影片 ,或許可以有一些啟發。 這裡是另一個範例。 // 命令式 var authenticate = function ( form ) { var user = toUser(form); return logIn(user); }; // 宣告式 var authenticate = compose(logIn, toUser); 雖然命...