全文均刊登於北京「程序員(Programmer)」雜誌(台灣天瓏書局可購得), 2007 7月刊, p67~p69。 感謝朱海豔(helenna)小姐用心將文稿轉為簡體專業術語,以及將 Model 重新美編,並轉為簡體。
結構面的設計產出
關於軟體結構
所謂的系統結構(System Structure)分析與設計(Analysis and Design),係指如何正確、有效地分解設計範圍內系統的元素(Element,一般泛指物件(Object)),指派每一個物件所應有的屬性(attributes)與行為(behavior, 責任的分派),抽象表達靜態類別之間的關係,動態組合物件在執行期間(run-time)的訊息(Message)傳遞,以履行系統的功能需求(ex. 來自於 Use Case 的功能分析)...。做好結構分析、捕捉有效的領域概念,以成為系統的主結構,才能建構出堅若磐石的軟體系統,來應付現實複雜系統的善變,甚而讓系統呈現有機的次序成長、生生不息。
如何找出問題領域(Problem)的概念具化成為企業物件(Business Object)、指派每一個物件應盡的責任,並以此來建構系統中的軟體規格模型,已是高階系統分析與設計人員最大的挑戰與應具備的本質學能。更為難的是,如何將企業物件配合現實面的平台,例如如何活用 J2EE Spring and Hibernate 系統框架。因為,現實上,物件的狀態(state)就是被永續(persistent)儲存在資料庫系統內,而在需要用到(企業邏輯的運算)的時候才被活化(activate)起來;同時因為物件共用的議題而需要 AP 應用伺服器的系統支援,包括交易(transaction)控管、安全性(security)、效能(performance)、分散(distribution)等議題的設計考量。兩個層次(高階概念性的分析設計;細部平台面的設計),互補且缺一不可。
系統的內,也就在於分析所組成的內部結構元素,套現在 IT 的術語來說,也就是所謂的物件導向分析與設計(Object-Oriented analysis and design)。相對於系統的外,是著重在功能性的需求分析(也就是前一期內容所介紹如利用使用案例建構的需求模型)。兩者是互補—找出內部穩定的結構元素(物件,Object),來應變外部的功能需求。
而系統的結構分析,正是現今軟體人員們最大的罩門所在。在速成短線的專案開發生態,軟體人員只會看到現在所看到的—找出一個一個的功能,快速地利用所提供的平台技術(如 .NET, J2EE),疊床架屋的方式,Quick and Dirty 快速的給開發出來。不要以為利用 .NET 或 Java 等 OOP 語言,就是所謂的物件導向開發模式,這是兩回事,如果沒有用心地萃取具本質性(Essential)的物件(再一次強調,源自於問題領域的概念術語),而只是看到一個功能就成為一個 Class,那麼,這樣的系統完全會受限於需求性的變動而導致震盪不穩,是不會具軟體系統的彈性(flexibility)、穩定性(stability)與延展性(extensibility)!
什麼是軟體的結構?
軟體系統的整體呈現是來自於問題領域(Problem Domain),也就是把該領域中經常溝通的術語(terminology) 對映至軟體系統的物件,稱之為領域物件(Domain Object)或企業物件(Business Object)。 例如,”人事資源(Human Resource) 管理” 系統的開發,其核心的問題領域當然是以 “人事” ,經常溝通的術語會有 “員工(Employee)”、”部門(Department)”、”請假”、”請假細項(AskLeave Lineitem)”、”考績” …等,而這些術語自然地就會被捕捉(capture)至軟體系統內,而成為構成軟體系統主結構(main-structure)的成分元素了。
將組成軟體系統結構的元素組織在一起,並利用視覺化的方式來呈現,稱之為 “領域模型(domain model)”。領域模型代表真實世界中的概念性類別,呈現的是領域中的概念性類別或真實世界中的物件。在 UML 的模型中,最重要也是最必要的一張結構圖也就是類別圖(Class Diagram)。
參考下圖 1,通常使用 UML 表示法呈現的領域模型,凸顯的是概念(concept),再來則是以及概念之間的關連(association)與屬性(attributes)。例如 “Order”, “OrderLineItem”, “Customer” 都是屬於在該領域中的概念; Customer 與 Order 之間則存在著 1 對 1..多 的關連(一個客戶會有 1到 1..多筆訂購交易); Product(產品) 具有 description, price 的屬性。在概念性的分析時,細節(包括操作,屬性,資料型態等)在目前並不重要,最重要的是能突顯出概念的呈現,也就是找出類別(Class)。
(點擊圖片鏈接看原圖)圖 1、範例—訂購系統的類別圖(Class Diagram)
那個時候最能表現出結構設計的應變能力? 筆者常說,當 SA(System Analyst) 遇到 有點像又不太像 這類的需求時,也就是結構設計發揮的時機了。 舉個例,訂購 若會視訂購的類型,可能是書籍、雜誌、百貨商品等,而有不同的訂購流程與處理邏輯,此時,懂得虛與實互補設計之道的 SA,會很自然地把訂購分為一般化與特殊化(generalization-specialization)—把已知的部分放在一般化;而未來要具體實現的部分放在特殊化。事實上,這也才只是利用到多型(polymorphism)的基本技巧而已,就已經足以解決為何程序員經常會為了訂購類型寫了一堆的 switch, if…then…else 這種的條件敘述,而造成程式碼混雜,難以維護了。
如何找出軟體的穩定結構元素,是系統分析人員最大的挑戰。SA 並不需要具備領域知識(Domain Knowledge),但卻要懂得如何與領域專家(Domain Expert)溝通合作,萃取其知識,並抽象(abstract)成為軟體的主結構。這相當不容易,那並非是純技術面,真正的軟體設計行家,絕對是具高度的抽象的能力,要能懂得從多個構面觀察,時常在反思與找問題(不是找答案)。筆者正是被這在 虛 與 實 均要能互補、一輩子也學不完的軟體設計領域,給深深地著迷,才從原來是系統管理與 Oracle 資料管理師,而至中年才轉到軟體一職來,並已把此視為是終身之職,是要窮究一輩子、甚至帶至下一輩子繼續來修行的。
回歸正題,關於結構設計的好書相當稀少,筆者這裡特別推薦 Peter Coad 軟體大師,從早期 1990年的 “Object-Oriented Analysis”,“Object-Oriented Design”,至 1998 年的 “Object Models”、1999年 ” Java Modeling In Color with UML” 等著作。尤其是 “Object Models” 一書所揭露出以交易為核心的 交易樣式(Transaction Pattern),更是軟體結構分析人員必讀的聖經。在筆者經常訪問與輔導各領域的公司時,經常在當場就直接展現與證明不用懂領域知識,也能馬上抓出該領域的核心結構,所使用的利器即是 交易樣式(Transaction Pattern)。