從年會看聲明式編程(Declarative Programming)

React的設計貫徹了聲明式編程(Declarative Programming)的思想,今天就說一說什麼是所謂的聲明式編程

和聲明式編程相對應的是命令式編程(Imperative Programming),大部分語言的hello world都是從命令式編程開始的。

什麼是聲明式編程?可以從一個現實中的例子來說明,這個例子就是年會。

舉個年會的栗子??

作為我國科技公司的一個特色,每年春節前後都要舉行年會,忙活了一年怎麼都要熱鬧熱鬧,搞點娛樂活動,而且一定要有員工參與的娛樂活動,也就是要員工表演節目,表演節目就需要恰當的道具,所以,採購道具是年會準備中的重要一環。

每個公司準備年會節目道具的流程可能都會不一樣,這裡說一下我司Hulu的方法,技術公司的流程是非常技術化的,可謂聲明式編程的楷模

Hulu,每個組都要在年會齣節目,HR和各組節目負責人協調道具的採購,這個過程是這樣:

HR告知每一個節目負責人:「你們節目需要什麼道具?告訴我,我會去買。」

然後,每個節目負責人會和自己的組員商量節目內容,最後給HR一個道具列表,之後就等著HR通知去領道具就行了。

結束了!這就是聲明式編程的思想。

你可能會問:就這麼簡單?

回答:就這麼簡單,所有的採購、運輸、協調,都由HR來做了。

沒有對比就沒有傷害,如果是用命令式編程的思想來處理,我們看看是怎樣一個過程:

HR告知每一個節目負責人:「要開年會了,你們有XXXXX元的預算,自己想辦法去買,怎麼買去哪買自己搞定,記得要發票,拿發票填報銷申請,清楚了嗎?」

各節目負責人:「好吧。」

HR又補了一句:「對了,買完之後記得告訴我道具有多大,不然不知道租多大車運去年會現場。」

各節目負責人齊聲說:「知道了。」

然後,每個節目負責人就去淘寶天貓或者京東上去找道具,和店家討價還價,下單,要發票,回來之後填報銷申請,然後還要告訴HR道具有多大,嗯,每個節目負責人都要忙這麼一圈。

我真心希望,你所在公司不是用這種命令式編程的方式來採購年會道具的。

現在,你看到了「聲明式編程」和「命令式編程」的差別了嗎?

在聲明式編程中,開發者要做的事情只是描述「我要的是什麼樣子」,至於具體怎麼做,並不是開發者要關心的事情。在React中,每個組件通過render函數返回「這個組件應該長得什麼樣」,而不去描述「怎麼樣去讓這個組件長成這個樣子」。

在聲明式編程的Hulu年會道具採購方式中,HR相當於React,各節目負責人相當於基於React開發的組件,各節目負責人只描述自己需要什麼,而具體的採購、報銷、運輸事務都由HR完成。

與此相對的,在命令式編程的方式下,每個節目負責人都操碎了心,處理的事務很多,各組重複勞動不說,還容易出錯。

聲明式編程的好處

聲明式編程讓開發者的工作簡化了

在年會的例子里,HR和各節目負責人的介面清晰而簡單,節目負責人不用操心怎麼買,不用操心怎麼報銷,不用操心怎麼運輸,專心搞藝術創作就行。

當然,有人也許要抬杠,說:不還是有HR在操這些心嗎?

一個人操心總好過一群人操心吧,而且,我相信HR比你更會討價還價,也更會買。

React也一樣,也許你能夠用jQuery寫出超厲害的代碼,但是React處理DOM更專業,不會比你處理得更差。

聲明式編程減少了重複工作

各節目負責人的採購和報銷,其實都是重複的勞動,毫無創意可言,這種事情交給HR統一來操作,肯定會效率更高,而且不容易出錯,簡單說,HR干這些事情專業啊,專業的事情就交給專業的人去做。

React讓開發者不用再記憶jQuery那變幻無窮的DOM操作方式了,一樣也是避免了重複勞動,減少了出bug的可能。

聲明式編程留下了改進的空間

假如說,突然發現我司突然有人貢獻了一個超級會員卡,在某電商網站上買東西一折優惠,我們當然想要用上,因為這是一個巨大的改進。

在命令式編程風格下,因為每個節目負責人自己操作採購,那就要把這張超級會員卡送到每一個節目負責人手上去買;在聲明式編程風格下,各節目負責人不操心採購,只要把這張卡交給HR一個人就搞定了。

在React的世界裡,如果React有一個重大的內部結構改進,比如React Fiber,雖然演算法改頭換面,但是組件卻幾乎不用改,因為組件只操心「顯示什麼」而不操心「如何顯示」啊,當然不受影響了。

聲明式編程提供了全局協調能力

還是舉個例子,假如我們的年會節目預算有一百萬(我說的是假如),在命令式編程的風格下,HR怎麼確保不要超了預算呢?如何防止預算沒有被充分使用呢?

似乎沒有好辦法,要是完全靠各組負責人自覺,保不準某個組真的買了九十九萬的道具,那就完了,所以,一般HR用平均分或者給按人頭給每個組一個報銷額度上限,超額部分不給報銷,這樣當然可以避免超支。

但是,也有可能某些組比較樸素,群口響聲,道具只買了十幾個摺扇,這樣就白白浪費了預算,HR完全不知道如何協調,因為這些採購操作都是各組操作的,不到報銷的時候她不知道錢怎麼花的呀。

在聲明式編程的風格下,各組的採購都由HR來控制,HR就能夠全局控制一下,發現某組實際想要買的道具價格很低,那其他組的道具就可以多花一些錢,這樣一百萬基本都能花光,這樣一來,預算就充分發揮作用了。

HR也不用要求各節目負責人上報道具大小,因為收貨人是HR,她自然知道道具是多大。

在React的未來,每個組件還是只聲明「想要畫成什麼樣子」,但React卻可以改進協調演算法,讓React組件根據不同優先順序來渲染,提高用戶感知性能,但是React組件的代碼不需要改變,也是一樣的道理。

總結

希望這個年會的例子能讓大家加深對聲明式編程的理解,也祝願大家下次有一個快樂而不操心的年會,給大家拜個早年,早了11個月。

給我司打個廣告,想要了解Hulu公司在北京分舵的更多資訊,知曉技術公司的日常,請掃描下面的二維碼關注「Hulu」。

aHR0cDovL3dlaXhpbi5xcS5jb20vci9fRU1yTTBURUFobDlyUUJROXhicQ== (二維碼自動識別)

推薦閱讀:

基於 Webpack 的應用包體尺寸優化
React 實現一個漂亮的 Table
React Conf 2017 不能錯過的大起底——Day 1!
解析 Redux 源碼
我對Flexbox布局模式的理解

TAG:React | 编程 | 函数式编程 |