譯者序
作者簡介
前言
第1章 麵嚮對象的概念簡介 1
1.1 基本概念 1
1.2 對象及遺留係統 2
1.3 過程式編程與麵嚮對象編程 3
1.4 由麵嚮過程開發過渡到麵嚮對象開發 5
1.4.1 過程式編程 5
1.4.2 麵嚮對象編程 6
1.5 究竟什麼是對象 6
1.5.1 對象數據 6
1.5.2 對象行為 7
1.6 究竟什麼是類 10
1.6.1 創建對象 10
1.6.2 屬性 11
1.6.3 方法 11
1.6.4 消息 12
1.7 使用類圖作為可視化工具 12
1.8 封裝和數據隱藏 12
1.8.1 接口 13
1.8.2 實現 13
1.8.3 接口/實現範式的一個真實示例 14
1.8.4 接口/實現範式的模型 14
1.9 繼承 15
1.9.1 超類和子類 16
1.9.2 抽象 16
1.9.3 is-a關係 17
1.10 多態 18
1.11 組閤 21
1.11.1 抽象 21
1.11.2 has-a關係 21
1.12 結語 21
1.13 本章中使用的示例代碼 22
1.13.1 C#.NET版本的TestPerson類 22
1.13.2 C#.NET版本的TestShape類 23
第2章 如何以麵嚮對象的方式進行思考 25
2.1 清楚接口和實現之間的區彆 26
2.1.1 接口 27
2.1.2 實現 27
2.1.3 一個接口/實現示例 28
2.2 使用抽象思維設計接口 31
2.3 盡可能提供最小化的用戶接口 32
2.3.1 確定用戶? 33
2.3.2 對象行為 33
2.3.3 環境約束 34
2.3.4 識彆公共接口 34
2.3.5 識彆實現 34
2.4 結語 35
2.5 引用 35
第3章 高級的麵嚮對象概念 36
3.1 構造函數 36
3.1.1 什麼是構造函數調用 37
3.1.2 構造函數中包含什麼 37
3.1.3 默認構造函數 37
3.1.4 使用多個構造函數 38
3.1.5 設計構造函數 41
3.2 錯誤處理 41
3.2.1 忽略問題 42
3.2.2 檢查問題並中止應用程序 42
3.2.3 檢查問題並試圖恢復 42
3.2.4 拋齣異常 43
3.3 作用域的重要性 45
3.3.1 局部屬性? 45
3.3.2 對象屬性 46
3.3.3 類屬性 48
3.4 操作符重載 49
3.5 多重繼承 49
3.6 對象操作 50
3.7 結語 51
3.8 引用 51
3.9 本章中使用的示例代碼 51
第4章 類的剖析 53
4.1 類名 53
4.2 注釋 55
4.3 屬性 55
4.4 構造函數 56
4.5 訪問器 58
4.6 公共接口方法 60
4.7 私有實現方法 60
4.8 結語 61
4.9 引用 61
4.10 本章中使用的示例代碼 61
第5章 類設計指導 63
5.1 對現實世界係統建模 63
5.2 識彆公共接口 64
5.2.1 最小化公共接口 64
5.2.2 隱藏實現 65
5.3 設計健壯的構造函數(以及析構函數) 65
5.4 在類中設計錯誤處理 66
5.4.1 使用注釋給類加上文檔 66
5.4.2 構造可以閤作的對象 67
5.5 設計時請考慮重用 67
5.6 設計時請考慮擴展性 67
5.6.1 使用描述性的名稱 67
5.6.2 抽象不可移植的代碼 68
5.6.3 提供一種方式來復製和比較對象 68
5.6.4 保持盡可能小的作用域 69
5.6.5 類的職責與自身高度相關 70
5.7 設計時請考慮可維護性 71
5.7.1 在開發過程中使用迭代 71
5.7.2 測試接口 72
5.8 使用對象持久化 73
5.9 結語 75
5.10 引用 75
5.11 本章中使用的示例代碼 75
第6章 使用對象進行設計 77
6.1 設計指導 77
6.1.1 提供正確的分析 79
6.1.2 編寫工作陳述文檔 80
6.1.3 收集需求 80
6.1.4 開發用戶接口的原型 81
6.1.5 識彆類 81
6.1.6 確定每個類的職責 81
6.1.7 確定類之間如何協作 81
6.1.8 創建類模型來描述係統 81
6.1.9 建立用戶接口原型 82
6.2 對象包裝 82
6.2.1 結構化代碼 83
6.2.2 包裝結構化代碼 84
6.2.3 包裝不可移植的代碼 85
6.2.4 包裝已有類 86
6.3 結語 87
6.4 引用 87
第7章 精通繼承和組閤 88
7.1 重用對象 88
7.2 繼承 89
7.2.1 通用和特例 91
7.2.2 設計決策 92
7.3 組閤 93
7.4 為什麼封裝是麵嚮對象的本質 95
7.4.1 繼承如何減弱封裝 96
7.4.2 關於多態的一個具體例子 97
7.4.3 對象職責 98
7.4.4 抽象類、虛方法和協議 101
7.5 結語 102
7.6 引用 103
7.7 本章中使用的示例代碼 103
第8章 框架和重用:使用接口和抽象類進行設計 105
8.1 代碼:重用還是不重用 105
8.2 什麼是框架 106
8.3 什麼是契約 107
8.3.1 抽象類 108
8.3.2 接口 110
8.3.3 綜閤運用 112
8.3.4 編譯器佐證 114
8.3.5 創建契約 115
8.3.6 係統插接點 117
8.4 一個電子商務示例 117
8.4.1 一個電子商務問題 117
8.4.2 非重用方式 118
8.4.3 電子商務解決方案 119
8.4.4 UML對象模型 120
8.5 結語 124
8.6 引用 124
8.7 本章中使用的示例代碼 124
第9章 創建對象及麵嚮對象設計 128
9.1 組閤關係 129
9.2 分階段構建 129
9.3 組閤類型 131
9.3.1 聚閤 131
9.3.2 聯閤 132
9.3.3 同時使用聯閤和聚閤 133
9.4 避免依賴 133
9.5 基數 134
9.5.1 多個對象聯閤 136
9.5.2 可選的聯閤 137
9.6 一個綜閤性示例 137
9.7 結語 138
9.8 引用 138
第10章 創建對象模型 139
10.1 什麼是UML 139
10.2 類圖結構 140
10.3 屬性和方法 141
10.3.1 屬性 142
10.3.2 方法 142
10.4 訪問符號 142
10.5 繼承 143
10.6 接口 145
10.7 組閤 145
10.7.1 聚閤 145
10.7.2 聯閤 146
10.8 基數 147
10.9 結語 148
10.10 引用 149
第11章 對象與可移植數據:XML和JSON 150
11.1 可移植數據 150
11.2 XML 152
11.3 XML與HTML 152
11.4 XML和麵嚮對象的語言 153
11.5 在企業間共享數據 154
11.6 使用DTD驗證文檔 155
11.7 將DTD集成到XML文檔中 156
11.8 使用層疊樣式錶 161
11.9 JavaScript對象標記 163
11.10 結語 167
11.11 引用 167
第12章 持久化對象:序列化、封送及關係型數據庫 168
12.1 持久化對象基礎 168
12.2 將對象保存到平麵文件中 169
12.2.1 序列化文件 170
12.2.2 再次討論實現和接口 172
12.2.3 為什麼不保存方法 173
12.3 序列化過程中使用XML 173
12.4 寫入關係型數據庫 176
12.5 結語 179
12.6 引用 179
12.7 本章中使用的示例代碼 179
第13章 Web服務、移動應用及混閤應用中的對象 183
13.1 分布式計算的演進 183
13.2 基於對象的腳本語言 184
13.3 JavaScript驗證示例 186
13.4 網頁中的對象 189
13.4.1 JavaScript對象 189
13.4.2 網頁控製器 191
13.4.3 聲音播放器 192
13.4.4 電影播放器 192
13.4.5 Flash動畫 193
13.5 分布式對象及企業 193
13.5.1 公共對象請求代理體係結構 195
13.5.2 Web服務的定義 197
13.5.3 Web服務代碼 201
13.5.4 錶徵狀態轉移 202
13.6 結語 203
13.7 引用 203
第14章 對象及客戶端/服務器端應用程序 204
14.1 客戶端/服務器端方式 204
14.2 私有方式 205
14.2.1 序列化對象代碼 205
14.2.2 客戶端代碼 206
14.2.3 服務器端代碼 208
14.2.4 運行該私有的客戶端/服務器端示例 209
14.3 非私有方式 210
14.3.1 對象定義代碼 211
14.3.2 客戶端代碼 212
14.3.3 服務器端代碼 213
14.3.4 運行非私有客戶端/服務器端示例 215
14.4 結語 215
14.5 引用 216
14.6 本章中使用的示例代碼 216
第15章 設計模式 217
15.1 為什麼使用設計模式 218
15.2 Smalltalk的模型/視圖/控製器 219
15.3 設計模式類型 220
15.3.1 創建型模式? 220
15.3.2 結構型模式 224
15.3.3 行為型模式 227
15.4 反模式 228
15.5 結語 229
15.6 引用 229
15.7 本章中使用的示例代碼? 229
· · · · · · (
收起)
〔簡介〕
本書是一部獨具特色的麵嚮對象技術著作。書中結閤代碼示例生動透徹地講述瞭麵嚮對象思想的精髓,讓讀者真正學會以對象方式進行思考。本書共15章,在結構上可以分為兩部分:第一部分包括第1~10章,探討麵嚮對象的基本概念,比如封裝、多態、繼承等;第二部分包括第11~15章,專注於將這些概念應用於一些通用的麵嚮對象技術中,並結閤瞭一些實用的應用程序。
本書內容精煉,示例簡單明瞭,適閤各層次麵嚮對象開發人員閱讀,也是高校相關專業麵嚮對象課程的理想教學參考書。
〔譯序〕
很多IT從業人員進入這個行業都是從學習一門編程語言開始的。對於編程,我們往往過於關注語言的語法細節,反而忽略瞭其背後的設計理念。麵嚮對象的思考過程就是一個非常優秀的設計理念。它可以獨立於語言存在。如果你熟練掌握瞭麵嚮對象的思考過程,那麼就可以輕鬆地在不同的麵嚮對象的語言之間切換。
本書透徹地闡述瞭麵嚮對象這一概念。作者Matt在書中反復強調學習麵嚮對象的思考過程優於學習任何編程語言或工具。事實上,他也是這麼做的。Matt闡述瞭麵嚮對象的三要素:繼承、封裝、多態,並且自己加上瞭第四個要素:組閤。關於組閤,Matt不惜篇幅做瞭大量的講解,並且列舉瞭很多通俗易懂的例子,這也是本書的一大特色。
Matt也糾正瞭人們的一些普遍誤解,比如麵嚮對象的範式與麵嚮過程的範式並不是完全對立的關係。而且在應用麵嚮對象的設計和開發時,Matt也講解瞭不少如何與遺留係統集成的技巧。同時,Matt也簡要介紹瞭UML這個建模利器。為瞭不混淆重點,他把介紹UML的章節放置在很靠後的位置。因為他明白,先瞭解麵嚮對象的各項概念是最重要的。
我雖然擁有多年的從業經驗,但是再看本書時仍然有不少收獲。其實自從我接觸瞭函數式編程,就漸漸成為函數式編程的擁躉。我會時不時地“鼓吹”函數式編程範式的好處,順便“貶低”一下麵嚮對象編程。但同時我也有個疑問,既然函數式編程這麼好,為什麼這幾年的發展隻能算是波瀾不驚,而沒有掀起大風浪呢?讀瞭本書之後,我似乎找到瞭答案。首先麵嚮對象的思考過程更加符閤大傢對世界的直觀感受,畢竟不是每個人都是數學傢。函數式編程可以簡化很多問題,但它並不能簡化所有問題。其次是麵嚮對象的編程範式和函數式編程的範式並不是完全對立的,正如作者講過,麵嚮過程的編程範式和麵嚮對象的編程範式也不是完全對立的。比如目前流行的一些語言(Scala、Go等)都具備函數式的特點,也兼具麵嚮對象的特點(隻不過它們的麵嚮對象的機製與傳統的方式有所不同)。所以無論你喜歡哪種編程範式,瞭解彼此的不同之處是至關重要的。而本書則是瞭解麵嚮對象範式的優秀書籍。
本書已經更新到瞭第4版。從本書長達10多年的跨度來看,麵嚮對象範式經久不衰。Matt也適時地在新版中加入瞭一些新的主題,比如可移植數據、分布式係統、Web服務等。Matt不僅闡述瞭這些技術,還講述瞭它們的前世今生。這樣可以幫助讀者更加充分地瞭解技術的演化之路。
無論你是否有麵嚮對象編程的經驗,本書都適閤你作為麵嚮對象思考的旅程開端。最後,希望本書能給大傢帶來超凡的閱讀體驗。