免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
函數(shù)式編程(FP)

面向函數(shù)范式編程(Functional programming)

  函數(shù)編程(簡(jiǎn)稱(chēng)FP)不只代指Haskell Scala等之類(lèi)的語(yǔ)言,還表示一種編程思維,軟件思考方式,也稱(chēng)面向函數(shù)編程。 編程的本質(zhì)是組合,組合的本質(zhì)是范疇Category,而范疇是函數(shù)的組合。

  首先,什么是函數(shù)式編程,這并沒(méi)有唯一定義,它只是廣泛聚合了一些編程風(fēng)格的特性,我們可以將它與面向?qū)ο缶幊蘋(píng)OP進(jìn)行對(duì)比, 兩者區(qū)別是,OOP主要聚焦于數(shù)據(jù)的區(qū)別,而FP則注重?cái)?shù)據(jù)結(jié)構(gòu)的一致性。OOP最大優(yōu)點(diǎn)是多態(tài)性和封裝;而FP優(yōu)勢(shì)是不變性及其聲明性風(fēng)格,兩者其實(shí)是正交,可互補(bǔ)的,可在同一程序中共存。

面向?qū)ο螅?/p>

  1. 數(shù)據(jù)和對(duì)數(shù)據(jù)的操作緊緊耦合

  2. .對(duì)象隱藏它們操作的實(shí)現(xiàn)細(xì)節(jié),其他對(duì)象調(diào)用這些操作只需要通過(guò)接口。

  3. .核心抽象模型是數(shù)據(jù)自己

  4. 核心活動(dòng)是組合新對(duì)象和拓展已經(jīng)存在的對(duì)象,這是通過(guò)加入新的方法實(shí)現(xiàn)的。

函數(shù)編程:

  1. 數(shù)據(jù)與函數(shù)是松耦合的

  2. 函數(shù)隱藏了它們的實(shí)現(xiàn),語(yǔ)言的抽象是函數(shù),以及將函數(shù)組合起來(lái)表達(dá)。

  3. 核心抽象模型是函數(shù),不是數(shù)據(jù)結(jié)構(gòu)

  4. 核心活動(dòng)是編寫(xiě)新的函數(shù)。

  5. 變量缺省是不變的,減少可變性變量的使用,并發(fā)性好

  那么OOP和FP在業(yè)務(wù)領(lǐng)域是否有勝者呢? 我們大部分業(yè)務(wù)邏輯是這樣寫(xiě):


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是非常類(lèi)似FP,它能滲透到業(yè)務(wù)中,它使用一致的數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)表結(jié)構(gòu)Schema),一些基本函數(shù)能組合成很多查詢(xún)語(yǔ)句,它是declarative聲明式的, 也就是說(shuō),寫(xiě)出的SQL是告訴數(shù)據(jù)庫(kù)我需要什么,數(shù)據(jù)庫(kù)就為你返回,而不必指定數(shù)據(jù)庫(kù)如何具體去查詢(xún)。

  聲明式編程和命令式編程區(qū)別? FP的主要特點(diǎn)是它們描述它們要'什么',而不是如何實(shí)現(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)格的編程特點(diǎn):

  1. 第一等公民是函數(shù)

  2. 帶有閉包的Lambdas/Anonymous函數(shù)

  3. 不變性,大部分無(wú)態(tài)處理,沒(méi)有狀態(tài)和變量

  4. 高并發(fā)

  5. 無(wú)副作用的調(diào)用

  6. 通過(guò)tail call實(shí)現(xiàn)遞歸的性能優(yōu)化。

  7. 模式匹配(Haskell, Erlang)

  8. 懶賦值(Miranda, Haskell)

  9. Homoiconicity(類(lèi)似LISP)

  如果說(shuō)OOP還有很多人可能受靜態(tài)數(shù)據(jù)思路影響,那么FP 帶來(lái)完全是動(dòng)態(tài)事件,F(xiàn)P讓我們直接用動(dòng)詞思考,用方法函數(shù)解決問(wèn)題,比如兩個(gè)賬號(hào)之間的轉(zhuǎn)帳,按照DDD等靜態(tài)領(lǐng)域建模思維,轉(zhuǎn)帳這個(gè)功能是放在賬號(hào)這個(gè)實(shí)體類(lèi)中,還是做一個(gè)服務(wù)呢?在OOP語(yǔ)言中,我們實(shí)現(xiàn)功能總是使用服務(wù)Service這樣一個(gè)概念替代,而且強(qiáng)調(diào)無(wú)態(tài)服務(wù),無(wú)態(tài)服務(wù)實(shí)際就是一個(gè)只有方法函數(shù)沒(méi)有屬性的空架子“類(lèi)”而已。 2007年的Adam Heroku一篇博文中寫(xiě)道:銀行賬戶(hù)之間轉(zhuǎn)帳的老式做法是使用數(shù)據(jù)庫(kù)事務(wù),這種做法比較剛性,正確做法是將轉(zhuǎn)帳事件存儲(chǔ)起來(lái),如果你是一個(gè)面向函數(shù)范式的思維者覺(jué)得這樣做就很正常。---來(lái)自' NOSQL存儲(chǔ)的基于事件的事務(wù)實(shí)現(xiàn) ' 。

  有很多人將FP歸結(jié)于數(shù)學(xué)思維,實(shí)際上這只看到其表面,沒(méi)有看到數(shù)學(xué)語(yǔ)言這個(gè)背后的形式邏輯,編程語(yǔ)言作為和數(shù)學(xué)同等形式語(yǔ)言,他們的核心基礎(chǔ)都是分析哲學(xué)的形式邏輯,過(guò)去的面向?qū)ο蠛芏嘣O(shè)計(jì)原則也來(lái)源于形式邏輯,見(jiàn):蒯因與引用透明 ?! ?/p>

  面向?qū)ο蠛兔嫦蚝瘮?shù)一直在爭(zhēng)論,實(shí)際上純粹的OOP和純粹的FP都是極端的,對(duì)于OOP來(lái)講:存在的并一定都是對(duì)象,函數(shù)就不是對(duì)象;對(duì)于FP來(lái)說(shuō):存在的并不總是純粹的,副作用總是真實(shí)存在??傊?,面向?qū)ο髠?cè)重于分解,函數(shù)編程側(cè)重于組合。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
面向?qū)ο缶幊陶Z(yǔ)言中的函數(shù)式編程--為命令模式和訪問(wèn)者模式正名
什么是OOP
面向?qū)ο缶幊讨d衰
不要再?lài)L試函數(shù)式編程了!
C#之父Anders Hejlsberg演講解讀:編程語(yǔ)言大趨勢(shì)
圖靈社區(qū) : 閱讀 : OOP與jQuery(二):對(duì)象
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服