互聯(lián)網(wǎng)分層架構(gòu)的本質(zhì)是數(shù)據(jù)的移動。
互聯(lián)網(wǎng)分層架構(gòu)演變的核心原則:使上游更高效的數(shù)據(jù)采集和處理(多路復(fù)用),使下游可以屏蔽數(shù)據(jù)采集細節(jié)(封裝)。
無論數(shù)據(jù)如何移動,它最終都會聚合到客戶端。服務(wù)器的分層架構(gòu)設(shè)計已經(jīng)被討論了很多。如何播放客戶端的分層架構(gòu)設(shè)計?是否存在服務(wù)器分層架構(gòu)設(shè)計的地方?讓我們今天簡單地與大家談?wù)劇?
我們先來看一首小詩:
《Android猿》
一次
所有代碼
寫在活動
幾乎
沒有代碼
可以重復(fù)使用
每當(dāng)
請參閱活動
2000行功能
我會
想要離開
以上是團隊中文學(xué)Android程序員的自我報告。表達的核心是:幾乎所有代碼都是在Activity中編寫的(暫不理解Activity,暫時是MVC中的視圖層),沒有封裝和重用。 。
更具體的例子,微信登錄界面,點擊登錄按鈕,你可能想要執(zhí)行這個時間:
驗證用戶名和密碼
拉朋友列表
拉用戶信息
拉朋友信息
拉離線消息
如果你在微信中寫這些“登錄Activity”,你會發(fā)現(xiàn)一些非常嚴重的問題:
登錄到整個邏輯不能重復(fù)使用
登錄過程中的每個子邏輯都無法重用
假設(shè)產(chǎn)品中有一個“重新登錄然后重新登錄”的功能,步驟與登錄相同,您需要在“重新登錄活動”中復(fù)制上述代碼。
還假設(shè)產(chǎn)品中有一個地方需要提取用戶信息“rdquo;并將復(fù)制“獲取用戶信息”中的“登錄活動”代碼。
每個人都知道包裝重復(fù)使用的原則。每個人都理解復(fù)制代碼的缺點。那么為什么你仍然這樣做,讓代碼變得越來越“腐爛”,根據(jù)個人經(jīng)驗,主要有幾個原因:p>
早期的業(yè)務(wù)壓力,APP是幾個學(xué)生,沒有提前計劃
遲到的代碼變得越來越臃腫,不敢動,害怕影響功能,擔(dān)心問題,害怕責(zé)任
在項目中,函數(shù)接口用于編碼和除法。一位同學(xué)也負責(zé)MVC三部分代碼。此外,項目壓力很大。由于它是由一個人編寫的,因此無需對其進行分層。撥打更多電話很麻煩。
在項目中,有一個似乎已經(jīng)完成的需求,代碼看著它,寫在Activity中,糾結(jié)。抽象成功能?你必須改變其他人的代碼,忘記它或復(fù)制它。
…
無論歷史原因,項目原因,個人原因,每個人都知道分層抽象,代碼重用是正確的,那么有什么計劃能夠抽象這個分層,是否有一個地方可以從后端分層架構(gòu)中學(xué)習(xí)什么?
典型業(yè)務(wù)系統(tǒng)的后端架構(gòu)如下:
Web服務(wù)器層調(diào)用RPC接口,從服務(wù)層獲取數(shù)據(jù),組裝html/json,并完成數(shù)據(jù)表示
Biz-service/data-service提供了一個可重用的上游原子接口來實現(xiàn)業(yè)務(wù)邏輯,該層通過DAO層從db層獲取數(shù)據(jù)。
db層提供數(shù)據(jù)
APP端的分層架構(gòu)不是很相似嗎?或者以登錄服務(wù)為例:
(1)登錄Activity有兩個按鈕,一個確認按鈕,一個取消按鈕,點擊這兩個按鈕只能調(diào)用一個功能:
on_LoginConfirm_Click
on_LoginCancel_Click
這相當(dāng)于表示層。除了交互和表示之外,View層只能調(diào)用這兩個函數(shù)
(2)這兩個函數(shù)的實現(xiàn)由許多可重用的“原子業(yè)務(wù)邏輯”函數(shù)實現(xiàn)
驗證用戶名和密碼:bool verifyPass(name,pass)
拉好友列表:ListgetFriendList(uid)
拉用戶信息:使用rgetUserInfo(uid)
拉朋友信息:ListgetUserInfo(List)
拉離線消息:ListgetOfflineMst(uid)
這相當(dāng)于服務(wù)層,實現(xiàn)業(yè)務(wù)邏輯,提供封裝和重用
(3)“原子業(yè)務(wù)邏輯”在功能執(zhí)行過程中,需要訪問數(shù)據(jù),數(shù)據(jù)采集分為兩類:
同步采集:通過文件,內(nèi)存,本地數(shù)據(jù)庫獲取
異步提取:通常通過回調(diào)從服務(wù)器獲取
這相當(dāng)于數(shù)據(jù)層,屏蔽了上游數(shù)據(jù)采集的復(fù)雜性,使用不同的Proxy實現(xiàn)
在這種結(jié)構(gòu)下:
表示層非常輕,只調(diào)用一個函數(shù)來顯示數(shù)據(jù)
“原子業(yè)務(wù)邏輯”可以重復(fù)使用,不同的表示層活動可以隨意組合,實現(xiàn)不同的業(yè)務(wù)邏輯處理數(shù)據(jù)
代理向上游屏蔽數(shù)據(jù)采集的復(fù)雜性,為上游提供數(shù)據(jù)采集接口以獲取數(shù)據(jù)
Internet分層體系結(jié)構(gòu)的本質(zhì)是數(shù)據(jù)的移動,分層體系結(jié)構(gòu)封裝和重用的概念,以及常見的前端和后端。顯然知道如何打包和重用,為什么實現(xiàn)起來如此困難?
活動中的復(fù)雜代碼,是你的痛苦嗎?