App架構(gòu)設(shè)計(jì)經(jīng)驗(yàn)談:業(yè)務(wù)層的設(shè)計(jì)
業(yè)務(wù)層其實(shí)并不復(fù)雜,但是大部分開(kāi)發(fā)人員對(duì)其職責(zé)并沒(méi)有理解清楚,從而使其淪落為一個(gè)數(shù)據(jù)中轉(zhuǎn)站。我之前分享過(guò)的Android項(xiàng)目重構(gòu)之路系列中提到的核心層,其實(shí)就是這里所講的業(yè)務(wù)層。但有不少讀者反映,他們?cè)趯?shí)際項(xiàng)目中就只是做一下參數(shù)檢查,然后直接調(diào)用API,與展示層對(duì)接的接口基本也與API的接口一致的。這樣,業(yè)務(wù)層無(wú)疑就已經(jīng)變?yōu)榱艘粋€(gè)數(shù)據(jù)中轉(zhuǎn)站。
業(yè)務(wù)層的職責(zé)
所以,設(shè)計(jì)業(yè)務(wù)層之前,對(duì)業(yè)務(wù)層的職責(zé)要先真正理解清楚。這里,我舉兩個(gè)栗子說(shuō)明一下。
第一個(gè)是新用戶注冊(cè)的例子。注冊(cè)時(shí),界面上一般都會(huì)要求用戶輸入手機(jī)號(hào)、驗(yàn)證碼、密碼和確認(rèn)密碼。但是,API接口一般只會(huì)有三個(gè)參數(shù):手機(jī)號(hào)、驗(yàn)證碼和密碼,不會(huì)有確認(rèn)密碼。因此,調(diào)用接口之前,密碼和確認(rèn)密碼的一致性檢查是必須的。同時(shí),也要檢查這些數(shù)據(jù)是否為空、手機(jī)號(hào)是否符合規(guī)范、驗(yàn)證碼是否有效、密碼有沒(méi)有包含了特殊字符等。正確姿勢(shì)就是當(dāng)所有檢查都通過(guò)了之后,才調(diào)用API接口。最后,調(diào)用注冊(cè)接口成功后,可能還要再調(diào)用一次登錄接口,并可能將用戶登錄信息緩存起來(lái),方便用戶下次啟動(dòng)應(yīng)用時(shí)自動(dòng)登錄。所有這些都屬于業(yè)務(wù)邏輯處理,也就是業(yè)務(wù)層的工作。
第二個(gè)是涉及用戶驗(yàn)證的例子。比如,在一個(gè)電商App,當(dāng)用戶瀏覽某個(gè)商品,點(diǎn)擊購(gòu)買(mǎi)時(shí),App首先會(huì)判斷用戶是否已經(jīng)登錄,如未登錄,則會(huì)跳轉(zhuǎn)到登錄頁(yè)面讓用戶先登錄。如果已經(jīng)登錄,但token已經(jīng)過(guò)期,那需要先去獲取新的token,之后才能進(jìn)行下一步的購(gòu)物操作。這些邏輯處理,也是業(yè)務(wù)層的工作。
因此,簡(jiǎn)單點(diǎn)說(shuō),業(yè)務(wù)層就是處理業(yè)務(wù)邏輯,包括數(shù)據(jù)的檢查、業(yè)務(wù)分支的處理等。比如上面第二個(gè)例子,可能很多人就會(huì)將用戶是否已經(jīng)登錄的判斷直接在界面上做處理,當(dāng)確認(rèn)登錄后,token也是有效的之后,才調(diào)用業(yè)務(wù)層做購(gòu)買(mǎi)商品的操作,這就是導(dǎo)致業(yè)務(wù)層淪落為API的數(shù)據(jù)中轉(zhuǎn)站的直接表現(xiàn)。
業(yè)務(wù)層的交互
只有真正理解了業(yè)務(wù)層的職責(zé)之后,才能有效地設(shè)計(jì)業(yè)務(wù)層與外層的交互接口。
業(yè)務(wù)層向下,與數(shù)據(jù)層交互;向上,與展示層交互。
與數(shù)據(jù)層交互只是調(diào)用數(shù)據(jù)層的接口獲取數(shù)據(jù),而與展示層交互則需要提供接口給展示層調(diào)用。因?yàn)闃I(yè)務(wù)處理一般屬于比較耗時(shí)的操作,主要在于底層的網(wǎng)絡(luò)請(qǐng)求比較耗時(shí),所以提供給展示層的接口數(shù)據(jù)結(jié)果應(yīng)該以異步的方式提供,因此,接口上就需要提供個(gè)回調(diào)參數(shù),返回業(yè)務(wù)處理之后的結(jié)果。我之前分享過(guò)的Android項(xiàng)目重構(gòu)之路:實(shí)現(xiàn)篇有講到一種實(shí)現(xiàn)方式,可參考。
寫(xiě)在最后
業(yè)務(wù)層可以說(shuō)是一個(gè)數(shù)據(jù)加工場(chǎng),處理核心的業(yè)務(wù)邏輯。其實(shí),只要理解清楚了業(yè)務(wù)層的職責(zé),業(yè)務(wù)層就不難實(shí)現(xiàn)。
來(lái)源@Keegan小鋼(微信公眾號(hào):keeganlee_me)
?
這是基本常識(shí)好么,