寫(xiě)了這么多年后端,你知道事務(wù)腳本模式嗎?

什么是事務(wù)腳本模式

事務(wù)腳本模式(Transaction Script)可以簡(jiǎn)稱(chēng)TS模式,這個(gè)模式本身的核心思想就是名稱(chēng)中的兩個(gè)詞,即:事務(wù)與腳本。事務(wù)可以理解為實(shí)際需要執(zhí)行的一段原子業(yè)務(wù);腳本則是指的一組原子業(yè)務(wù)的編排方式。而通常來(lái)說(shuō)腳本的編排會(huì)直接映射到用戶的一個(gè)行為動(dòng)作上。

事務(wù)腳本本身可以理解是用戶動(dòng)作的一次任務(wù)編排,而觸發(fā)的方式一般直接與用戶的行為建立聯(lián)系。

由于使用的是腳本的編排方式,所以事務(wù)的組織是面向過(guò)程的。

而對(duì)于事務(wù)腳本模式,不同關(guān)聯(lián)用戶動(dòng)作的腳本所編排的事務(wù)之間一般是相互隔離的,即事務(wù)之間不會(huì)影響。但不同的腳本之間可以編排相同的事務(wù),即事務(wù)之間可以復(fù)用。

事務(wù)腳本模式的實(shí)現(xiàn)

或許經(jīng)過(guò)了MVC洗禮的開(kāi)發(fā)們就會(huì)突然發(fā)現(xiàn),我平時(shí)寫(xiě)的這個(gè)不就是食物腳本嗎?其實(shí)是這樣的,事務(wù)腳本模式的本質(zhì)是事務(wù)與事務(wù)的編排。一次用戶的動(dòng)作對(duì)應(yīng)的是一次業(yè)務(wù)請(qǐng)求。請(qǐng)求后便需要一層來(lái)進(jìn)行事務(wù)的編排,也就是腳本層。腳本層是對(duì)于事務(wù)本身的編排,所以我們還需要一層事務(wù)層。事務(wù)針對(duì)的是數(shù)據(jù)庫(kù)的多次操作,所以還有一層數(shù)據(jù)庫(kù)層。

于是我們有了:腳本層、事務(wù)層、數(shù)據(jù)庫(kù)層的三層模型。而這與經(jīng)典的三層模型是等價(jià)的,當(dāng)然如果你的框架結(jié)構(gòu)中有Handler層或者M(jìn)anager層的話,腳本層或者事務(wù)層的對(duì)應(yīng)關(guān)系是可以進(jìn)行調(diào)整的。

而對(duì)于事務(wù)腳本的實(shí)現(xiàn)模式上就可以發(fā)現(xiàn),按照事務(wù)腳本模式設(shè)計(jì)的話,其中是完全不需要任何面向?qū)ο蟮脑O(shè)計(jì)模式。所以在進(jìn)行事務(wù)腳本設(shè)計(jì)模式建模的時(shí)候,其中的任何邏輯都可以通過(guò)if、for、while等元素表達(dá)。

事務(wù)腳本的優(yōu)點(diǎn)

首先,事務(wù)腳本中的腳本編排是根據(jù)用戶行為進(jìn)行的,并且在進(jìn)行設(shè)計(jì)建模的時(shí)候只使用流程控制元素進(jìn)行。這使得事務(wù)腳本可以直接映射到業(yè)務(wù)流程上,對(duì)于業(yè)務(wù)的流程來(lái)說(shuō)有極高的可解釋性,而這對(duì)于持續(xù)優(yōu)化用戶體驗(yàn)來(lái)說(shuō)是非常重要的。

其次是實(shí)現(xiàn)簡(jiǎn)單。事務(wù)腳本模式由于是面向步驟編程,過(guò)程描述方式符合一般認(rèn)知步驟。在進(jìn)行建模設(shè)計(jì)的時(shí)候往往可以快速進(jìn)行設(shè)計(jì)并完成組織。學(xué)習(xí)曲線十分低,并且在加入了單測(cè)等業(yè)務(wù)邊界約束后進(jìn)行開(kāi)發(fā)的業(yè)務(wù)入門(mén)門(mén)檻極低。而同時(shí)由于時(shí)間簡(jiǎn)單,事務(wù)腳本模式的代碼質(zhì)量標(biāo)準(zhǔn)較好把控。

最后是事務(wù)腳本模型不需要前置領(lǐng)域知識(shí)。由于僅針對(duì)業(yè)務(wù)流程編排事務(wù),所以并不需要完整的領(lǐng)域知識(shí)。例如先按照查詢和命令對(duì)用戶動(dòng)作進(jìn)行一次劃分,然后針對(duì)業(yè)務(wù)屬性較為多的部分進(jìn)行著重建模。特別的,盡管不滿足領(lǐng)域的設(shè)計(jì)條件,但是當(dāng)數(shù)據(jù)庫(kù)是按照領(lǐng)域模型的模式進(jìn)行設(shè)計(jì)的時(shí)候,我們?nèi)匀豢梢苑Q(chēng)其為領(lǐng)域模型,雖然它實(shí)際上是一個(gè)貧血模型。,

事務(wù)腳本的缺點(diǎn)

對(duì)于這種模式的缺點(diǎn),想必每一個(gè)進(jìn)行過(guò)系統(tǒng)重構(gòu)的人都會(huì)有感受。事務(wù)腳本的核心問(wèn)題主要有兩方面。

一方面是事務(wù)腳本模型由于是通過(guò)步驟腳本對(duì)事務(wù)進(jìn)行的編排,而其中并不是進(jìn)行的領(lǐng)域相關(guān)的設(shè)計(jì)。所以當(dāng)業(yè)務(wù)擴(kuò)張腳本數(shù)量變多的時(shí)候,對(duì)應(yīng)的事務(wù)本身也會(huì)爆炸式的增長(zhǎng)(往往無(wú)法進(jìn)行合理的利用)。

同時(shí),由于事務(wù)的步驟腳本本身具有上下文關(guān)系,所以他有面向過(guò)程編程相同的缺點(diǎn):擴(kuò)展性很低。當(dāng)業(yè)務(wù)逐漸膨脹的時(shí)候,在對(duì)不同的事務(wù)進(jìn)行業(yè)務(wù)調(diào)整的時(shí)候,由于事務(wù)之間未進(jìn)行領(lǐng)域抽取與聚合,所以需要調(diào)整的內(nèi)容可能會(huì)分布在內(nèi)容的各個(gè)角落。

什么時(shí)候使用?

什么時(shí)候可以使用事務(wù)腳本模式呢?我可以結(jié)合上面的優(yōu)點(diǎn)和缺點(diǎn)給出以下兩種情況。

第一種是當(dāng)不滿足領(lǐng)域模型設(shè)計(jì)條件的時(shí)候。不論是由于技能原因,還是由于缺少領(lǐng)域?qū)<?,?dāng)進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)的背景無(wú)法滿足領(lǐng)域建模的時(shí)候,就可以使用事務(wù)腳本模式設(shè)計(jì)。這種情況往往是進(jìn)行新的業(yè)務(wù)嘗試,業(yè)務(wù)的領(lǐng)域?qū)傩圆⒉幻鞔_,或者是無(wú)法明確抽象。那這種情況下可以先進(jìn)行事務(wù)腳本模式的編寫(xiě)。

第二種是項(xiàng)目足夠單一的時(shí)候。這里的單一為業(yè)務(wù)單一、職責(zé)單一、變動(dòng)單一。可以理解成當(dāng)用戶動(dòng)作只有少量的時(shí)候,那么此時(shí)對(duì)動(dòng)作的抽象成本較高。同樣的當(dāng)項(xiàng)目職責(zé)單一,又不便于直接劃歸為某一子領(lǐng)域的時(shí)候,進(jìn)行領(lǐng)域建模無(wú)意義。而當(dāng)變動(dòng)頻率低程度小的時(shí)候,事務(wù)中方法的膨脹速度也就比較緩慢。

總的來(lái)說(shuō),當(dāng)項(xiàng)目起步、或者業(yè)務(wù)還在朦朧地試錯(cuò)期的時(shí)候,可以直接進(jìn)行事務(wù)腳本模式的編寫(xiě)。

但要注意的是,要時(shí)刻警惕事務(wù)爆炸,當(dāng)業(yè)務(wù)已經(jīng)明確或可以領(lǐng)域知識(shí)足夠后,就要考慮將事務(wù)合并抽取領(lǐng)域模型了。

最后

事務(wù)腳本模式長(zhǎng)久不衰的原因正是因?yàn)樗銐蚝?jiǎn)單。同時(shí)這讓它是最可靠的實(shí)現(xiàn)統(tǒng)一代碼規(guī)范的模式,因?yàn)槿腴T(mén)門(mén)檻足夠低,即便不熟悉的人也可以快速上手。而事務(wù)腳本模式的基礎(chǔ)上也可以對(duì)事務(wù)進(jìn)行封裝,例如使用策略模式、命令模式等結(jié)合使用對(duì)事務(wù)進(jìn)行抽象。在實(shí)際開(kāi)發(fā)的時(shí)候,也可以單獨(dú)地將業(yè)務(wù)層抽離出來(lái)通過(guò)事務(wù)腳本的方式進(jìn)行業(yè)務(wù)的調(diào)度編排,而在下游領(lǐng)域服務(wù)中再進(jìn)行領(lǐng)域建模設(shè)計(jì)。

最后,我們不應(yīng)因?yàn)樗銐蚝?jiǎn)單而感到不好意思使用,而是應(yīng)該在業(yè)務(wù)足夠簡(jiǎn)單清晰的時(shí)候選擇最合適的事務(wù)腳本模式。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容