古希臘哲學(xué)家巴門尼德認(rèn)為:“人的思想和言語都有一個(gè)載體,如果你在這一時(shí)間和另外一個(gè)時(shí)間想到或者談到同樣一件東西,那就說明這件東西在這段時(shí)間內(nèi)沒有變化,如有變化的話,你說的就不是同一件東西?!?/strong>

這讓我想起對(duì)象的實(shí)例。在面向?qū)ο笤O(shè)計(jì)中,默認(rèn)情況下并沒有約束類的實(shí)例是否為可變,這意味著我們可以通過某種方式改變實(shí)例的狀態(tài)。這體現(xiàn)了實(shí)例的可變特征。然而,若是站在內(nèi)存的角度觀察實(shí)例,則又不然。無論它在內(nèi)存中存儲(chǔ)的狀態(tài)如何變化,該實(shí)例的對(duì)象標(biāo)識(shí)依舊是保持不變的。顯然,變與不變是相對(duì)的。
切換到DDD的命題中,所謂“實(shí)體”就是那種具有唯一的可識(shí)別可跟蹤ID的對(duì)象。這個(gè)ID并非程序語言在內(nèi)存中為它分配的對(duì)象標(biāo)識(shí),而是從領(lǐng)域角度來看,由設(shè)計(jì)者為其識(shí)別,由創(chuàng)建者為其分配,因而具有領(lǐng)域語義。實(shí)體的狀態(tài)當(dāng)然是可變的,然而實(shí)體ID在這個(gè)實(shí)體的生命周期中卻是不可變的。
與之相對(duì)的是值對(duì)象。在DDD中,強(qiáng)調(diào)將領(lǐng)域?qū)ο髧?yán)格區(qū)分為實(shí)體和值對(duì)象。一個(gè)指導(dǎo)原則是,當(dāng)你無法分辨某個(gè)領(lǐng)域?qū)ο缶烤故菍?shí)體還是值對(duì)象時(shí),應(yīng)優(yōu)先將其建模為值對(duì)象。這有助于我們更好地利用值對(duì)象的不可變性。
不可變的對(duì)象能夠更好地維護(hù),因?yàn)槟悴挥貌傩乃闹底兓?,也無需追蹤變化的軌跡。不變性天生支持并發(fā)。這就衍生出面向?qū)ο笤O(shè)計(jì)中的Immutable模式。例如Java和C#中的String類型,皆為Immutable模式的實(shí)現(xiàn)。
可若放在函數(shù)式編程中,這種模式就顯得有些可笑了。尤其在純函數(shù)式編程的世界里,任何東西都應(yīng)該是不變的。
這種不變意味著只要它存在,就不可修改,而且恒古不變。這種追究變化背后的不變性,一直是古希臘哲學(xué)乃至科學(xué)的基本原則。物質(zhì)是否永恒不變,在哲學(xué)中一直是引人深思的命題或假設(shè);但在函數(shù)式編程中,它幾乎被證明了。例如,在Haskell中,對(duì)List的任何操作,即使調(diào)用++對(duì)List進(jìn)行合并,返回的都是全新的List對(duì)象,原有對(duì)象不會(huì)有任何變化。
羅素在《西方哲學(xué)簡(jiǎn)史》中寫道:
有的神秘主義者認(rèn)為永恒并不是指時(shí)間上的永久,它是獨(dú)立于時(shí)間之外的,無前無后、無因無果,也沒有邏輯可循。
我覺得函數(shù)式編程追求的不變性,可以劃入這個(gè)范疇。
赫拉克利特說:“人不能兩次踏進(jìn)同一條河流”。這是赫拉克利特終極的哲學(xué)觀,即萬物隨時(shí)在變。軟件系統(tǒng)就是這樣一條河流,它無時(shí)無刻不在變化,正如水不斷的流動(dòng),需求也總是在變化。但若拋開原子裂變、放射衰變的科學(xué)原理,我們似乎也可以將組成整條河流的每一滴水,看做是不變的基本組成要素。這個(gè)要素就是Monad中的Identity(幺元或單位元)。這個(gè)Identity表達(dá)了單一、恒等的概念,例如Int類型中加減法運(yùn)算半群(SemiGroup)中的Zero,就是一個(gè)Identity,因?yàn)榘肴褐械娜魏卧豠與Zero結(jié)合,依然是元素a本身。
水是如何組成一條河流的呢?這取決于組合子(Combinator)的設(shè)計(jì)與組合。只要我們找到萬物的基本要素,繼而設(shè)計(jì)出各種組合子,就可以演繹出世間不同的物。例如水滴雖可以組合為河流,卻也可以組合為橙汁,只要我們加入橙子的另一個(gè)組合子即可。這就是面向組合子(Combinator Oriented)的設(shè)計(jì)思想。顯然,它與面向?qū)ο蟮脑O(shè)計(jì)哲學(xué)背道而馳。
以哲學(xué)史觀之,函數(shù)式思想更符合古典的樸素哲學(xué)觀。在古希臘哲學(xué)家中,泰勒斯認(rèn)為世界的元素為水,阿那克西美尼認(rèn)為世界的元素是氣,赫拉克利特認(rèn)為世界的元素是火,而恩培多克勒則糅合了這些思想,認(rèn)為世界的元素有土、氣、火、水四種。而觀中國(guó)古代哲學(xué),則有五行學(xué)說認(rèn)為宇宙萬物都由金木水火土五種基本特性的運(yùn)行和變化所構(gòu)成。
不論構(gòu)成萬物的基本元素為何,這種哲學(xué)觀不正是函數(shù)式編程的設(shè)計(jì)觀嗎?