維護性高。物理分布靈活。開發的并行性高。
舉個例子:在一個線纜銷售公司的訂單處理系統中要錄入訂單,并保存訂單。有以下要求:訂單的錄入界面要隨所訂線纜的種類不同而不同,以便于快速錄入。能否開放該新訂單取決于該訂單的總金額和該訂單的銷售員的金額授權以及庫存情況。如果銷售員金額權限不夠,要提示請銷售經理進行授權審批。
這里:
訂單的錄入界面要隨所訂線纜的種類不同而不同,說明了界面的輸入輸出方式是多樣的,這是表示的多樣性,對應于表示層。
能否開放該新訂單取決于該訂單的總金額和該訂單的銷售員的金額授權以及庫存情況,這是商業規則,對應于商務層。錄入訂單,并保存訂單,以及如果銷售員金額權限不夠,要提示請銷售經理進行授權審批,是要實現的功能,這種功能是由客戶端組織的,在表示層實現。訂單,銷售員權限,這是數據,對應于數據層。
但層的軟件實現基礎是什么呢?換句話說,層是如何實現的呢?
層是通過多組軟件模塊之間的經過規劃的調用來實現的。軟件模塊可以是源程序代碼級別上的子程序,函數過程,對象或二進制代碼級別上的組件。如果軟件模塊是源代碼級別上的,那么層就是依賴于源代碼的,其發揮作用的范圍也就只限于相應的編譯后的應用程序。如果軟件模塊是二進制代碼級別上的組件,如COM/DCOM對象或CORBAR對象,層就不依賴于源代碼而可以獨立地為調用者提供服務。而且可以為多個調用者提供服務,不管這些調用者是不是同一個應用。
層次結構是一種設計思想,適用于單獨的本機應用程序設計,更適用于復雜的軟件系統。
由于二進制代碼級別上的組件在開發,維護,重用方面相對于基于源代碼的軟件模塊的優勢,層更多地由二進制代碼級別上的組件來組成。例如Windows和Office的層次結構。事實上,只有基于二進制組件的層次結構(各層可以獨立存在)才能真正發揮多層結構的威力。
在實際的軟件系統中,每一層還可能由多個實現特定目標的子層構成。在設計時,軟件模塊是基于源代碼級別的對象、函數過程還是基于二進制代碼級別上的組件取決于系統的復雜度和系統約束。
層就是一群負有特定使命,提供特定服務的軟件模塊。
例如,先前說提到的訂單處理系統中與訂單相關的處理可以在三層結構中作如下分布:
注:訂單商務對象和數據對象接口中的參數均已省略;接口并不完備,僅作示例用;各層上還有其他相關對象沒有列出)請仔細體會不同層次的對象在協同完成同一任務時的角色和思維的層次。
另外一個多層結構的一個典型例子是銀行的軟件系統。在銀行的軟件系統中,數據存放在大型機如AS/400上,后臺業務交易處理可能在AS/400上也可能在微機上處理(最后提交到AS/400),前端面對用戶的形式卻是多種多樣的:柜臺,ATM,Web,電話,手機。不同的前端都是使用同樣的后臺處理服務。(設想一下,如果不是這樣呢?)
綜合以上的論述,我們可以畫出多層結構系統在邏輯上和布局上的典型視圖如下:
多層結構中各類對象的含義與任務是什么呢?:
數據存取對象 : 提供記錄的增刪改查方法,語義環境是在數據操作層次上
商務實體對象:在一個或多個數據對象之上綁定商務實體的校驗規則,提供商務實體對外所應展示的的方法,語義環境是在商務實體的相關操作層次上。例如:一個訂單是個商務實體,由訂單概要和所訂商品兩個數據對象組成,對一張訂單整體實施校驗規則,提供訂單的相關商務操作方法,如新增,修改,刪除,查詢。
商務功能對象:通過一個或多個商務實體對象的協同工作,實現相關的某組功能。語義環境是在商務活動層次上。例如轉賬,可視為一個商務功能對象,通過按照一定順序和約定調用轉賬所涉及的各個商務實體對象提供的接口功能,在一個事務中來完成。
表示層中,同一數據,可能在同一個客戶端運行程序內部就有不同的表現形式。也可能由不同的客戶端應用程序使用同一商務層的功能。表示媒體也可能多種多樣。例如:WebServer就是一種提供將數據轉換為便于瀏覽器瀏覽的數據格式的表示服務程序。
根據OMG 96年的定義,商務對象有如下定義:“商務對象代表在特定商務領域中活動的事物,商務對象至少包括它代表事物的商務名稱和商務定義,屬性,行為,關系,法則,政策和限制。例如商務對象可能代表一個人,地方,事件,商務流程或是觀念。實際的商務對象范例有:員工,產品,訂單,發票和付款等。”
顯然,商務對象在多層結構設計中處于核心地位,因此,在多層結構系統中,最關鍵的就是設計好商務層,具體來說就是設計好商務層中需要存在哪些商務對象,各商務對象任務的分配和其接口的安排。
商務層中的一個設計原則就是:分離商務對象,封裝商務處理與商務規則。
總結:
軟件多層結構是一種基于組件和基于服務的,將系統不同層次的功能對應分散在不同軟件層次上的軟件系統結構設計觀念。
與社會化大分工為人類社會帶來極大好處相似,多層結構設計也為軟件開發帶來極大好處:
可重用性:由于商務層的獨立存在,那么商務層中的各種服務可以被不同的應用程序使用。將組件的重用范圍從以前的的單個項目擴展到企業范圍內的多個項目。
配置的靈活性:由于軟件系統被分成了獨立的三層或多層,可以按照企業商務的功能需求和性能需求靈活配置各層次的物理位置,功能劃分,計算機數量等,為需求迅速增長的分布式應用提供了實現基礎。例如不同的部門的不同應用可以連接到不同的應用服務器上。各個層次還可單獨選擇最恰當的開發工具。
開發并行性:由于層與層之間是采用基于服務的存取(接口調用),并且是獨立存在的,所以各層可以在約定好的接口下并行開發。
系統進化的容易度:當軟件需求變更時或技術進步時,只需要更改相應層中的組件,在保證接口不變的情況下,不會影響系統的其他部分,也不需重新測試系統的其他部分。而且層與層之間采用基于服務的調用方式,所以,當商務規則變化時,只要更新單一的商務層,運行表示層的各個客戶端便自動地獲得按照新的商務規則處理的能力。在基于商務層服務的基礎上,可以采用漸增的方式增加客戶端應用種類和接入媒體,因而系統可擴展性很好。