先來看一棵樹,有樹幹,樹枝,樹葉組成。樹是乙個整體,我們可以很清晰的識別到一棵樹。成千上萬的樹葉通過樹枝管理起來,非常的整齊。樹枝管理樹葉的結構是一種樹形結構。
如果沒有結構化的樹幹樹枝來組織樹葉,樹葉散落一起,樹葉就會非常混亂。
樹形結構非常好的管理了複雜性,樹形結構是大自然創造使用非常普遍的設計,你基本上可以再任何植物上發現樹形的設計。
樹形的本質是一種分層結構,樹幹是第一層,大的樹枝是第二層。。。,樹葉是最末層。
計算機設計中為了管理複雜性,同樣廣泛使用了分層的概念。分層概念目的是分而治之,分離開不同的層次,不同的層次負責不同的職責。 在實際應用中可以用來分離不同的語義,比如:
繼續思考下去,會發現沒有什麼計算機問題是分層解決不了的,如果有,就再加一層。
和自然樹的隱喻
可以看著上面的樹和樹葉散落一地來思考。如果我們把程式邏輯平鋪直敘為乙個大長方法,程式執行沒有問題,就好像散落一地的樹葉,但我們很難看懂或維護。可以採用樹形的分層來解決。把系統拆分為子系統,模組,類,方法,形成整體上乙個非常整體的樹。
為了方便思考,重複下:
大部分程式設計師談到分層,一般都是指的view-service-dao模組的分層 ,我稱為「狹義的分層」,在本文的後續部分會仔細展開討論「狹義分層」和依賴倒置的關係。
廣義上分層其實就是封裝,不同的職責通過不同層分離開,比如**抽取方法是一種分層,設計模式的封裝也是一種分層, **的模組也是一種分層;
分層不僅僅是個動作,更重要的是個思想或原理,分層的做法可以產生很多其他重要原理的思考,比如:
狹義分層的傳統方法
傳統分層中,上層依賴下層,每次定義了介面和實現;依賴如下應用服務依賴領域服務,領域服務依賴資料庫和遠端服務;
定義:a呼叫b,a依賴於b;依賴倒置a指定服務標椎,a和b共同依賴此標準。 此處領域服務層來定義標準,其他層實現此標準,經過改造後,依賴關係如下:
傳統分層和依賴倒置的分層的區別,好比是店大欺客和客大欺店的區別,誰強誰就指定標準。傳統分層是下層提供標準,上層呼叫標準介面;而運用了依賴倒置的六邊形架構,核心業務邏輯有話語權,是程式的核心,核心邏輯就指定標準,其他的不管是他的上層還是下層都是依賴於這個標準;傳統分層和依賴倒置無好壞,看場景,哪個層更強(底層設施服務於多客戶多場景或核心服務強,基礎設施只是幫忙實現);如果呼叫方和被呼叫方都很強呢,都想制定自己的標準,也沒問題,加個介面卡層適配就可以解決;
上面的結構再細化下依賴關係,其實就是六邊形架構了:
六邊形架構是把依賴反轉更通用了,領域服務層是核心制定標準,其他的不管是持久資料的輸出,還是其他系統呼叫的輸入,統一看做依賴於核心,需要做適配。前面的分層架構用六邊形表示:
分層不僅僅可以在不同的解決層面分離(比如前面的分離使用者展示,資料持久化,業務邏輯),在同乙個層次上,比如最複雜的業務邏輯,也可以對抽象和實現進行分層。 如果我們對業務邏輯的某些處理部分進行抽象化,就可以得到下面的架構。
簡單是設計的第一原理,分層就是為了分而治之,把複雜邏輯分為乙個個簡單邏輯,讓每一層都專注於一件事。
返回首頁導航
App 分層思考
主要是為了維持分工體系,提高生產效率。對外依賴 穩定性這裡的穩定性是指 變化的頻次。通常來說,通用的 在增刪改的層面上,刪改是極少的 向後相容 增是可控的。許可權和人員 對於不同的通用性,開發者需要的技能水平和 要求是不一樣的。越靠下層的 越需要更豐富的經驗 更嚴格的設計和 cr 流程。層次通用性 ...
關於軟體設計分層的一些思考
從大學開始走程式設計師這條路近四年了。之前的三年大多是在學習基礎知識 也不甚紮實。真正覺得進步比較快的是最近一年,主要原因有兩個,一是實習了,二是在做畢業設計,其實歸根結底來說,是參與真正專案的開發了就知道要學什麼要做什麼了。1.個人對分層的認識 2.學習應該先學理念再學細節 第一點 無論是桌面應用...
軟體架構分層
目前常用的三層構架即 表示層 業務層和資料訪問層。於網路 1 每個層的 必須包含可以單獨維護的單獨檔案 2 每個層只能包含屬於該層的 因此,業務邏輯只能駐留在業務層,表示層只能在表示層,而資料訪問邏輯也只能駐留在資料訪問層中。3 表示層只能接收來自外部 的請求,並向外部 返回響應。4 表示層只能向業...