連載33:軟件體系設計新方向:數學抽象、設計模式、系統架構與方案設計(簡化版)(袁曉河著)

機制分析

 

發展獨立思考和獨立判斷的一般能力,應當始終放在首位,而不應當把獲得專業知識放在首位。如果一個人掌握了他的學科的基礎理論,並且學會了獨立地思考和工作,他必定會找到他自己的道路,而且比起那種主要以獲得細節知識爲其培訓內容的人來,他一定會更好地適應進步和變化。

--- 愛因斯坦

 

當大家看完前面幾章的分析以後,是否感覺其實還不大清楚,本章我與大家一起討論一下我們在開發過程中使用的一些思想和方法,而這些思想和方法又與設計模式不在同一個層次,這些思想和方法我們完全可以不用談到的設計模式來體現,也許這些思想和方法不是技巧了,不是一種具體的招式,而是貫穿於這個過程的一種規律。我給它取了一個名稱叫做機制,雖然不是非常準確的表達,但是我想大家不是一定要吹毛求疵,如果大家有更好的名稱,我會第一時間修改,在此表示感謝!

 

分層機制


我先講的第一個機制就是分層,分層機制應該是耳熟能詳,而且很多談客也將這種機制作爲炫弄的必談內容。但是這裏我想給大家從實際的開發環境中去討論分層機制的得與失。從我們的實踐中去看它的威力,也可以看看它的無奈。

爲什麼要分層呢?其實一個直接的原因是人的理解問題。或者說人類認識世界的方式導致。這裏我不去仔細討論這個哲學問題,只是簡單說明一下:首先物理世界是非常複雜的,不是以我們的意志爲轉移的,而人類是可以去理解世界的,雖然我們無法完全一次性的理解這個無窮變化的物理世界,但是我們還是可以理解其部分特徵,這些部分特徵不是指集合中部分元素這樣簡單,而是構成一個體系,其內部有聯繫的部分特徵。如何才能認識這些部分特徵呢?那就是依靠我們的抽象能力,將具體的東西,去除於我們不關心的部分,留下一些固有的方法和方式,高度濃縮。在這個過程中還有一個方法就是獨立性,比如大家經常說的物理獨立性和邏輯獨立性。於是經過不同層次的獨立性我們就可以抽象出一個層次的特性,然後不斷迭代進行。將這些迭代的過程張開以後就形成了分層的機制,如圖3-1所示。

blob.png 

3-1

 

這些層次首先是我們人爲的劃分(帶有強烈的主觀邏輯性),因此所按照不同的劃分方式,其層次並不一定唯一,而且不同的認識和理解其劃分多少層,每個層次包含什麼內容也是不盡相同的,因此層次這個東西是沒有唯一的標準,就是因爲沒有唯一的標準,所以在實際開發中,我們的架構師的分層很難在開發人員中推廣,因爲說實話很多架構的分層所依賴的原因都遠離我們的實際需要,都是不切實際的臆想。

別的不說,看看著名同時又可憐的七層網絡模式,雖然劃分的如此宏大,大量大師嘔心作品,除去商業上的是是非非,我們客觀來看看這個分層,其一就是劃分的非常細緻,分層很多,七層。對於一個體系來說,分層越多其效率也就越低下,分層越多其獲益者能夠壟斷的方式就越少,同時開發人員也就越痛苦。所以分層並非越多越專業,實際上5層就足夠。表達意思已經非常清楚了。而且七層分層也是隻能按照當前的格局進行分層,最多有很少的一部分的前沿開拓,對於抽象來說,是對現有的特徵進行抽象,而不是對未來可能的情況進行抽象。對未知的抽象就可能導致更多個人主觀願望,脫離了集體的認識領域,註定是要被人拋棄的,另外其實七層協議對每個層次上的獨立,也是不能預測到未來的發展方向的,我事後諸葛說明一下:目前在2層和3層之間還有一個2.5層,而且這個2.5層融合了更多優秀的思想,能夠完美的承上啓下。後面我會詳細討論這一層對我們的影響和意義。

人們常常使用七層網絡層次結構來表達分層的思想,但是在軟件領域中,其分層不是按照這樣明確的實際客觀的網絡結構來進行分層,而是採用一種主觀上的劃分,或者是主觀與客觀想混合的劃分方式,其從人的理解層面來進行分層,從抽象到具體的分層,是一種歸類的方式,然後再進行抽象,與網絡七層結構的分層不太一致,那麼這樣兩種分層誰是誰非呢?

分層的意義就是爲了我們更好的理解,其一個目的就是解耦。利用層次化可以有效進行不同因素的分離,例如:

設計模式MVC分層的信息與呈現分離原則:

視圖是信息的呈現,信息是穩定的,視圖是易變的,不同運營商,不同角色有不同需求操作原子化,不組合。

ü 機機接口與人機接口分離

ü 接口與模型分離數據與處理分離

ü 接口協議棧與信息模型分離

ü 模型與實現分離

三者之間的關係和原則:

ü 適配:只有一個組件實現,但是該組件提供的各種接口方式來改變它的行爲。

ü 替換:一個組件有多種實現,每個組件都符合該組件的接口規範,可提供多種實現,然後選擇其中一個,或遵循組件規範開發個性的組件。

ü 擴展:擴展需要架構提供一些允許增加新組件的擴展點,添加的組件可以是特定產品或者架構內部的。

分層中提供的接口不能狹隘理解,其實每一個層次提供的接口就是向上提供的服務,要求層次間使用接口進行調用,這裏所談到的接口應該有兩種不同的形式,一種是靜態的API調用接口(不管是C++的虛函數接口還C語言的函數接口還是JAVA提供的接口)另一種就是動態的命令字,也就是消息。這兩種劃分的方式是有截然不同的效果以及優缺點。

分層必須遵循一些原則:

1、 每一個層次都使用接口形式向上提供服務,所以在使用的過程中,只能依賴於接口,而不能依賴於具體的實體,避免依賴於特殊處理,使用接口進行統一調用或消息發送和接收。

2、 原則上調用方式是從上到下調用,防止有引用向上的接口,或者進行向上的調用,如果存在向上調用則應該使用訂閱者模式,解除循環依賴,保證各個層次間在物理和邏輯上都不存在耦合。

3、 同層之間的調用,最好集中在一個公共的功能模塊中,本層的其他特性模塊,依賴於這個公共的功能模塊,另外越是靠經底層的層次,就越需要減少同層調用。

4、 防止跨層調用,如果存在這種情況,則表示我們的層次劃分不清晰,接口需要進行清理或提煉,因爲需要適當增加中間層。

防止層次調用中的跨層調用和下層對上層的直接調用。

ü 跨層調用將直接影響你的分層,可導致分層失敗,層之間的獨立性破壞。

ü 無法做到對層的替換,而且上層嚴重依賴下層的實現。無法做到移植。

ü 由於對下層的直接調用,可能會導致被繞過的層次的創建和釋放無法按照正常順序進行,導致系統異常。

ü 被繞過的層次無法進行控制和管理接口,並可能產生重複的代碼和操作過程。

ü 下層對上層調用直接違反了上層抽象的意義,導致層次間混亂,一般情況爲層次劃分不正確。

ü 下層對上層調用,直接違反了解耦原則,導致上下層無法獨立,耦合加劇。

對於上面需要解決下層對上層的調用和依賴的問題,可用“註冊”的方式來解決(訂閱者模式即使用此方法),使用不同的回調掛接在同一的列表中 ,通過公關功能模塊進行不同的策略調用相關的回調掛接函數。爲什麼不希望跨層調用呢?或者方向調動呢?因爲越向下其表達的是一個完備集合,提供的接口是此完備集合的子集,而越向上其需要越來越小的範圍,那麼可以通過接口來封裝這樣的範圍緊縮的處理,如果不是這樣就容易導致中間層的完備性的缺失。 

使用分層的效果:

1、 清晰了整個軟件框架結構,不同的層次具有明確的功能定義,能夠支撐團隊的開發。

2、 不同的方案可以合併一起,通過中間層提升軟件的複用。

3、 減少了層之間的耦合,使用接口(功能性)進行調用,大大減少了業務和硬件設備的強制依賴關係。

分層框架模式是最常用的框架模式,是一種通用的處理方案,但是如何更好的分層是需要具體場景具體分析,不能爲了分層而分層,常見的錯誤做法就是無論什麼系統都使用經典的三層或五層去套用,分層一定要有原因的,分層會降低執行效率,同時無謂的分層還增加了開發團隊之間的配合難度。

也許對於硬件與軟件之間的層次還有較多的方法進行抽象、隔離和解耦,但是對於再上面的層次中,我們又是通過哪些方法來進行抽象的呢?其抽象是否滿足是深度呢?其實這些層次的抽象很容易產生中間層,例如網絡層與鏈路層中間就產生了2.5層的mpls

與分層多對應的的有一種非常特殊的方式就是分級機制,而我們也經常將分層和分級進行統一或相互劃分。

所謂的分級機制就是將不同速度或不同響應時間、不同的吞吐量、不同優先級權限按照一定的規則進行多級別的劃分,在分級中,多體現的是不同級別如何匹配。就像流動的水,所以在此機制下,就有如何使用緩存,如何最優命中目標,其權限如何控制等。但分級和分層容易混淆,分層實際上包含了抽象與差異性的隔離,而分級主要是高速與低速,高優先級與低優先級權限等分離,但是在很多時候,分層與分級又混雜在一起,例如網絡七層協議中,按照抽象出來的各個層次對應的功能特徵,其實現方式有常常運用分級的思想,例如對於交換處理,可以使用硬交換也可以使用軟交換。這兩種處理其在層次上是同一層次,但是在實現處理上處於不同的級別中。

分層具有包含和抽象的特徵,分級具有主要和次要、主幹和分支等特徵,所以分級更側重於描述物理世界,分層更側重描述邏輯世界。

有時候,在我們理解中分層在繼承體系中常常是處於在同一層上。

分層中存在調用和被調用的關係,但分級存在協調的關係,所以一般表現爲動態的特徵,分級之間多采用消息這樣的知會的方式,讓接收者或者當前的狀態,接收者通過仲裁和協調的方式,所以分級一般不使用靜態調用的方式,而是通過協議、事件、消息進行通知和協調。

分級是縱向分區域,分層是橫向分區域。

但是這樣的方式好嗎?或者說抽象的深度到了嗎?這種通過物理的特性劃分邏輯類是否暗示我們的抽象程度其實還不夠深入,我們還依賴於物理特性,一旦物理特性發生變化,那麼其邏輯特性也會發生變化,這也是一種耦合,其物理與邏輯獨立性還不夠充分。此時,我們應該學習學習UNIX操作系統的思想,其將一切I/O外設都看成一個文件,其操作都抽象爲openclosereadwrite等操作,所以看看我們的設計,我們的物理與邏輯真的分離了嗎?其實對於獲取溫度而言,其獲取的完全可以看出一個個通道,對這些設備設置ID,形成一個回調的列表,當需要進行溫度查詢的時候,可以通過這些通道進行回調方式獲取,如圖3-2所示。

 blob.png

3-2

 

也許對於硬件和軟件之間的層次還有較多的方式進行抽象、隔離和解耦,但是對於再上層的不同邏輯層進行劃分,我們又是通過哪種方式來進行分層呢?其抽象也能夠完全滿足要求嗎?而這些層與層之間,其實主要是邏輯定義而進行區分的,而這種假設一旦有變化,那麼其層次劃分就可能完全不一樣了,所以經常大家會看到出現了中間層,例如網絡七層中就出現了2.5層的MPLS的這一層次。

blob.png

其提供的接口其實應該更少,而爲什麼會形成這種金字塔方式的架構呢?信息隔離是其主要原因,越向上其所需要了解的知識應該更少,所以需要進行分層,而且分層還是金字塔方式的分層。其向上的信息會更進一步隔離彙總,認爲其上層必須知道的結果才返回給上層,主要的方式,是最容易控制和維護的,因爲上層進行命令的下發會更加規範的得到解析,具有中間轉化層次更好滿足這個需求,控制成本降低了才有利於起系統的推廣和使用,同時也減少了使用者的學習成本,但是這樣的分層很可能最後變成非常的低效,導致系統龐大,響應變慢,而這又反過來導致擴展或維護的成本增加。所以分層模式又稱爲官僚模式。

分層的優點:

1、 支持基於抽象程度遞增的系統設計,使設計者可以把一個複雜系統接遞增的步驟進行分解。

2、 支持功能增強,因爲每一層至多和相鄰的上下層交互,因此功能的改變最多影響相鄰的上下層。

3、 支持重用,只要提供的服務接口定義不變,用一層的不同實現可以交換使用,這樣就可以定義一組標準的接口,而允許各種不同的實現方法。

4、 提升整個系統的容量,隨着分層的層次增加,其包含的信息也隨之增加,於是可以將更多的信息納入到此係統中,所以相應的容量獲得提升。

分層的缺點:

1、 並不是每個系統都可以很容易地劃分爲分層的模式,甚至即便一個系統的邏輯結構是層次化的,出於對系統性能的考慮,系統設計師不得不把一些低級或者高級的功能綜合起來。

2、 很難劃到一個合適的,正確的層次抽象方法。層與層之間是不平等的關係,越往上走層次越高,數據流風格的各個過濾器和管道原則可以互換位置層是算法耦合,管道與過濾器是數據結構耦合。

3、 不同的分層之間,很難進行有效的融合。在一個較大的系統之中,當存在多個組件結合的時候,就可能存在不同體系不同方式的層次劃分,而這也往往導致系統難於進行進一步有機的融合,只能通過不斷的大量的接口進行平行的重合,這也導致了系統無法拉通進行合理的分層。例如操作系統和應用程序形成的體系層次劃分完整以後,如果希望拉通融入網絡的七層或者五層體系的時候,就變得非常的困難,就只能分離獨立出網絡特性組件,而在操作系統和應用程序的不同體系中都可能存在調用網絡層次的不同層次上的接口。這反而導致了層次的混亂。其實在一個體系中,“山頭主義”、“部門牆”都是在一個系統中無法拉通整個分層劃分標準導致的一種違反分層原則出現的現象,這種情況出現的原因就是不同分層無法融合導致的,這種情況反而大大減低了分層帶來的好處,危害了體系的健康發展。所以所謂的大統一,其實就是想辦法解決這些分層的融合。

4、 分層導致了信息的膨脹,可能會因爲層次的不斷劃分,而導致系統容許的信息量呈現非線性的增加,從而導致系統失控,難於被掌握。

好,下面我們來看看這個中間層次與上下兩層之間的關聯以及存在的原因。

在系統科學中,層次關係是局部與整體關係的重要內容。如同系統結構一樣,層次也是一個難以準確定義的概念,可以理解爲元素整合爲整體的涌現等級。亞里士多德提出“整體大於部分之和”,那麼這個大於的特性究竟是什麼呢?系統科學把這種整體才具有,孤立部分極其總合不具有的性質稱爲整體涌現性(whole Emergence)涌現性就是組成成分按照系統結構方式相互作用、相互補充相互制約而激發出來,是一種組分之間的相干相應,即結構效應。涌現性又可理解爲非還原性或非加和性,但任何整體都具有加和性,比如質量。系統性是加和性與非加和性的統一,都是整體屬性,所以整體性、系統性並不一定是涌現性。涌現性是系統非加和的屬性,“整體大於部分之和”與“整體小於部分之和”這樣的整體與部分差值不等的部分就是涌現。

所以層次關係中的涌現特點,導致了分層的出現。在系統科學中,分層並非是人的好惡一樣的主觀決定,而是因爲涌現出新的特點,所以我們需要進行合理的分層。在軟件設計中,我們也找到一種評價其分層的好的方式,就是判斷是否在不同層次是存在不同的特性。比如在邏輯層和物理層獨立並劃分層次以後,其涌現的特點最爲明顯的是“可置換性”,在物理層中,硬件特點其描述的是無法更改替換的電信號(至少在目前的電子計算機時期是這樣的),而一旦邏輯層形成高級分層以後,“可置換”就能夠達到通過中間層次,通過邏輯的關係進行不斷的間接處理,並且讓上層的處理越來越靈活,越來越更加表達抽象的意義。當然除了具有“可置換性”以外還有其他的特性,這裏就不進行進一步的深入分析了。

在系統科學的觀點中,層次是從元素到系統整體質的根本質變過程中呈現出來的部分質變序列中的各個階梯,是一定的部分質變所對應的組織形態,對於系統科學來說,無論是系統的形式和保存,還是系統的運行和演化,等級層次結構都是複雜系統最合理的或最優的組織方式,或最少的空間佔有,最有效的資源利用或最大的可靠性。同時,系統是朝着增加複雜性方向演化的,層次的增多總意味着複雜性的增加。

所以對於這種最爲熟悉的機制,其也包含太多的內容,更有很多還未明白其理,雖然其應用廣泛,但是我們卻往往沒有正確的使用,所以機制對於我們來說還非常的陌生和不確定性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章