系統(tǒng)架構(gòu)如何分層
all problems in computer science can be solved by another level of indirection,except of course for the problem of too many indirections. - David Wheeler
在軟件設(shè)計(jì)中分層隨處可見间景,比如我們剛剛學(xué)習(xí)java web的時(shí)候所做的dao,service,controller三層架構(gòu)遥椿,但是分層又有什么好處呢绊汹?
由于業(yè)務(wù)的復(fù)雜性喷面,分層可以讓我們站在一個(gè)相對高層的視角來分解和簡化我們的問題耗溜,此外分層可以帶來更好的測試性痴鳄,維護(hù)性昆著,靈活性县貌,可擴(kuò)展性等方面的好處。
1.簡化復(fù)雜性凑懂,結(jié)構(gòu)清晰
2.降低耦合度煤痕,隔離層次,降低依賴接谨,利于分工測試和維護(hù)
3.提高靈活性摆碉,比如mybatis替換hibernate來管理與db的交互
4.提高擴(kuò)展性,方便實(shí)現(xiàn)分布式部署
看起來十分簡單脓豪,好像把系統(tǒng)分成一定的層次巷帝,并把他們組織起來。但是其實(shí)在現(xiàn)實(shí)中扫夜,如何劃分楞泼,各個(gè)層次存在的意義,如何取舍各個(gè)層次之間的依賴關(guān)系卻沒有那么容易历谍,邊界的重合部分现拒,不同場景下的關(guān)注點(diǎn),層次內(nèi)部的具體分解以及層次的粒度都是我們需要仔細(xì)考慮的問題望侈。
什么是分層
最廣為人知的應(yīng)該就是經(jīng)典的三層架構(gòu)印蔬,展示層(presentation/user interface)、業(yè)務(wù)邏輯層(business logic)脱衙、數(shù)據(jù)訪問層(data access)侥猬。那么被廣泛的時(shí)候,我們不禁要自問一句捐韩,我們分層的依據(jù)是什么呢退唠,能否抽象出一些相同點(diǎn)和不同點(diǎn),又該在什么時(shí)候加入合適的中間層荤胁,在實(shí)踐的過程中我們又該采取什么樣的架構(gòu)瞧预?
分層的本質(zhì)
我們不妨先回到問題的起點(diǎn)上,思考到底什么是分層。
分層其實(shí)是把一系列相同或者相似的對象進(jìn)行分類并放在同一層垢油,然后在根據(jù)他們之間的依賴關(guān)系再確定上下層的依賴關(guān)系盆驹。
可以看出分層的關(guān)鍵是分類和關(guān)聯(lián)(事務(wù)的兩面性:區(qū)別和聯(lián)系)
1.分類:確定劃分標(biāo)準(zhǔn),將相關(guān)對象進(jìn)行抽象和歸類滩愁,對層之間進(jìn)行隔離躯喇,并保持層內(nèi)之間元素是高度內(nèi)聚。
2.關(guān)聯(lián):層與層以及外部是存在聯(lián)系的硝枉,需要關(guān)注不同層間的依賴與通信廉丽,保持層之間的松散耦合