Object-Oriented Analysis and Design with Applications
Object-Oriented Analysis and Design with Applications 2nd Edition
———————————–
作者/Grady Booch 著
出版社/Addison-Wesley Professional
ISBN/0805353402

*** 參考之前對本書的「好書分享***

前言

曾有讀者反應,前幾期中譯本書評,我只就針對原文書籍的內容部分做介紹,卻沒有提及到翻譯的水準。基本上,我是很欽佩這些譯者們的用心,這是吃力不一定討好的工作。再者,我當然是有過濾過才會做介紹的,個人所介紹前幾期中譯本翻譯的品質,我覺得可以說都是在水準之上,讀者們應該是可以放心的 。不過,現在是該來介紹原文著作的時候了,畢竟要從事專業軟體設計職這一行,不看原文可是不行的。

本書是 UML 三巨頭之一 Grady Booch 作為在物件導向分析/設計 最具代表的經典著作,本次我所介紹的書評為第二版,而今年暌違 13 年之久又增訂了第三版,主要新增的內容是將塑模語言改為 UML2.0,並深入探討整個生命週期的一個階段。不過在第一部份的概念篇則與前兩版內容一樣。

軟體的複雜是與生所俱來的 (The inherent Complexity of Software)

本書內容分為三大部分:第一部份為概念 (Concepts),包括複雜度的闡述與觀察、物件模型的建構、類別與物件的區別、分類;第二部分為方法論 (Methodology),包括塑模的語法 (這裡主要揭露出類別圖、狀態機圖、物件互動圖)、巨觀 (Macro)與微觀 (Micro)的開發流程、專案的管理與規劃等;第三部分為案例分析,包括天氣監控、Client/Server 庫存追蹤、AI 人工智慧,甚至 Framework 等系統的分析與設計,以及簡單程式碼的展現。

第一部份的概念篇價值是最高的,Booch 在闡述軟體複雜本質的這一部份,實在是精彩。藉由 PC 硬體產業與大自然植物行光合作用的例子,來解釋其它領域是如何應對複雜度。這就帶出了物件第一個哲理:封裝 (Encapsulation)是解決軟體複雜度的根本。而封裝往往具有階層性,藉由其特性將混沌的表象帶往有機的次序,呈現出簡單的結構。將這些其它領域,包括大自然帶給我們的智慧,來解決在軟體複雜系統的方法與技巧,即為所謂的物件導向分析與設計。

本書更意思的另一部份是它的插圖,尤其是那隻肥貓,逗趣極了。Booch 怎麼介紹抽象 (Abstraction)呢? 插圖上有兩位貴婦人,一個看到的是毛茸茸肥成圓團的寵物貓;另一個則是看到這隻肥貓的骨架與器官組織。這就隱含了軟體開發各種不同角色的人員,往往會有不同的觀點,有需求面的外部觀點,也有結構面的內部觀點。但,觀點仍須保持一致,才能維繫其本質的調和。這讓我想到金鋼經的一句話:「凡所有相,皆屬虛妄,見諸相非相,即見如來。」不要執著在單一的觀點上,運用抽象的本能,當能看到蘊藏於諸多表象背後的那一隻貓 (如來)了。

本書中對於物件導向基礎的概念,揭露出了 抽象、封裝、模組性 (modularity)、階層性 (hierarchy)等。而在物件與類別這一篇,也是花了好多文字來說明什麼是物件、什麼又是類別,兩者之間的關係又是如何 …等。這一章節絕對是奠定物件導向最基礎的功夫,一點可馬虎不得,讀者真的得要相當用心思考體會關於物件與類別的區別,類別之間的關係,包括了關連 (association)、聚合 (aggregation)、繼承 (inheritance)等。尤以所謂的繼承,更是讓軟體設計人員混淆,其中似乎牽涉到單一與多重繼承、多型的設計觀念,這些似乎觀念透過程式語言去解釋,往往不容易理解為什麼要這麼設計。

從生活面來解釋物件導向的哲理

看完本書第一部份,我更確定,所有物件導向的觀念均可以從生活面找到解釋,時常保持一棵好奇、觀察的心,將其體悟會的心得,來解釋包括 封裝、介面、繼承、多型等物件導向的關鍵精髓,當你能“自圓其說”,說得還很開心,周遭其他朋友同事等也逐漸能接受你的論點,甚而還會被你影響,認同你的觀點 … 說真的,這樣難道你還會對軟體設計之道充滿無奈挫折嗎? 不覺得軟體設計是時常充滿著驚奇、有樂趣又有成就感的領域嗎? (當然,我也相信,不會只是虛的成就感,包括實質的“回饋”也是會有收穫的)
倒是切勿本末倒置,從程式語言來學習物件導向的觀念,因為那會讓你只是站在“用”的角度來看到物件導向,把它當作技術而已。當你覺得“不好用”、“無法用”時,你就會認為它是一種不適切的技術,無法應用在現實。殊不知,物件導向只是把人類應用在其它領域的成功經驗,以及大自然所蘊含根本的道理,來協助我們面臨在處於經常性變動的軟體系統上,是如何有效地來克服與應對複雜度,至於程式語言,它就只是工具,工具受限於實體的 IT 技術而無法有效表達這些哲理是可能的,但軟體設計人員的角度卻可不能與其同等狹隘。

多型 (Polymorphism)來說,這好像很難解釋? 非得要透過程式語言的撰寫執行才能理解? 非也! 生活面隨處可見用來解釋多型的例子了。就說“椅子”好了,包括 課桌椅、電腦椅、吧台椅、按摩椅等,均能提供給人“坐”的服務 (service)。人就是客戶端 (Client),他可以享受取用到 ”椅子”所提供的服務;而“椅子”其實就是一種抽象 (abstraction) 的概念 (concept),上述各種類型的椅子,則是具體 (concrete)呈現的物件。而這也可以用來解釋“一般化 (椅子)—特殊化 (各類型具體的椅子)”,均有提供“坐”的服務,但“坐”的方式卻也不太一樣。更甚之,從“坐”的服務,又能衍生出椅子應該有提供“可坐性”這樣的介面,只要能實現 (implement) “可坐性”的介面 (interface),都可以是椅子的一種。所以,如此說來,“大石頭”因為可以讓人坐著,所以它也能算是椅子,但是,它可不是從椅子所繼承 (inheritance)而來的。這樣的觀察與體會,又會讓你知道,“多型”不是只有從“繼承”這樣的角度來看待之。諸多種種物件導向的哲理,處處就存在於你的生活周遭面,信手拈來皆可解釋之,而且充滿樂趣,這豈是只能透過程式語言如此狹隘的觀點才能去做說明呢?

本書的基礎理論相當紮實,各種概念的解釋,都相當的清楚,可說是無懈可擊。但美中不足之處,是沒有整理得很清楚,可以說要稍微有一些底子,才能釐出這些概念之間的關連性。不過你會發現到,本書的文字敘述還真是多,字也挺小的,真要初看原文書籍的讀者可會是很大的煎熬。還好的一點是,有豐富的插圖讓你時時會心一笑,不至於太過沈悶。