(Kata17地址)[http://codekata.com/kata/kata17-more-business-rules/]
上一個(gè)Kata我們通過(guò)DSL解決了復(fù)雜規(guī)則的實(shí)現(xiàn)方法,這個(gè)Kata我們需要處理另一種規(guī)則:帶狀態(tài)的規(guī)則。
什么叫帶狀態(tài)的規(guī)則呢?顯然重點(diǎn)是“狀態(tài)”,看下面的例子:
1、商品加入購(gòu)物車,如果點(diǎn)擊下單進(jìn)入2
2、下單,如果點(diǎn)擊付款進(jìn)入3,如果取消訂單進(jìn)入4
3、付款,如果付款成功進(jìn)入5,如果付款失敗進(jìn)入6
4、取消訂單
5、商品出庫(kù),發(fā)貨,如果簽收進(jìn)入7,如果拒收進(jìn)入8
6、提醒顧客再次付款
7、訂單結(jié)束
8、售后負(fù)責(zé)處理
這是一個(gè)簡(jiǎn)化版的在線購(gòu)物流程,我們可以看到每個(gè)規(guī)則,或者說(shuō)每個(gè)階段都有一個(gè)狀態(tài),不同狀態(tài)之間又有一些關(guān)聯(lián)關(guān)系,我們的任務(wù)就是要設(shè)計(jì)一套系統(tǒng),可以實(shí)現(xiàn)帶狀態(tài)的規(guī)則并容易維護(hù)。
思路
我就直接說(shuō)思路吧。
這里其實(shí)本質(zhì)上是一個(gè)狀態(tài)機(jī),不明白的同學(xué)可以搜一下什么是狀態(tài)機(jī)。狀態(tài)機(jī)可以解決狀態(tài)以及狀態(tài)之間的跳轉(zhuǎn)關(guān)系,有了狀態(tài)機(jī)我們就可以實(shí)現(xiàn)從一個(gè)狀態(tài)跳轉(zhuǎn)到另一個(gè)狀態(tài)。
但是狀態(tài)機(jī)只是基礎(chǔ),我們?cè)诖嘶A(chǔ)之上還需要將每個(gè)規(guī)則或者說(shuō)每個(gè)狀態(tài)抽象成兩個(gè)部分,第一部分是狀態(tài)對(duì)應(yīng)的行為,第二部分是狀態(tài)跳轉(zhuǎn)。
狀態(tài)對(duì)應(yīng)的行為就是跳轉(zhuǎn)到本狀態(tài)后需要做的事情,比如2中的下單,比如3中的付款,可以看作是“一次性”的,跳轉(zhuǎn)到本狀態(tài)后就執(zhí)行。
狀態(tài)跳轉(zhuǎn)就是從本狀態(tài)跳轉(zhuǎn)到其他狀態(tài),這一般會(huì)是一個(gè)類似if語(yǔ)句的東西,不過(guò)跳轉(zhuǎn)的條件多種多樣,單獨(dú)抽象成一個(gè)部分可以更好地進(jìn)行隔離,把條件的多樣性封裝起來(lái)。
如果用面向?qū)ο髞?lái)說(shuō)的話就是三個(gè)類,Rule、Action和TransferCondition,思路很清晰了,具體的代碼就不寫(xiě)了(我一點(diǎn)都不懶?。蠹腋信d趣的可以動(dòng)手練習(xí)一下。