最浪漫的抽象承諾與未來

這個世界不乏浪漫之人,但在我們程序設計的圈子里,能將代碼寫得像詩般的人,還是鳳毛麟角的。本篇文章要介紹的承諾與未來便是我覺得非常浪漫的一種抽象思維,無論是它的命名,實際解決的問題,還是它最終的代碼風格,都讓我們向詩人更近了一步。

當然,我本就是一名詩人。

基本概念

承諾與未來在很多語言里都有提及,我也無法追溯到它的最初出處了。時至今日,承諾與未來已經推演成了各種樣式,這里我們只關注它最核心的思想,而推演后的其它衍生概念,只會稍稍說明。

從Promise&Future這樣的命名來看,本身就是一件非常浪漫的事,承諾和未來,這兩個詞總會讓人不禁想起那些年少不羈的往事。多少承諾都已經煙消云散,多少未來終是未能到來,承諾與未來,年少輕狂中的輕描淡寫,卻烙印下太多的悲憤與不甘。

浪漫是感性的,但程序設計必須是理性的,所以,程序中的Promise是不能被遺忘的,未來是必須要到達的(所以,我還是更喜歡程序構建的世界)。在我們程序設計中,Future是Promise最終產生的值,它是確定的,不可變的。

就好像我們向自己心儀的女孩子許下諾言,未來會執子之手與子偕老。那么當時我們這個許諾的行為就是Promise,而最終我們期望的“執子之手與子偕老”便是未來.Future一般包含兩種結果:成功或失敗,這是非常容易理解的,當然還是可以擴充其它狀態的,比如:取消。

那么放置到我們的程序世界,把上面所述的感性思維理性的抽象后,便是Promise&Future。這種抽象思維,帶來最實際的好處,便是將異步編程模型同步化,使得我們可以很方便的將一連串相關的異步計算組織起來。最早讓我關注到Promise&Future便是在非常知名的網絡組件netty中,其源碼里大量用到了Promise&Future,Wiki里這樣的一句話算是非常精煉的總結:

future是變量的只讀占位符視圖,而promise是可寫的

到目前為止,上面所闡述的都是Promise&Future的核心思想,并且是以面向對象軟件設計的抽象思維來推導的。那么,當函數式編程火熱起來后,Promise&Future為了能夠更好的將一連串相關的異步計算組織起來,便被擴充成了Monad,關于什么是Monad,可以去看看這篇文章。擴充成了Monad后,便有了and,等等then不同的連接操作,這也使得它更加優雅,以至于讓很多人認為,做不到這樣的Promise&Future,便不是Promise&Future,這是不對的,難道沒有錦衣玉食的乞丐就不是人了么?

..........