面向函数范式编程(Functional programming)
函數(shù)編程(簡稱FP)不只代指Haskell Scala等之類的語言,還表示一種編程思維,軟件思考方式,也稱面向函數(shù)編程。 編程的本質(zhì)是組合,組合的本質(zhì)是范疇Category,而范疇是函數(shù)的組合。
首先,什么是函數(shù)式編程,這并沒有唯一定義,它只是廣泛聚合了一些編程風(fēng)格的特性,我們可以將它與面向?qū)ο缶幊蘋OP進行對比, 兩者區(qū)別是,OOP主要聚焦于數(shù)據(jù)的區(qū)別,而FP則注重數(shù)據(jù)結(jié)構(gòu)的一致性。
面向?qū)ο?#xff1a;
函數(shù)編程:
那么OOP和FP在業(yè)務(wù)領(lǐng)域是否有勝者呢? 我們大部分業(yè)務(wù)邏輯是這樣寫:
SELECT orders.order_id, orders.order_date, suppliers.supplier_name
FROM suppliers
RIGHT OUTER JOIN orders
ON suppliers.supplier_id = orders.supplier_id
WHERE orders.order_status = 'INCOMPLETE'
ORDER BY orders.order_date DESC;
SQL是非常類似FP,它能滲透到業(yè)務(wù)中,它使用一致的數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)表結(jié)構(gòu)Schema),一些基本函數(shù)能組合成很多查詢語句,它是declarative聲明式的, 也就是說,寫出的SQL是告訴數(shù)據(jù)庫我需要什么,數(shù)據(jù)庫就為你返回,而不必指定數(shù)據(jù)庫如何具體去查詢。
聲明式編程和命令式編程區(qū)別? FP的主要特點是它們描述它們要"什么",而不是如何實現(xiàn)。而OO在其方法中,還是使用大部分命令式技術(shù)。 下面是命令式技術(shù)代碼:
var sumOfSquares = function(list) {
var result = 0;
for (var i = 0; i < list.length; i++) {
result += square(list[i]);
}
return result;
};
console.log(sumOfSquares([2, 3, 5]));
函數(shù)編程代碼如下:
var sumOfSquares = pipe(map(square), reduce(add, 0));
console.log(sumOfSquares([2, 3, 5]));
函數(shù)風(fēng)格的編程特點:
如果說OOP還有很多人可能受靜態(tài)數(shù)據(jù)思路影響,那么FP 帶來完全是動態(tài)事件,FP讓我們直接用動詞思考,用方法函數(shù)解決問題,比如兩個帳號之間的轉(zhuǎn)帳,按照DDD等靜態(tài)領(lǐng)域建模思維,轉(zhuǎn)帳這個功能是放在帳號這個實體類中,還是做一個服務(wù)呢?在OOP語言中,我們實現(xiàn)功能總是使用服務(wù)Service這樣一個概念替代,而且強調(diào)無態(tài)服務(wù),無態(tài)服務(wù)實際就是一個只有方法函數(shù)沒有屬性的空架子“類”而已。 2007年的Adam Heroku一篇博文中寫道:銀行賬戶之間轉(zhuǎn)帳的老式做法是使用數(shù)據(jù)庫事務(wù),這種做法比較剛性,正確做法是將轉(zhuǎn)帳事件存儲起來,如果你是一個面向函數(shù)范式的思維者覺得這樣做就很正常。---來自"?NOSQL存儲的基于事件的事務(wù)實現(xiàn)?" 。
有很多人將FP歸結(jié)于數(shù)學(xué)思維,實際上這只看到其表面,沒有看到數(shù)學(xué)語言這個背后的形式邏輯,編程語言作為和數(shù)學(xué)同等形式語言,他們的核心基礎(chǔ)都是分析哲學(xué)的形式邏輯,過去的面向?qū)ο蠛芏嘣O(shè)計原則也來源于形式邏輯,見:蒯因與引用透明?。
面向?qū)ο蠛兔嫦蚝瘮?shù)一直在爭論,實際上純粹的OOP和純粹的FP都是極端的,對于OOP來講:存在的并一定都是對象,函數(shù)就不是對象;對于FP來說:存在的并不總是純粹的,副作用總是真實存在。總之,面向?qū)ο髠?cè)重于分解,函數(shù)編程側(cè)重于組合。
轉(zhuǎn)載于:https://www.cnblogs.com/liangxiaofeng/p/4919041.html
總結(jié)
以上是生活随笔為你收集整理的面向函数范式编程(Functional programming)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java:网络编程之UDP的使用
- 下一篇: Linux1:Linux概述