天天看點

想解耦必分層

想解耦必分層

我們在設計和展示一個系統架構時,經常給看到類似的架構圖,這個架構圖最明顯的特征就是将一個複雜的系統劃分了N個層次。為什麼要劃分如此多的層次,因為分層是應對系統複雜度的一種設計方式。

在分享分層思維之前,我們先來分析一下,如何評價一個架構是不是一個好的架構。

想解耦必分層

首先從形式上一定要滿足以下兩點:

職責單一,關系清晰

高内聚、低耦合

開發架構設計的核心簡單來說就是解耦和複用。

分層在計算機的世界裡并不陌生,不論是網絡分層架構(七/四層協定),還是開發架構的三層架構,都展現着分層的思維。我們從Java Web開發模式發展的過程詳細分析下分層的必要性。

階段1:JSP Model1 

想解耦必分層

Java Web誕生之初根本沒有分層的概念,展示、業務邏輯、模型都混雜在一起,當一個系統變得越來越複雜的時候,就造成了代碼難以複用,難以維護。

階段2:JSP Model2

想解耦必分層

JSP Model2模式已經可以清晰的看到MVC完整的結構了,相比與Model1,程式設計更具層次性,讓複用和維護變得更加簡單。

JSP:視圖層,用來與使用者打交道。負責接收用來的資料,以及顯示資料給使用者; 

Servlet:控制層,負責找到合适的模型對象來處理業務邏輯,轉發到合适的視圖; 

JavaBean:模型層,完成具體的業務工作。

階段3:經典的三層架構

想解耦必分層

随着大型系統的開發,業務邏輯越來越複雜,傳統的MVC的架構模式也存在一定的局限性,業務邏輯并沒有獨立抽象出來,無法實作業務邏輯和控制邏輯的解耦,業務邏輯和業務模型的解耦,MVC的設計模式最終演化為由展示層、業務邏輯層、資料通路層組成的三層架構,特别随着spring等架構的誕生和流行,三層架構已成為Java Web開發的标配了。

根據上圖所示,我對每層做一個解釋:

View層。View層即UI層,可采用的技術如JSP,Structs,SpringMVC等

Controller層。Controller表示控制器層,可采用的技術,如Servlet/Filter,Spring等

Service層。Service層表示核心服務層,向架構上層提供服務

DAO層。DAO層表示資料通路層,可采用的技術如jdbc和ORM架構(如Spring JDBC,JPA,Hibernate,Mybatis等)

Model層。Model層即表示JavaBean對象

Utilities層。Utilities層表示公共工具層

三層架構的使用帶來的主要好處:

1、解耦

上一層依賴于下一層,如果測試下一層沒有問題,那麼問題就隻有可能發現在本層了,便于發現和改正BUG。展現了“高内聚,低耦合”的思想。各個層次分工明确,将一個複雜問題簡單拆分了。

2、代碼的複用和勞動成本的減少

分層的根本在于代碼的複用和勞動成本的減少。分層的最理想化的結果是實作層與層之間的互不依賴的内部實作,所謂的即插即用!

除了我們常用的三層架構開發模式,前後端分離開發、大熱的中台架構都是分層思維的極緻展現。

我們之是以要以水準方式對整個系統進行分層,是我們下意識地确定了一個認知規則:機器為本,使用者至上。分層架構中的層次越往上,其抽象層次就越面向業務,面向使用者;分層架構中的層次越往下,其抽象層次就變得越通用,面向裝置。

分層的第二個依據是面對變化。分層時應針對不同的變化原因确定層次的邊界,嚴禁層次之間互相幹擾,或者至少将變化對各層帶來的影響降到最低。

在進行分層時,我們還應該保證同一層的元件處于同一個抽象層次,這是分層架構的設計原則。

分層架構的依賴都是自頂向下傳遞的,這也符合大多數人對分層的認知模型。從抽象層次看,層次越處于下端,就會變得越通用越公共,與具體的業務隔離得越遠。

依賴倒置原則提出了對這種自頂向下依賴的挑戰,它要求“高層子產品不應該依賴于低層子產品,二者都應該依賴于抽象。”依賴倒置原則隐含的本質是:我們要依賴不變或穩定的元素(類、子產品或層)。誰更穩定?抽象更穩定!抽象不應該依賴于細節,細節應該依賴于抽象。由此又一次驗證架構思維的核心思維是抽象思維,分層思維是基于抽象思維的擴充。

是以分層協作在實際的開發中如何應用?

堅持“面向接口設計”的原則,即“針對接口程式設計,而不是針對實作程式設計”。

靈活應用相應設計模式,比如門面模式、政策模式等。

想解耦必分層

《程式員的思維修煉》是菜根老譚結合自己的工作經曆和對這個崗位發展的認知而專門開辟的一個專欄,旨在分析程式員的職業發展的過程中我們應該鍛煉哪些思維意識,如何去合理正确的看待事物,如何形成适合自己發展的思維體系。本專欄既是對過去思考的總結,也是對自己發展所具備的能力的思考,希望這些内容能陪我成長,幫大家解疑答惑。該專欄首發今日頭條,關注我的同名頭條号擷取更及時的内容推薦。

同時,微信為菜根老譚開通了視訊号,配合着一些短視訊,講講産品研發的那點事,分析産品研發過程中出現的問題以及思考。

想解耦必分層

菜根老譚,微信公衆号:CGLT_TAN,人人都是産品經理專欄作家。經曆程式員、技術Leader、研發Leader等多種崗位。關注醫療,早教領域,擅長企業IT架構及網際網路産品架構。