我們一提及領(lǐng)域建模,就好像回到了石器時(shí)代萝毛。然而這個(gè)謎題至今還未解決项阴,就好像穴居人的生存方式,我們只能猜測(cè)笆包、推測(cè)以及演繹环揽,卻不能真實(shí)復(fù)現(xiàn)。
Martin Fowler的《分析模式》總結(jié)了諸多領(lǐng)域分析模式庵佣,Eric Evans開創(chuàng)了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的辦法薯演,至于還要老的CRC方法,用例驅(qū)動(dòng)秧了,ICONIX方法以及稍新一些的四色建模法跨扮,都在嘗試領(lǐng)域模型的建構(gòu),結(jié)果仍然差強(qiáng)人意验毡。
這個(gè)問題或許是Mission Impossible衡创,因?yàn)轭I(lǐng)域邏輯其實(shí)是一個(gè)復(fù)雜系統(tǒng),系統(tǒng)中的模型如三體一般互相影響晶通,卻又隱沒在混沌中璃氢,并不真實(shí)清晰地凸顯出來。
在許多項(xiàng)目中狮辽,我多數(shù)采用混合手法進(jìn)行建模一也。CRC、用例驅(qū)動(dòng)喉脖、領(lǐng)域驅(qū)動(dòng)以及四色建模椰苟,什么適合就選擇什么∈鬟矗可是到了最后舆蝴,似乎還是憑借著經(jīng)驗(yàn)在跟著感覺走。沒有教會(huì)領(lǐng)域建模的方法,只有可意會(huì)不可言傳的感覺洁仗。之所以還要提方法层皱,不過是事后諸葛亮而已。
幾年前接觸到CQRS(Command Query Responsibility Separation)模式赠潦,為我隱約打開了一扇窗叫胖,只是窗外的風(fēng)景有些模糊,不敢跳出去她奥。繼而是函數(shù)式思想每時(shí)每刻在顛覆我舊有的設(shè)計(jì)思想臭家,一步一步地侵蝕著OO的陣地。我沒有放棄OO這個(gè)陣地方淤,但我覺得攻守的布局可以豐富些钉赁,不拘一格才能更好地解決敵人(需求)。
最近在使用React和Redux開發(fā)前端携茂,所謂Pure Component以及Redux的reducer思想好像一陣大風(fēng)你踩,刮去了窗外朦朧的霧綃,風(fēng)景變得逐漸清晰起來讳苦。在領(lǐng)域世界的建筑墻上带膜,其實(shí)刻滿了“狀態(tài)”兩個(gè)字!
岔開一筆談?wù)劻硗獾挠∠笤铡N以诹私釪atomic數(shù)據(jù)庫(kù)的架構(gòu)設(shè)計(jì)思想時(shí)膝藕,被這么句話驚呆了:
Datomic將數(shù)據(jù)庫(kù)視為信息系統(tǒng),而信息是一組事實(shí)(facts)咐扭,事實(shí)是指一些已經(jīng)發(fā)生的事情芭挽。鑒于任何人都無法改變過去,這也意味著數(shù)據(jù)庫(kù)將累積這些事實(shí)蝗肪,而非原地進(jìn)行更新袜爪。雖然過去可以遺忘,但卻是不能改變的薛闪。這個(gè)不變性(immutability)帶來了很多重要的架構(gòu)優(yōu)勢(shì)和機(jī)會(huì)辛馆。
醍醐灌頂啊,這不是設(shè)計(jì)豁延,而是哲學(xué)昙篙!
讓我們?cè)傧胂險(xiǎn)ML里面的狀態(tài)圖以及工作流中著名的“狀態(tài)機(jī)(State Machine)”∮沼剑或許我們?cè)诮V泻苌偈褂脿顟B(tài)圖苔可,然而讓我們開開腦洞,你是否覺得:任何業(yè)務(wù)邏輯其實(shí)都可以轉(zhuǎn)換成狀態(tài)的遷移胰苏?
再看看四色建模中的“時(shí)標(biāo)性對(duì)象(moment-interval)”硕蛹,根據(jù)徐昊同學(xué)對(duì)四色建模的解構(gòu),時(shí)標(biāo)性對(duì)象是建模的起點(diǎn)硕并,這類對(duì)象的共同特質(zhì)在于它在時(shí)間線中留下了不可磨滅且不可更改的足跡法焰。根據(jù)Datomic哲學(xué)思想,顯然倔毙,曾經(jīng)存在的這些足跡或許可以湮滅埃仪,但存在的事實(shí)卻不可湮滅。于是陕赃,我們可以對(duì)這些足跡進(jìn)行“追溯”卵蛉,這就是所謂的“Event Sourcing”了。
是什么導(dǎo)致事件(Event)產(chǎn)生的么库?回到CQRS模式傻丝,就是Command;而在用例驅(qū)動(dòng)的語境中诉儒,就是用例(Use Case)葡缰;跳到函數(shù)式思想,則可以視為函數(shù)忱反。當(dāng)然泛释,你也可以認(rèn)為它是對(duì)象的行為,但如果我們將Command以及Event都視為不變的對(duì)象呢温算?
然則怜校,這些概念的本質(zhì)可否認(rèn)為就是“狀態(tài)”世界的各種表征呢?
觸摸到“真相”了嗎注竿?
Morpheus說:
真相是你是一個(gè)奴隸茄茁,尼奧。你巩割,和其他所有人一樣胰丁,生來受奴役……你給關(guān)在一所監(jiān)獄里,這監(jiān)獄你無法聞及喂分,無法品嘗锦庸,無法觸摸。這是你頭腦的監(jiān)獄蒲祈。
會(huì)否我們對(duì)領(lǐng)域世界的思考甘萧,其實(shí)就是頭腦的監(jiān)獄?
柏拉圖提出過一個(gè)著名的洞穴隱喻梆掸。他將不懂哲學(xué)的人比喻為被關(guān)在洞穴中的囚犯扬卷,這些囚犯因?yàn)楸绘i著,所以只能看著眼前的墻壁酸钦,不能轉(zhuǎn)頭怪得。他們的背后生著一堆火,他們只能看到墻上自己和其他東西的影子。他們無法回頭徒恋,不知道有火蚕断,便以為墻上的影子是實(shí)物。某一天入挣,一位囚犯逃離了洞穴亿乳,并發(fā)現(xiàn)了真相,發(fā)現(xiàn)自己以前被影子騙了径筏。如果是哲學(xué)家葛假,他定會(huì)回到洞中將真相告訴大家。但是在別人眼中滋恬,他肯定是傻子聊训。
故而,我無法解答這是否“真相”恢氯,或許我以為找到了魔眨,其實(shí)不過是火堆將領(lǐng)域建模的方法投影到墻上,而我湊巧是那個(gè)被鎖著的囚犯酿雪。
行文至此遏暴,其實(shí)我僅僅提出了問題。如果你覺得我的思緒一片混亂指黎,我會(huì)欣然朋凉,因?yàn)槟阕x懂了,我正是在清晰地描述一路走來混亂的思維過程醋安。我打算信步而行杂彭,搖頭晃腦只是為了觀賞兩邊的風(fēng)景。現(xiàn)在是春天吓揪,路畔的花園粉色桃花白色梨花開了亲怠,或許還有櫻花,因?yàn)榱懵涞囊黄黄ò暝谒镉行┌恰oL(fēng)景太好团秽,我不忍走到終點(diǎn),改天繼續(xù)說說我的思考片段罷叭首。