說說軟件為什么要分層?
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)
來源:SegmentFault 思否社區(qū)
作者:Jason
轉(zhuǎn)載:最碼農(nóng)
背景分析
在大型軟件系統(tǒng)設(shè)計時,業(yè)務(wù)一般會相對復(fù)雜,假如所有業(yè)務(wù)實現(xiàn)的代碼都糾纏在一起,會出現(xiàn)邏輯不清晰、可讀性差,維護(hù)困難,改動一處就牽一發(fā)而動全身等問題。為了更好解決這個問題就有了我們現(xiàn)在常說的分層架構(gòu)設(shè)計。
軟件分層設(shè)計
分層設(shè)計的本質(zhì)其實就是將復(fù)雜問題簡單化,首先基于單一職責(zé)原則(SRP-Single responsibility principle)讓每個對象各司其職,各盡所能。然后再基于“高內(nèi)聚,低耦合”的設(shè)計思想實現(xiàn)相關(guān)層對象之間的交互。這樣可以更好提高程序的可維護(hù)性和可擴(kuò)展性,例如生活中的樓宇設(shè)計,生日蛋糕設(shè)計,企業(yè)的組織架構(gòu)設(shè)計等。
通訊領(lǐng)域的OSI參考模型
在計算機通訊領(lǐng)域還有典型的OSI參考模型(Open System Interconnection Reference Model),TCP/IP參考模型等,如圖所示:

其中,TCP/IP參考模型是OSI參考模型的一種網(wǎng)絡(luò)簡化通訊模型,這里不對每一層進(jìn)行介紹,具體有關(guān)OSI和TCP/IP的知識請自行進(jìn)行查閱。
互聯(lián)網(wǎng)領(lǐng)域的分層架構(gòu)
基于Java的互聯(lián)網(wǎng)架構(gòu),在進(jìn)行分層設(shè)計時,首先要對整體的系統(tǒng)分層架構(gòu)有一個基本認(rèn)識,如圖所示:

在上圖中,很多公司會根據(jù)雇員的技能特長進(jìn)行相關(guān)分工,例如有運維工程師,中間件平臺開發(fā)工程師,產(chǎn)品開發(fā)工程師,測試工程師等。我們很多初級的java程序員主要從事的是產(chǎn)品開發(fā)或者是應(yīng)用軟件(例如客戶關(guān)系管理系統(tǒng),分銷管理系統(tǒng),配送管理系統(tǒng),支付系統(tǒng)等)開發(fā),而在應(yīng)用軟件開發(fā)時,我們一般也要進(jìn)行分層設(shè)計,例如典型的MVC分層設(shè)計,我們可以參考阿里巴巴開發(fā)手冊中給出分層設(shè)計模型,如圖所示:

其中,在上圖中的箭頭表示一種直接依賴關(guān)系,開放接口層可以依賴于 Web 層,也可以直接依賴于 Service 層,其它依此類推(具體每層要實現(xiàn)的邏輯可自行查閱阿里巴巴開發(fā)手冊)。
總結(jié)(Summary)
系統(tǒng)分層設(shè)計是一種設(shè)計思想,是讓每層對象都有一個獨立職責(zé),再讓多層對象協(xié)同(耦合)完成一個完整的功能。這樣做可以更好提高系統(tǒng)可擴(kuò)展性,但同時也會增加系統(tǒng)整體運維的難度。
