古希臘哲學(xué)家巴門尼德認(rèn)為:“人的思想和言語都有一個(gè)載體慢显,如果你在這一時(shí)間和另外一個(gè)時(shí)間想到或者談到同樣一件東西冬耿,那就說明這件東西在這段時(shí)間內(nèi)沒有變化煤篙,如有變化的話舷嗡,你說的就不是同一件東西±蚋疲”
這讓我想起對象的實(shí)例纱注。在面向?qū)ο笤O(shè)計(jì)中,默認(rèn)情況下并沒有約束類的實(shí)例是否為可變胆胰,這意味著我們可以通過某種方式改變實(shí)例的狀態(tài)狞贱。這體現(xiàn)了實(shí)例的可變特征。然而蜀涨,若是站在內(nèi)存的角度觀察實(shí)例瞎嬉,則又不然蝎毡。無論它在內(nèi)存中存儲(chǔ)的狀態(tài)如何變化,該實(shí)例的對象標(biāo)識(shí)依舊是保持不變的氧枣。顯然沐兵,變與不變是相對的。
切換到DDD的命題中便监,所謂“實(shí)體”就是那種具有唯一的可識(shí)別可跟蹤ID的對象扎谎。這個(gè)ID并非程序語言在內(nèi)存中為它分配的對象標(biāo)識(shí),而是從領(lǐng)域角度來看烧董,由設(shè)計(jì)者為其識(shí)別毁靶,由創(chuàng)建者為其分配,因而具有領(lǐng)域語義逊移。實(shí)體的狀態(tài)當(dāng)然是可變的预吆,然而實(shí)體ID在這個(gè)實(shí)體的生命周期中卻是不可變的。
與之相對的是值對象胳泉。在DDD中拐叉,強(qiáng)調(diào)將領(lǐng)域?qū)ο髧?yán)格區(qū)分為實(shí)體和值對象。一個(gè)指導(dǎo)原則是扇商,當(dāng)你無法分辨某個(gè)領(lǐng)域?qū)ο缶烤故菍?shí)體還是值對象時(shí)凤瘦,應(yīng)優(yōu)先將其建模為值對象。這有助于我們更好地利用值對象的不可變性案铺。
不可變的對象能夠更好地維護(hù)廷粒,因?yàn)槟悴挥貌傩乃闹底兓矡o需追蹤變化的軌跡红且。不變性天生支持并發(fā)。這就衍生出面向?qū)ο笤O(shè)計(jì)中的Immutable模式涤姊。例如Java和C#中的String類型暇番,皆為Immutable模式的實(shí)現(xiàn)。
可若放在函數(shù)式編程中思喊,這種模式就顯得有些可笑了壁酬。尤其在純函數(shù)式編程的世界里,任何東西都應(yīng)該是不變的恨课。
這種不變意味著只要它存在舆乔,就不可修改,而且恒古不變剂公。這種追究變化背后的不變性希俩,一直是古希臘哲學(xué)乃至科學(xué)的基本原則。物質(zhì)是否永恒不變纲辽,在哲學(xué)中一直是引人深思的命題或假設(shè)颜武;但在函數(shù)式編程中璃搜,它幾乎被證明了。例如鳞上,在Haskell中这吻,對List的任何操作,即使調(diào)用++對List進(jìn)行合并篙议,返回的都是全新的List對象唾糯,原有對象不會(huì)有任何變化。
羅素在《西方哲學(xué)簡史》中寫道:
有的神秘主義者認(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)為世界的元素有土寇窑、氣鸦概、火、水四種甩骏。而觀中國古代哲學(xué)窗市,則有五行學(xué)說認(rèn)為宇宙萬物都由金木水火土五種基本特性的運(yùn)行和變化所構(gòu)成。
不論構(gòu)成萬物的基本元素為何饮笛,這種哲學(xué)觀不正是函數(shù)式編程的設(shè)計(jì)觀嗎咨察?