《面向对象的思考过程(原书第4版)》一 导读
本節(jié)書摘來自華章出版社《面向?qū)ο蟮乃伎歼^程(原書第4版)》一書中的第3章,第3.2節(jié),[美] 馬特·魏斯費(fèi)爾德(Matt Weisfeld) 著黃博文 譯更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“華章計(jì)算機(jī)”公眾號查看。
前 言
本書內(nèi)容概要
正如書名所述,本書講述了面向?qū)ο笏伎嫉倪^程。選擇一本書的主題和書名是個很重要的決定,但如果主題概念性很強(qiáng),決定就沒那么容易了。大部分書籍都只涉及了編程及面向?qū)ο笤O(shè)計(jì)的某個方面。一些主流的書闡述了諸如面向?qū)ο蠓治?、面向?qū)ο笤O(shè)計(jì)、面向?qū)ο缶幊獭⒃O(shè)計(jì)模式、面向?qū)ο蟮臄?shù)據(jù)結(jié)構(gòu)(XML)、統(tǒng)一建模語言(UML)、面向?qū)ο骔eb開發(fā)、面向?qū)ο笠苿娱_發(fā)、進(jìn)階面向?qū)ο缶幊陶Z言等主題,當(dāng)然也包括了其他與面向?qū)ο缶幊滔嚓P(guān)的主題。
然而,許多人仔細(xì)研究這些書后,都未曾注意到這些主題都建立在同一個基礎(chǔ)之上,即如何以面向?qū)ο蟮姆绞竭M(jìn)行思考。從學(xué)生到軟件開發(fā)專業(yè)人員,往往雖然閱讀了這些書,但沒有花費(fèi)充分的時間和精力來真正理解代碼背后的設(shè)計(jì)理念。
我認(rèn)為僅學(xué)習(xí)一種特定的開發(fā)方法、一種編程語言或者一組設(shè)計(jì)工具并不能說明學(xué)會了面向?qū)ο筮@一概念。簡單來說,以面向?qū)ο蠓绞骄幊叹褪且环N思考方式。本書就討論這種面向?qū)ο蟮乃伎歼^程。
把面向?qū)ο蟮乃伎歼^程從語言、開發(fā)實(shí)踐以及工具中剝離出來并不是一個簡單的任務(wù)。在學(xué)習(xí)面向?qū)ο筮@一理念時,往往要求先深入學(xué)習(xí)一門編程語言。例如,很多年以前,大量的C語言程序員在沒有直接接觸面向?qū)ο蟾拍钪?#xff0c;就開始通過C++語言來了解面向?qū)ο?。其他軟件專家第一次接觸面向?qū)ο髣t是在演示文稿中使用UML創(chuàng)建對象模型。他們也沒有直接學(xué)習(xí)面向?qū)ο蟮母拍?。即使到現(xiàn)在,互聯(lián)網(wǎng)作為商業(yè)平臺的幾十年后,編程書籍以及專業(yè)的培訓(xùn)材料并沒有先介紹面向?qū)ο筮@一概念。
學(xué)習(xí)面向?qū)ο蟮母拍钆c學(xué)習(xí)使用面向?qū)ο笳Z言進(jìn)行編程有著巨大差異,理解這點(diǎn)很重要。我在編寫本書第1版前就意識到了這點(diǎn)。當(dāng)我閱讀Craig Larman的文章《What the UML Is-and Isn’t》時,他指出:
但是,在軟件開發(fā)工程和UML繪圖語言領(lǐng)域,讀寫UML標(biāo)記的能力有時候好像等同于面向?qū)ο蟮姆治龊驮O(shè)計(jì)能力。事實(shí)當(dāng)然并非如此,后者比前者更加重要。因此我推薦先學(xué)習(xí)面向?qū)ο蠓治龊驮O(shè)計(jì)的相關(guān)教學(xué)資料,它優(yōu)先于學(xué)習(xí)使用UML標(biāo)記的相關(guān)工具。
因此,盡管學(xué)習(xí)一門建模語言是非常重要的步驟,但先學(xué)習(xí)面向?qū)ο蟮募寄芨又匾?。如果未完全理解面向?qū)ο蟾拍钋熬蛯W(xué)習(xí)UML,這就像還未了解任何與電路相關(guān)的知識就開始學(xué)習(xí)電路圖一樣。
學(xué)習(xí)編程語言也有相同的問題。如前所述,很多C語言程序員還未直接了解任何面向?qū)ο蟮母拍?#xff0c;就想通過使用C++語言來達(dá)到面向?qū)ο蟮木辰纭T诿嬖囍薪?jīng)常會出現(xiàn)這樣的情況,很多自詡C++程序員的開發(fā)人員只是會使用C++編譯器的C程序員。甚至現(xiàn)在,諸如C#.NET、VB.NET、Objective-C以及Java等語言已經(jīng)相當(dāng)普及了,工作面試中的一些關(guān)鍵問題可以迅速暴露出這些程序員缺乏面向?qū)ο蟮乃枷搿?br />Visual Basic的早期版本并不是面向?qū)ο蟮?。C語言也不是面向?qū)ο蟮?。而C++在設(shè)計(jì)時就向后兼容C語言。因此,使用C++編譯器編寫只含C語言語法的程序,而放棄使用C++的面向?qū)ο蠊δ苁峭耆赡艿摹bjective-C是標(biāo)準(zhǔn)ANSI C語言的一個擴(kuò)展。更糟糕的是,程序員可能使用勉強(qiáng)夠用的面向?qū)ο蠊δ馨殉绦驅(qū)懗闪思炔皇敲嫦驅(qū)ο蟮囊膊皇敲嫦蜻^程的四不像產(chǎn)品。
因此,在學(xué)習(xí)使用面向?qū)ο蟮拈_發(fā)環(huán)境之前,先學(xué)習(xí)基本的面向?qū)ο蟾拍钪陵P(guān)重要。與其直接學(xué)習(xí)一門編程語言(比如Objective-C、VB .NET、C++、C# .NET或Java)或建模語言(如UML),還不如把時間花在學(xué)習(xí)面向?qū)ο蟮乃伎歼^程上。
我在使用C語言編程很多年后,于20世紀(jì)80年代后期開始參加Smalltalk語言的學(xué)習(xí)課程。當(dāng)時我所在的公司認(rèn)為公司的軟件開發(fā)人員應(yīng)該學(xué)習(xí)這個極具前途的技術(shù)。老師授課時說面向?qū)ο蟮姆妒绞侨碌乃季S方式(事實(shí)上它從20世紀(jì)60年代就已經(jīng)萌芽了)。他接著說,雖然幾乎我們所有人都是很優(yōu)秀的程序員,但還有10%~20%的人從來沒有按照面向?qū)ο蟮姆绞阶鍪?。如果該說法確實(shí)正確,那么很可能是因?yàn)楹芏鄡?yōu)秀的程序員從沒有花時間進(jìn)行編程范式的轉(zhuǎn)變,沒有深入學(xué)習(xí)面向?qū)ο蟾拍睢?br />第4版中的新增內(nèi)容
正如在前言中經(jīng)常提及的一樣,第1版中我的愿景僅僅圍繞概念本身,而不是具體的新興技術(shù)。盡管我在第2版、第3版以及第4版仍然堅(jiān)持該目標(biāo),但也引入了幾個章節(jié)講述關(guān)于應(yīng)用程序的主題,這些主題與面向?qū)ο蟾拍钇鹾隙群芨摺5?~10章涵蓋了基本的面向?qū)ο蟾拍?#xff0c;第11~15章將這些概念應(yīng)用到了一些常用的面向?qū)ο蠹夹g(shù)中。例如,第1~10章提供了面向?qū)ο蟮幕A(chǔ)課程(比如封裝、多態(tài)、繼承等),而第11~15章則介紹了一些實(shí)際應(yīng)用。
第4版相對于之前的版本拓展了很多主題。以下列出了改進(jìn)及更新的主題:
移動設(shè)備開發(fā),包括手機(jī)應(yīng)用、移動應(yīng)用以及混合開發(fā)等。
iOS環(huán)境下的Objective-C代碼示例。
使用XML及JSON實(shí)現(xiàn)可讀性強(qiáng)的數(shù)據(jù)交換。
使用CSS、XSLT等技術(shù)實(shí)現(xiàn)數(shù)據(jù)渲染與轉(zhuǎn)換。
Web服務(wù),包括簡單對象訪問協(xié)議(OAP)、RESTful Web服務(wù)等。
客戶端/服務(wù)器端技術(shù)以及封送對象。
持久化數(shù)據(jù)和序列化對象。
很多章節(jié)都擴(kuò)充了代碼示例,在Pearson的網(wǎng)站可以在線查看用Java、C# .NET、VB .NET及Objective-C編寫的代碼示例。
本書中的源碼
本書中提到的示例代碼可以在華章網(wǎng)站(www.hzbook.com)下載。
目 錄
譯者序
作者簡介
前言
第1章 面向?qū)ο蟮母拍詈喗?
1.1 基本概念
1.2 對象及遺留系統(tǒng)
1.3 過程式編程與面向?qū)ο缶幊?br />1.4 由面向過程開發(fā)過渡到面向?qū)ο箝_發(fā)
1.4.1 過程式編程
1.4.2 面向?qū)ο缶幊?
1.5 究竟什么是對象
1.5.1 對象數(shù)據(jù)
1.5.2 對象行為
1.6 究竟什么是類
1.6.1 創(chuàng)建對象
1.6.2 屬性
1.6.3 方法
1.6.4 消息
1.7 使用類圖作為可視化工具
1.8 封裝和數(shù)據(jù)隱藏
1.8.1 接口
1.8.2 實(shí)現(xiàn)
1.8.3 接口/實(shí)現(xiàn)范式的一個真實(shí)示例
1.8.4 接口/實(shí)現(xiàn)范式的模型
1.9 繼承
1.9.1 超類和子類
1.9.2 抽象
1.9.3 is-a關(guān)系
1.10 多態(tài)
1.11 組合
1.11.1 抽象
1.11.2 has-a關(guān)系
1.12 結(jié)語
1.13 本章中使用的示例代碼
1.13.1 C#.NET版本的TestPerson類
1.13.2 C#.NET版本的TestShape類
第2章 如何以面向?qū)ο蟮姆绞竭M(jìn)行思考
2.1 清楚接口和實(shí)現(xiàn)之間的區(qū)別
2.1.1 接口
2.1.2 實(shí)現(xiàn)
2.1.3 一個接口/實(shí)現(xiàn)示例
2.2 使用抽象思維設(shè)計(jì)接口
2.3 盡可能提供最小化的用戶接口
2.3.1 確定用戶?
2.3.2 對象行為
2.3.3 環(huán)境約束
2.3.4 識別公共接口
2.3.5 識別實(shí)現(xiàn)
2.4 結(jié)語
2.5 引用
第3章 高級的面向?qū)ο蟾拍?
3.1 構(gòu)造函數(shù)
3.1.1 什么是構(gòu)造函數(shù)調(diào)用
3.1.2 構(gòu)造函數(shù)中包含什么
3.1.3 默認(rèn)構(gòu)造函數(shù)
3.1.4 使用多個構(gòu)造函數(shù)
3.1.5 設(shè)計(jì)構(gòu)造函數(shù)
3.2 錯誤處理
3.2.1 忽略問題
3.2.2 檢查問題并中止應(yīng)用程序
3.2.3 檢查問題并試圖恢復(fù)
3.2.4 拋出異常
3.3 作用域的重要性
3.3.1 局部屬性?
3.3.2 對象屬性
3.3.3 類屬性
3.4 操作符重載
3.5 多重繼承
3.6 對象操作
3.7 結(jié)語
3.8 引用
3.9 本章中使用的示例代碼
第4章 類的剖析
4.1 類名
4.2 注釋
4.3 屬性
4.4 構(gòu)造函數(shù)
4.5 訪問器
4.6 公共接口方法
4.7 私有實(shí)現(xiàn)方法
4.8 結(jié)語
4.9 引用
4.10 本章中使用的示例代碼
第5章 類設(shè)計(jì)指導(dǎo)
5.1 對現(xiàn)實(shí)世界系統(tǒng)建模
5.2 識別公共接口
5.2.1 最小化公共接口
5.2.2 隱藏實(shí)現(xiàn)
5.3 設(shè)計(jì)健壯的構(gòu)造函數(shù)(以及析構(gòu)函數(shù))
5.4 在類中設(shè)計(jì)錯誤處理
5.4.1 使用注釋給類加上文檔
5.4.2 構(gòu)造可以合作的對象
5.5 設(shè)計(jì)時請考慮重用
5.6 設(shè)計(jì)時請考慮擴(kuò)展性
5.6.1 使用描述性的名稱
5.6.2 抽象不可移植的代碼
5.6.3 提供一種方式來復(fù)制和比較對象
5.6.4 保持盡可能小的作用域
5.6.5 類的職責(zé)與自身高度相關(guān)
5.7 設(shè)計(jì)時請考慮可維護(hù)性
5.7.1 在開發(fā)過程中使用迭代
5.7.2 測試接口
5.8 使用對象持久化
5.9 結(jié)語
5.10 引用
5.11 本章中使用的示例代碼
第6章 使用對象進(jìn)行設(shè)計(jì)
6.1 設(shè)計(jì)指導(dǎo)
6.1.1 提供正確的分析
6.1.2 編寫工作陳述文檔
6.1.3 收集需求
6.1.4 開發(fā)用戶接口的原型
6.1.5 識別類
6.1.6 確定每個類的職責(zé)
6.1.7 確定類之間如何協(xié)作
6.1.8 創(chuàng)建類模型來描述系統(tǒng)
6.1.9 建立用戶接口原型
6.2 對象包裝
6.2.1 結(jié)構(gòu)化代碼
6.2.2 包裝結(jié)構(gòu)化代碼
6.2.3 包裝不可移植的代碼
6.2.4 包裝已有類
6.3 結(jié)語
6.4 引用
第7章 精通繼承和組合
7.1 重用對象
7.2 繼承
7.2.1 通用和特例
7.2.2 設(shè)計(jì)決策
7.3 組合
7.4 為什么封裝是面向?qū)ο蟮谋举|(zhì)
7.4.1 繼承如何減弱封裝
7.4.2 關(guān)于多態(tài)的一個具體例子
7.4.3 對象職責(zé)
7.4.4 抽象類、虛方法和協(xié)議
7.5 結(jié)語
7.6 引用
7.7 本章中使用的示例代碼
第8章 框架和重用:使用接口和抽象類進(jìn)行設(shè)計(jì)
8.1 代碼:重用還是不重用
8.2 什么是框架
8.3 什么是契約
8.3.1 抽象類
8.3.2 接口
8.3.3 綜合運(yùn)用
8.3.4 編譯器佐證
8.3.5 創(chuàng)建契約
8.3.6 系統(tǒng)插接點(diǎn)
8.4 一個電子商務(wù)示例
8.4.1 一個電子商務(wù)問題
8.4.2 非重用方式
8.4.3 電子商務(wù)解決方案
8.4.4 UML對象模型
8.5 結(jié)語
8.6 引用
8.7 本章中使用的示例代碼
第9章 創(chuàng)建對象及面向?qū)ο笤O(shè)計(jì)
9.1 組合關(guān)系
9.2 分階段構(gòu)建
9.3 組合類型
9.3.1 聚合
9.3.2 聯(lián)合
9.3.3 同時使用聯(lián)合和聚合
9.4 避免依賴
9.5 基數(shù)
9.5.1 多個對象聯(lián)合
9.5.2 可選的聯(lián)合
9.6 一個綜合性示例
9.7 結(jié)語
9.8 引用
第10章 創(chuàng)建對象模型
10.1 什么是UML
10.2 類圖結(jié)構(gòu)
10.3 屬性和方法
10.3.1 屬性
10.3.2 方法
10.4 訪問符號
10.5 繼承
10.6 接口
10.7 組合
10.7.1 聚合
10.7.2 聯(lián)合
10.8 基數(shù)
10.9 結(jié)語
10.10 引用
第11章 對象與可移植數(shù)據(jù):XML和JSON
11.1 可移植數(shù)據(jù)
11.2 XML
11.3 XML與HTML
11.4 XML和面向?qū)ο蟮恼Z言
11.5 在企業(yè)間共享數(shù)據(jù)
11.6 使用DTD驗(yàn)證文檔
11.7 將DTD集成到XML文檔中
11.8 使用層疊樣式表
11.9 JavaScript對象標(biāo)記
11.10 結(jié)語
11.11 引用
第12章 持久化對象:序列化、封送及關(guān)系型數(shù)據(jù)庫
12.1 持久化對象基礎(chǔ)
12.2 將對象保存到平面文件中
12.2.1 序列化文件
12.2.2 再次討論實(shí)現(xiàn)和接口
12.2.3 為什么不保存方法
12.3 序列化過程中使用XML
12.4 寫入關(guān)系型數(shù)據(jù)庫
12.5 結(jié)語
12.6 引用
12.7 本章中使用的示例代碼
第13章 Web服務(wù)、移動應(yīng)用及混合應(yīng)用中的對象
13.1 分布式計(jì)算的演進(jìn)
13.2 基于對象的腳本語言
13.3 JavaScript驗(yàn)證示例
13.4 網(wǎng)頁中的對象
13.4.1 JavaScript對象
13.4.2 網(wǎng)頁控制器
13.4.3 聲音播放器
13.4.4 電影播放器
13.4.5 Flash動畫
13.5 分布式對象及企業(yè)
13.5.1 公共對象請求代理體系結(jié)構(gòu)
13.5.2 Web服務(wù)的定義
13.5.3 Web服務(wù)代碼
13.5.4 表征狀態(tài)轉(zhuǎn)移
13.6 結(jié)語
13.7 引用
第14章 對象及客戶端/服務(wù)器端應(yīng)用程序
14.1 客戶端/服務(wù)器端方式
14.2 私有方式
14.2.1 序列化對象代碼
14.2.2 客戶端代碼
14.2.3 服務(wù)器端代碼
14.2.4 運(yùn)行該私有的客戶端/服務(wù)器端示例
14.3 非私有方式
14.3.1 對象定義代碼
14.3.2 客戶端代碼
14.3.3 服務(wù)器端代碼
14.3.4 運(yùn)行非私有客戶端/服務(wù)器端示例
14.4 結(jié)語
14.5 引用
14.6 本章中使用的示例代碼
第15章 設(shè)計(jì)模式
15.1 為什么使用設(shè)計(jì)模式
15.2 Smalltalk的模型/視圖/控制器
15.3 設(shè)計(jì)模式類型
15.3.1 創(chuàng)建型模式?
15.3.2 結(jié)構(gòu)型模式
15.3.3 行為型模式
15.4 反模式
15.5 結(jié)語
15.6 引用
15.7 本章中使用的示例代碼?
總結(jié)
以上是生活随笔為你收集整理的《面向对象的思考过程(原书第4版)》一 导读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《思科数据中心I/O整合》一2.11 活
- 下一篇: 《游戏编程模式》一7.8 并发状态机