天天看點

也談分層

最近在網上看了很多關于架構的文章,比較流行的是三層架構。我也來湊個熱鬧,跟着扯一扯分層。

我們從大處往小處說,先說,什麼是架構?架構是一系列相關的抽象模式,用于指導大型軟體系統各方面的設計。它描述一個軟體系統從整體到部分的最高層次的抽象劃分。直接認為架構就是系統草圖也不為過。

根據我們關注的角度不同,架構大概有三種:

1、邏輯架構,主要描述軟體系統中元件之間的關系,例如使用者界面,資料庫,業務邏輯元件等等

2、實體架構,主要描述軟體元件是如何安裝到硬體上的。

3、系統架構,主要描述系統的非功能性特征,如可擴充性、可靠性、強壯性、靈活性、性能等。

可以看到,系統架構師必須具備軟體和硬體兩方面的過硬能力,還得有豐富的經驗。

怎麼架構一個軟體系統,這個時候,通常會用到分層。

可以說,分層就是為了架構一個好的系統,主要展現在以下幾個方面(網上主流觀點):

1、降低耦合,可以降低層與層之間的依賴。上一層僅依賴于下一層,如果測試下一層沒有問題,那麼問題就隻可能出現在本層了。這樣又利于應對需求變更,有利于排錯,有利于後期的維護。

2、簡化問題複雜度,各層分工明确,例如OSI七層模型和簡化的tcpip協定的四層模型。把一個複雜問題分解,達到化繁為簡的效果。但是,這是針對系統大小而言的,如果一個很小的系統,也可能會把簡單問題複雜化。

3、有利于團隊開發,分工合作。開發人員可以隻關注整個結構中的其中某一層,三層架構中,基本可以将工作分為界面設計人員、業務實作人員、資料庫設計人員。可以根據每個人根據自己的特長隻關注這一層的設計和實作,不必理會其他層。隻要各層接口在開發前規定好,那麼各層可以獨立開發,進化或維護。

4、有利于有利于标準化,在開發過程中可以将每層的代碼進行規範,固定開發語言的風格,可以忽略資料庫的差異,設計完善的資料通路層可以将資料庫的差異完全屏蔽,可以快速安全地實作資料庫的切換等

5、可以很容易的用新的實作來替換原有層次的實作,便于系統維護/更新。各層間通過接口解耦,接口與實作分離,進而可以非常友善的替換掉實作,或者更新實作等。

6、邏輯複用。例如原來基于B/S開發的程式現在要改成C/S,那麼隻要業務層的接口沒有改變,那麼業務層和資料層都可以直接複用。在如,隻要資料通路層接口不變,那麼使用便可以有對不同資料庫的實作。

7、友善部署。将各層開發成元件,則可以獨立部署。分層可以把各層部署在不同的地方,實作分布式系統。

針對以上七點談談自己的見解;

個人認為分層最大的好處和關鍵就在于一個方面:隔離!或者說是:抽象,然後隔離!

分層的最理想化的結果是實作層與層之間的互不依賴的内部實作,說白了,分層的目的就是為了隔離,這樣可以帶來靈活性,封裝性,可維護性,可擴充性,可靠性。這都是相對而言,因為不可避免的會在性能,複雜性,架構難度等方面帶來不利影響,這種影響可大可小,不能絕對化。

隻有隔離,才能團隊開發,分工合作,隻要各層接口在開發前規定好,那麼各層可以獨立開發,進化或維護。

隻有隔離,才能友善部署,不同類型的元件據它們所在的層分布在不同的機器上,共同組成一個基于元件的分布式系統,實作多層分布式企業的應用。

隻有隔離,才能最大限度的實作複用,隻要業務層的接口沒有改變,那麼業務層和資料層都可以直接複用。

隻有隔離,才能有更好的可維護性,各層間通過接口解耦,接口與實作分離,進而可以非常友善的替換掉實作,或者更新實作等。

談到可維護性,再多說一點,設計軟體系統是為了開發出一個易于被人了解的軟體,不能了解的東西必然無法正确的建設和維護,這個軟體如果很容易被人了解,那麼它一定易于維護,相反,如果你自認為軟體設計得很好,但不被人了解,自然也沒人可以維護(當然,如果你可以跟這個軟體耗一輩子,你能了解,你就能維護,不用管别人理不了解,反正維護也是你一個人的事情)。而高内聚,低耦合隻是被多數人認可的設計原則,因為多數人認為它幫助我們設計出易于了解,易于維護的軟體。關鍵在于:化繁為簡,如果将來有更好的原則可以實作化繁為簡,那麼人們肯定抛棄高内聚低耦合,選用更好的方式。

貌似所有關于分層的文章最後的結論都大同小異,無外乎:具體問題具體分析,即:分不分層,怎麼分層要是具體情況而定。

這裡引用網友的一段話,認為有些道理。