副標題:紮實的物件導向設計基礎功夫是奠定系統彈性穩固的基石。

Object-Oriented Methods A Foundation Object-Oriented Methods A Foundation
———————————–
作者/James Martin/James J.Odell /著
出版社/Prentice Hall PTR
ISBN/ 013-905597-5

內容簡介
This book presents those concepts and techniques that support almost any system development approach–whether it involves computers, people, or machines. It considers object structure, object behavior and more advanced concepts such as composition, structural constraints, rules, using rules and diagrams, meta-modeling, and power types. Shows how to represent OOA constructs–modeling object structure, modeling object behavior, modeling state transitions and event diagrams, scenarios. Outlines considerations for design, discusses object-oriented programming, and considers object-oriented design and “instant” CASE. –This text refers to an out of print or unavailable edition of this title.

前言

截至目前為止的書評,我發現到並沒有真正介紹到適合於初學者的軟體入門書籍。大部分所介紹的還是偏向實用性的設計類叢書,即使如 Booch 那本 OOAD,雖然是理論基礎用書,但那本其實難度不低,用字又艱深。事實上,所謂的「物件導向」基礎入門書,要能寫得好,其實非常困難。作者除了觀念要相當透徹外,用字遣詞又要言簡意賅,把複雜的事情簡單的呈現,並不是一件容易的事。不過本次的書評— {Object-Oriented Methtods},兩位作者均同名為 James 的 Martin and Odell,寫出了絕對會是留名軟體青史的代表性著作。即使許多讀者會恐懼於閱讀原文書籍,但本書的英文用句,真的相當淺顯,不太懂文法也是可以讀起來毫不費力。誠如作者在前言裡所提及適合於本書的讀者程度,並不需要具備任何的前置知識,包括程式語言等。更為誇張的是,他們說書中諸多元素用語,已被用來教導約七歲年齡的孩童。這讓我想起,曾經在某購書網站看到,{UML 精華} 那一本書,適用對象竟然是寫為國小程度,哈,許多軟體人員真的是有夠汗顏的了。(其實那是網站筆誤的)

Martin & Odell 可是 OO軟體業界早期相當具知名度的先驅,他們的著作甚多,Odell 除了是物件導向社群的領導者外,也是 OMG UML 規格制訂的主席;而 Martin 看他寫作的資歷,你真的會嚇一大跳,從 1960 年代開始,我都還沒出生的時候,就已經出書了,至今已發表超過 100 本以上的專業書籍,包括軟體、資料庫、電傳通訊、即時性系統等,所涉獵的專業範圍實在廣泛。至今他除了在知名大學教授外,還仍茲茲不倦地研究與寫作。我真的好是佩服,這才是真正致力於軟體之道的大家啊。

清晰明確的術語定義,才能奠定 OO 紮實的基礎

本書共分為六大部分,剛好整整 400 頁,厚薄適中。最後一部份為附錄,除了語法的說明,還有一個訂購系統的分析範例。另外最值得推薦的是附錄D (Toward a Formalization of OO Analysis),是以論文的型態闡述了關於分類的關係、一般化/特殊化、功能/屬性/角色 等在分析過程中,經常會運用到的基礎技能。

第一章是對泛OO系統的概念性介紹。而在前兩部分章節,則為 基本OO的基礎知識。第一部份(2~11 )介紹物件的結構(structure)、第二部分(12~17)介紹的是物件的行為(behavior)。我覺得第一部份可以精讀,那真的是奠定最為紮實的理論基礎了。例如,我們經常說開發的是所謂的物件導向式系統,好吧,那你能否明確的說明出分析的物件從何而來? 再問一個更“俗”的,能不能定義出什麼是物件呢? 嘿,許多軟體人員還會愣住,無法回答出來呢。第二章開宗明義就指出,物件源自於概念(concept),“An Object is anything to which a concept applies. It is an instance of a concept. (物件是概念可以被應用的任何事物,它是概念所呈現的個體)”。 由此定義也可以得知,“物件”與“個體(instance)”這兩個術語,其實是具同義詞性質的。將“概念(concept)”作為認知的對象時,所產出的“個體(instance)”即為物件。但概念會牽涉到人們對於觀點、角度等認知,而會有不同的體認。例如站在遊客的角度,他所看到在森林裡面的樹木,是一個個的“個體”,會從樹木之外的角度來欣賞樹木的茂盛與宏偉,是一種整體性的認知;但站在植物學家的角度,他要研究組成樹木的結構元素,所以會把樹木分為“樹幹”、“樹枝”、“樹葉”、“樹根” 等多個組成樹木的“物件”,從結構的觀點來研究樹木的內部組成。這同時也就代表了,雖然到處都是物件,但並不是任意地將物件給“塞”入軟體系統內,物件導向的設計,是將問題領域(problem domain)的概念,呈現與對映(mapping)至軟體系統內,那麼,如何正確地捕捉(capture)問題領域的概念成為物件,就成為是軟體設計中,最為重要的技能與素養了。 你可以看看,當你能對這些基礎概念術語有很明確的定義時,你就可以很容易地衍生出諸多看來好像很複雜的呈象,但卻又不會違背這些基本的原則。我常戲說,練好這些軟體蹲馬步的基本功,才真正夠得上是武當名門正派的正宗內功!

當能分辦出 物件與類別的區別後,然後再進而瞭解類別之間普遍的三種關係:關連、整體/局部、一般化/特殊化 。透過關連,我們可以分析類別的相依性(dependency),以瞭解耦合(coupling)的程度;透過 整體/局部,我們可以封裝(encapsulate)細節,並以整體的服務呈現給 client;透過 一般化/特殊化,我們把相同的部分抽象出一般化類別,而把特殊或需要擴展的行為分別實現在特殊化的類別,而造成所謂多型(polymorphism)的效果(這也是程式語言中常稱之所謂的繼承)。再來論及的是物件的行為面。從對狀態(state)的說明,然後到狀態的轉移,而發生轉移的觸發(trigger)即是所謂的事件(event)。所以當然就會需要瞭解到事件的種類、事件的處理等,而這也是在當今元件化的系統,在動態期間常會需要用到的機制,在設計上也是相當重要的範疇。

第三部分(18~23)是OO進階的介紹,這裡提及到了限制(Constraints),也就是在類別關係之間如多重性是如何的表示;還有提到了規則(Rules)的表達,是如何呈現在設計圖上。我是覺得這類議題反而比較偏向細節性,倒是不一定要規範如此嚴謹,我是比較主張設計盡量活潑彈性一點,再慢慢地抓出團隊設計的共識即可,至於嚴謹性,倒不如在程式碼驗證即可。

第四部分(24~29)是關於物件導向分析(OOA)的說明。由於這裡涵蓋的議題太過廣泛了,諸如需求面的功能分析、結構面的類別設計、實作面的物件互動等,短短幾個章節不可能詳述清楚的。這裡我也只是大概瀏覽過即可,然後再對上述各個主題,從別的專書中再深入去探究。

第五部分只有一章(30),主題更是嚴肅,設計與實作的考量。開玩笑,一大堆所謂的物件基本教義派就是“掛”在無法將他們理想中的設計具體化呈現在現實的技術平台上,例如所謂的“O-R (Object-Relation) Mapping”,每種平台的實作都不一樣,那也是要相當去深入研究的;還有諸如交易控管、權限控管、分散式 …等,這些都是在實作上必然要面對的挑戰,10 本書都不一定介紹得完,遑論僅有一章?

軟體非“以用為本”

本書在 Amazon 也是頗受佳評的四顆半好書,印刷尤為精美,是我目前唯一有著紅與黑的兩色印刷書。除了 UML 設計圖外,還有許多生動有趣的插圖,佐以解釋主題的呈現。最好是不要抱著從“用”的角度來看待此書,那麼你可能會失望,因為它不一定能馬上讓你可以應用在現實的工作上。當你好奇於為什麼主流的程式語言都採用物件導向式的實作機制、為什麼系統分析/設計也強調所謂的 OO 思維,到底 OO 是要協助來解決什麼樣的軟體設計議題 …,還有當你真正有志於從事軟體專業之路時,本書絕對是修習基礎內功的必備聖典。