
本節書摘來自華章出版社《面向對象的思考過程(原書第4版)》一書中的第3章,第3.2節,[美] 馬特·魏斯費爾德(Matt Weisfeld) 著黃博文 譯更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。
前 言
本書內容概要
正如書名所述,本書講述了面向對象思考的過程。選擇一本書的主題和書名是個很重要的決定,但如果主題概念性很強,決定就沒那么容易了。大部分書籍都只涉及了編程及面向對象設計的某個方面。一些主流的書闡述了諸如面向對象分析、面向對象設計、面向對象編程、設計模式、面向對象的數據結構(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服務,包括簡單對象訪問協議(OAP)、RESTful Web服務等。
客戶端/服務器端技術以及封送對象。
持久化數據和序列化對象。
很多章節都擴充了代碼示例,在Pearson的網站可以在線查看用Java、C# .NET、VB .NET及Objective-C編寫的代碼示例。
本書中的源碼
本書中提到的示例代碼可以在華章網站(www.hzbook.com)下載。
目 錄
譯者序
作者簡介
前言
第1章 面向對象的概念簡介
1.1 基本概念
1.2 對象及遺留系統
1.3 過程式編程與面向對象編程
1.4 由面向過程開發過渡到面向對象開發
1.4.1 過程式編程
1.4.2 面向對象編程
1.5 究竟什么是對象
1.5.1 對象數據
1.5.2 對象行為
1.6 究竟什么是類
1.6.1 創建對象
1.6.2 屬性
1.6.3 方法
1.6.4 消息
1.7 使用類圖作為可視化工具
1.8 封裝和數據隱藏
1.8.1 接口
1.8.2 實現
1.8.3 接口/實現范式的一個真實示例
1.8.4 接口/實現范式的模型
1.9 繼承
1.9.1 超類和子類
1.9.2 抽象
1.9.3 is-a關系
1.10 多態
1.11 組合
1.11.1 抽象
1.11.2 has-a關系
1.12 結語
1.13 本章中使用的示例代碼
1.13.1 C#.NET版本的TestPerson類
1.13.2 C#.NET版本的TestShape類
第2章 如何以面向對象的方式進行思考
2.1 清楚接口和實現之間的區別
2.1.1 接口
2.1.2 實現
2.1.3 一個接口/實現示例
2.2 使用抽象思維設計接口
2.3 盡可能提供最小化的用戶接口
2.3.1 確定用戶?
2.3.2 對象行為
2.3.3 環境約束
2.3.4 識別公共接口
2.3.5 識別實現
2.4 結語
2.5 引用
第3章 高級的面向對象概念
3.1 構造函數
3.1.1 什么是構造函數調用
3.1.2 構造函數中包含什么
3.1.3 默認構造函數
3.1.4 使用多個構造函數
3.1.5 設計構造函數
3.2 錯誤處理
3.2.1 忽略問題
3.2.2 檢查問題并中止應用程序
3.2.3 檢查問題并試圖恢復
3.2.4 拋出異常
3.3 作用域的重要性
3.3.1 局部屬性?
3.3.2 對象屬性
3.3.3 類屬性
3.4 操作符重載
3.5 多重繼承
3.6 對象操作
3.7 結語
3.8 引用
3.9 本章中使用的示例代碼
第4章 類的剖析
4.1 類名
4.2 注釋
4.3 屬性
4.4 構造函數
4.5 訪問器
4.6 公共接口方法
4.7 私有實現方法
4.8 結語
4.9 引用
4.10 本章中使用的示例代碼
第5章 類設計指導
5.1 對現實世界系統建模
5.2 識別公共接口
5.2.1 最小化公共接口
5.2.2 隱藏實現
5.3 設計健壯的構造函數(以及析構函數)
5.4 在類中設計錯誤處理
5.4.1 使用注釋給類加上文檔
5.4.2 構造可以合作的對象
5.5 設計時請考慮重用
5.6 設計時請考慮擴展性
5.6.1 使用描述性的名稱
5.6.2 抽象不可移植的代碼
5.6.3 提供一種方式來復制和比較對象
5.6.4 保持盡可能小的作用域
5.6.5 類的職責與自身高度相關
5.7 設計時請考慮可維護性
5.7.1 在開發過程中使用迭代
5.7.2 測試接口
5.8 使用對象持久化
5.9 結語
5.10 引用
5.11 本章中使用的示例代碼
第6章 使用對象進行設計
6.1 設計指導
6.1.1 提供正確的分析
6.1.2 編寫工作陳述文檔
6.1.3 收集需求
6.1.4 開發用戶接口的原型
6.1.5 識別類
6.1.6 確定每個類的職責
6.1.7 確定類之間如何協作
6.1.8 創建類模型來描述系統
6.1.9 建立用戶接口原型
6.2 對象包裝
6.2.1 結構化代碼
6.2.2 包裝結構化代碼
6.2.3 包裝不可移植的代碼
6.2.4 包裝已有類
6.3 結語
6.4 引用
第7章 精通繼承和組合
7.1 重用對象
7.2 繼承
7.2.1 通用和特例
7.2.2 設計決策
7.3 組合
7.4 為什么封裝是面向對象的本質
7.4.1 繼承如何減弱封裝
7.4.2 關于多態的一個具體例子
7.4.3 對象職責
7.4.4 抽象類、虛方法和協議
7.5 結語
7.6 引用
7.7 本章中使用的示例代碼
第8章 框架和重用:使用接口和抽象類進行設計
8.1 代碼:重用還是不重用
8.2 什么是框架
8.3 什么是契約
8.3.1 抽象類
8.3.2 接口
8.3.3 綜合運用
8.3.4 編譯器佐證
8.3.5 創建契約
8.3.6 系統插接點
8.4 一個電子商務示例
8.4.1 一個電子商務問題
8.4.2 非重用方式
8.4.3 電子商務解決方案
8.4.4 UML對象模型
8.5 結語
8.6 引用
8.7 本章中使用的示例代碼
第9章 創建對象及面向對象設計
9.1 組合關系
9.2 分階段構建
9.3 組合類型
9.3.1 聚合
9.3.2 聯合
9.3.3 同時使用聯合和聚合
9.4 避免依賴
9.5 基數
9.5.1 多個對象聯合
9.5.2 可選的聯合
9.6 一個綜合性示例
9.7 結語
9.8 引用
第10章 創建對象模型
10.1 什么是UML
10.2 類圖結構
10.3 屬性和方法
10.3.1 屬性
10.3.2 方法
10.4 訪問符號
10.5 繼承
10.6 接口
10.7 組合
10.7.1 聚合
10.7.2 聯合
10.8 基數
10.9 結語
10.10 引用
第11章 對象與可移植數據:XML和JSON
11.1 可移植數據
11.2 XML
11.3 XML與HTML
11.4 XML和面向對象的語言
11.5 在企業間共享數據
11.6 使用DTD驗證文檔
11.7 將DTD集成到XML文檔中
11.8 使用層疊樣式表
11.9 JavaScript對象標記
11.10 結語
11.11 引用
第12章 持久化對象:序列化、封送及關系型數據庫
12.1 持久化對象基礎
12.2 將對象保存到平面文件中
12.2.1 序列化文件
12.2.2 再次討論實現和接口
12.2.3 為什么不保存方法
12.3 序列化過程中使用XML
12.4 寫入關系型數據庫
12.5 結語
12.6 引用
12.7 本章中使用的示例代碼
第13章 Web服務、移動應用及混合應用中的對象
13.1 分布式計算的演進
13.2 基于對象的腳本語言
13.3 JavaScript驗證示例
13.4 網頁中的對象
13.4.1 JavaScript對象
13.4.2 網頁控制器
13.4.3 聲音播放器
13.4.4 電影播放器
13.4.5 Flash動畫
13.5 分布式對象及企業
13.5.1 公共對象請求代理體系結構
13.5.2 Web服務的定義
13.5.3 Web服務代碼
13.5.4 表征狀態轉移
13.6 結語
13.7 引用
第14章 對象及客戶端/服務器端應用程序
14.1 客戶端/服務器端方式
14.2 私有方式
14.2.1 序列化對象代碼
14.2.2 客戶端代碼
14.2.3 服務器端代碼
14.2.4 運行該私有的客戶端/服務器端示例
14.3 非私有方式
14.3.1 對象定義代碼
14.3.2 客戶端代碼
14.3.3 服務器端代碼
14.3.4 運行非私有客戶端/服務器端示例
14.4 結語
14.5 引用
14.6 本章中使用的示例代碼
第15章 設計模式
15.1 為什么使用設計模式
15.2 Smalltalk的模型/視圖/控制器
15.3 設計模式類型
15.3.1 創建型模式?
15.3.2 結構型模式
15.3.3 行為型模式
15.4 反模式
15.5 結語
15.6 引用
15.7 本章中使用的示例代碼?