前 言Preface
本書內容概要正如書名所述,本書講述了面向對象思考的過程。選擇一本書的主題和書名是個很重要的決定,但如果主題概念性很強,決定就沒那么容易了。大部分書籍都只涉及了編程及面向對象設計的某個方面。一些主流的書闡述了諸如面向對象分析、面向對象設計、面向對象編程、設計模式、面向對象的數據結構(XML)、統一建模語言(UML)、面向對象Web開發、面向對象移動開發、進階面向對象編程語言等主題,當然也包括了其他與面向對象編程相關的主題。
然而,許多人仔細研究這些書后,都未曾注意到這些主題都建立在同一個基礎之上,即如何以面向對象的方式進行思考。從學生到軟件開發專業人員,往往雖然閱讀了這些書,但沒有花費充分的時間和精力來真正理解代碼背后的設計理念。
我認為僅學習一種特定的開發方法、一種編程語言或者一組設計工具并不能說明學會了面向對象這一概念。簡單來說,以面向對象方式編程就是一種思考方式。本書就討論這種面向對象的思考過程。
把面向對象的思考過程從語言、開發實踐以及工具中剝離出來并不是一個簡單的任務。在學習面向對象這一理念時,往往要求先深入學習一門編程語言。例如,很多年以前,大量的C語言程序員在沒有直接接觸面向對象概念之前,就開始通過C++語言來了解面向對象。其他軟件專家第一次接觸面向對象則是在演示文稿中使用UML創建對象模型。他們也沒有直接學習面向對象的概念。即使到現在,互聯網作為商業平臺的幾十年后,編程書籍以及專業的培訓材料并沒有先介紹面向對象這一概念。
學習面向對象的概念與學習使用面向對象語言進行編程有著巨大差異,理解這點很重要。我在編寫本書第1版前就意識到了這點。當我閱讀Craig Larman的文章《What the UML Is-and Isn’t》時,他指出:
但是,在軟件開發工程和UML繪圖語言領域,讀寫UML標記的能力有時候好像等同于面向對象的分析和設計能力。事實當然并非如此,后者比前者更加重要。因此我推薦先學習面向對象分析和設計的相關教學資料,它優先于學習使用UML標記的相關工具。
因此,盡管學習一門建模語言是非常重要的步驟,但先學習面向對象的技能更加重要。如果未完全理解面向對象概念前就學習UML,這就像還未了解任何與電路相關的知識就開始學習電路圖一樣。
學習編程語言也有相同的問題。如前所述,很多C語言程序員還未直接了解任何面向對象的概念,就想通過使用C++語言來達到面向對象的境界。在面試中經常會出現這樣的情況,很多自詡C++程序員的開發人員只是會使用C++編譯器的C程序員。甚至現在,諸如C#.NET、VB.NET、Objective-C以及Java等語言已經相當普及了,工作面試中的一些關鍵問題可以迅速暴露出這些程序員缺乏面向對象的思想。
Visual Basic的早期版本并不是面向對象的。C語言也不是面向對象的。而C++在設計時就向后兼容C語言。因此,使用C++編譯器編寫只含C語言語法的程序,而放棄使用C++的面向對象功能是完全可能的。Objective-C是標準ANSI C語言的一個擴展。更糟糕的是,程序員可能使用勉強夠用的面向對象功能把程序寫成了既不是面向對象的也不是面向過程的四不像產品。
因此,在學習使用面向對象的開發環境之前,先學習基本的面向對象概念至關重要。與其直接學習一門編程語言(比如Objective-C、VB .NET、C++、C# .NET或Java)或建模語言(如UML),還不如把時間花在學習面向對象的思考過程上。
我在使用C語言編程很多年后,于20世紀80年代后期開始參加Smalltalk語言的學習課程。當時我所在的公司認為公司的軟件開發人員應該學習這個極具前途的技術。老師授課時說面向對象的范式是全新的思維方式(事實上它從20世紀60年代就已經萌芽了)。他接著說,雖然幾乎我們所有人都是很優秀的程序員,但還有10%~20%的人從來沒有按照面向對象的方式做事。如果該說法確實正確,那么很可能是因為很多優秀的程序員從沒有花時間進行編程范式的轉變,沒有深入學習面向對象概念。
第4版中的新增內容正如在前言中經常提及的一樣,第1版中我的愿景僅僅圍繞概念本身,而不是具體的新興技術。盡管我在第2版、第3版以及第4版仍然堅持該目標,但也引入了幾個章節講述關于應用程序的主題,這些主題與面向對象概念契合度很高。第1~10章涵蓋了基本的面向對象概念,第11~15章將這些概念應用到了一些常用的面向對象技術中。例如,第1~10章提供了面向對象的基礎課程(比如封裝、多態、繼承等),而第11~15章則介紹了一些實際應用。
第4版相對于之前的版本拓展了很多主題。以下列出了改進及更新的主題:
移動設備開發,包括手機應用、移動應用以及混合開發等。
iOS環境下的Objective-C代碼示例。
使用XML及JSON實現可讀性強的數據交換。
使用CSS、XSLT等技術實現數據渲染與轉換。
Web服務,包括簡單對象訪問協議(SOAP)、RESTful Web服務等。
客戶端/服務器端技術以及封送對象。
持久化數據和序列化對象。
Matt Weisfeld,居住于美國俄亥俄州的克利夫蘭市。他既是大學教授、軟件開發工程師,也是作家。他在信息技術領域擁有20年的經驗,之后進入大學任教。他先后當過軟件開發工程師、企業家以及兼職教授。Matt擁有計算機科學碩士學位以及工商管理碩士學位。Matt除了本書之外,Matt還撰寫了其他兩本關于軟件開發的書籍,并在雜志和期刊上發表了多篇文章。這些雜志和期刊包括《developer.com》《Dr.Dobb’s》《C/C++ Users》《Software Development》《Java Report》和國際期刊《Project Management》等。