讀書筆記《Thinking in Java》-第一章-07/10/13
Posted on 2007-10-13 21:23 Raylong 閱讀(1272) 評論(4) 編輯 收藏 所屬分類: 讀書筆記讀書筆記《Thinking in Java》-第一章-07/10/13
1、所有編程語言都提供抽象機(jī)制。可以認(rèn)為,人們所能解決的問題的復(fù)雜性直接取決于抽象的類型和質(zhì)量。……匯編、C等所做的抽象仍要求在解決問題時要基于計算機(jī)的結(jié)構(gòu),而不是基于所要解決的問題的結(jié)構(gòu)來考量。程序員必須建立起在機(jī)器模型和實(shí)際解決問題的模型之間的關(guān)聯(lián)。建立這種映射是費(fèi)力的,而且這不屬于編程語言所固有的功能。
(早期的程序員都是很強(qiáng)的……)
2、面向?qū)ο蠓绞绞沟贸绦騿T不再受限于任何特定類型的問題。這種思想的實(shí)質(zhì)是:程序可以通過添加新類型的對象,使得自身適用于某個特定問題。因此,在閱讀描述解決方案的代碼的同時,也是在閱讀問題的表述。所以O(shè)OP允許根據(jù)問題來描述問題。每個對象看起來像一臺微型計算計---他有狀態(tài),也有操作……
(創(chuàng)建一個學(xué)生管理程序,首先最重要的類是Student,他可以有名字、學(xué)號、院系、班級等屬性,并且可以計算每個學(xué)生的綜合素質(zhì)評分、打印各科成績等等。一旦這些都描述好了,你就可以創(chuàng)建學(xué)生Student實(shí)例,對學(xué)生執(zhí)行操作了。這就是OOP吧。)
3、面向?qū)ο蟮奈鍌€基本特征:
A、萬物皆對象。(Java中的原始數(shù)據(jù)類型就不是對象,但是這是出于對效率的權(quán)衡。再者說了,每個原始數(shù)據(jù)類型都有相應(yīng)的包裝器類型,這就把原始類型對象化了。)
B、程序是對象的集合,它們通過發(fā)送消息來告知彼此所要做的。(通過“.”操作符。)
C、每個對象都有自己由其他對象所構(gòu)成的存儲。(樓對象是由鋼筋、水泥、磚頭等等這些對象構(gòu)成。)
D、每個對象都有其類型。(可以通過反射機(jī)制實(shí)現(xiàn)動態(tài)的類型檢查。)
E、某一特定類型的所有對象都可以接收同樣的消息。(傳說中的多態(tài)了,通過父類的引用操作子類。)
4、面向?qū)ο蟪绦蛟O(shè)計的挑戰(zhàn)之一就是,在問題空間的元素和解空間的對象之間創(chuàng)建一對一的映射。建立類,創(chuàng)建對象,然后操縱它們,這就是OOP的全部了。
(問題描述出來了,也就解決了。)
5、每個對象都有一個接口,也就是都只能滿足某些要求,這些要求就是對象的接口定義的。
(聽說有的java架構(gòu)師只給出接口,然后程序員就開工了……沒親眼見到,不知是不是這樣的。)
6、當(dāng)試圖開發(fā)或理解一個程序設(shè)計時,最好的方法是將對象想象為“服務(wù)提供者”,程序本身向用戶提供服務(wù),它通過調(diào)用其他對象提供的服務(wù)來實(shí)現(xiàn)這一目的。你可以創(chuàng)建,也可以從現(xiàn)成的代碼庫中尋找能夠提供理想服務(wù)的對象。
(Java有一個幾乎無所不包的類庫,這個庫還在不斷地增大、改進(jìn)。Java水平的高低指標(biāo)之一就是你能否熟練地使用類庫,快速地查找,并且正確地運(yùn)用。這種能力和時間成正比的。運(yùn)用類庫能提高開發(fā)效率和代碼的質(zhì)量,)
7、在良好的面向?qū)ο笤O(shè)計中,每個對象都可以很好地完成一項任務(wù),但它并不試圖做更多的事。如此做的好處之一就是使對象在別處復(fù)用成為可能。
(該干嘛就干嘛,有助于提高類的內(nèi)聚性。一個無所不能的類有,且只有一個,那就是God類。)
8、(再次強(qiáng)調(diào)對象是服務(wù)提供者)將對象作為服務(wù)提供者是一件偉大的簡化工具,它不僅在設(shè)計過程中非常有用,而且在他人試圖理解你的代碼或者重用某個對象時,它會使調(diào)整對象以適應(yīng)其設(shè)計的過程變得簡單得多。
9、隱藏實(shí)現(xiàn)的概念再怎么強(qiáng)調(diào)也不過分。訪問控制的第一存在原因就是讓客戶端程序員無法觸及它們不應(yīng)該觸及的部分。第二個原因就是,允許庫設(shè)計者可以改變類內(nèi)部的工作方式而不用擔(dān)心會影響到客戶端程序員。
(無論哪家的電器的廠家,都不會讓電路裸露在外面。用戶需要的是一個遙控器和說明書就足夠了。Java庫一直在更新升級,但是由于良好的設(shè)計隱藏了實(shí)現(xiàn),舊有的代碼無需重新編譯就能獲得更高的性能!)
10、事實(shí)證明,復(fù)用性并不容易達(dá)到我們所希望的那種程度,產(chǎn)生一個可復(fù)用的類需要豐富的經(jīng)驗(yàn)和敏銳的洞察力。代碼復(fù)用是OOP所提供的最了不起的優(yōu)點(diǎn)之一。最簡單的復(fù)用就是直接使用一個類的對象。使用現(xiàn)有的類合成新的類,被稱為組合。組合帶來極大的靈活性。新類的成員對象通常被聲明為private,使得新類的客戶端程序員不能訪問它們。
(我想建立一個個人的Java代碼庫,把一些庫中沒有的常用的功能加進(jìn)其中,復(fù)用。)
11、繼承在OOP中如此重要,總被高度地強(qiáng)調(diào),于是程序員新手就會有這樣的印象:處處使用繼承。這會導(dǎo)致難以使用并過分復(fù)雜的設(shè)計。實(shí)際上,建立新類時,應(yīng)優(yōu)先考慮組合,因?yàn)樗雍唵戊`活。一旦有了經(jīng)驗(yàn)就會看出必須使用繼承的場合了。
12、繼承---接口的復(fù)用。當(dāng)父類發(fā)生變化時,子類就會受到牽連。這就是繼承的不靈活的地方。
(房屋的根基動搖了,上層建筑自然要不穩(wěn)了。)
13、以同樣的術(shù)語將解決方案換成問題是大有裨益的,因?yàn)椴恍枰趩栴}描述和解決方案描述之間建立許多中間模型。可以直接從真實(shí)世界中對系統(tǒng)的描述過度到用代碼對系統(tǒng)進(jìn)行描述。(下面這段很有意思)事實(shí)上,對使用面向?qū)ο笤O(shè)計的人們來說,困難之一是從開始到結(jié)束過于簡單。對于訓(xùn)練有素、善于尋找復(fù)雜的解決方案的頭腦來說,可能會在一開始被這種簡單性嚇倒。
(實(shí)際上,像我這種直接學(xué)Java的人來說,學(xué)C/C++是不可想象的……學(xué)中醫(yī)的搞西醫(yī)相對簡單,學(xué)西醫(yī)的搞中醫(yī)就不那么輕松了。)
14、有兩種方式可以導(dǎo)致基類和子類的不同。第一,有時基類的方法并不能需求,那么在可以子類中添加新的方法。但是,應(yīng)該仔細(xì)考慮是否在基類也添加這些額外的方法。這種設(shè)計的發(fā)現(xiàn)與迭代過程在面向?qū)ο蟪绦蛟O(shè)計中會經(jīng)常發(fā)生。第二,改變現(xiàn)有的基類的方法的行為,這被稱為覆蓋。
15、繼承應(yīng)該只覆蓋基類的方法嗎?如果這樣做了,子類和基類就具有完全相同的接口。這被稱為“純粹替代”。這是一種處理繼承的理想的方式。此種關(guān)系可稱之為“is a”關(guān)系。如果子類添加了新的方法,那么他和基類的關(guān)系是“is like a”關(guān)系。
1、所有編程語言都提供抽象機(jī)制。可以認(rèn)為,人們所能解決的問題的復(fù)雜性直接取決于抽象的類型和質(zhì)量。……匯編、C等所做的抽象仍要求在解決問題時要基于計算機(jī)的結(jié)構(gòu),而不是基于所要解決的問題的結(jié)構(gòu)來考量。程序員必須建立起在機(jī)器模型和實(shí)際解決問題的模型之間的關(guān)聯(lián)。建立這種映射是費(fèi)力的,而且這不屬于編程語言所固有的功能。
(早期的程序員都是很強(qiáng)的……)
2、面向?qū)ο蠓绞绞沟贸绦騿T不再受限于任何特定類型的問題。這種思想的實(shí)質(zhì)是:程序可以通過添加新類型的對象,使得自身適用于某個特定問題。因此,在閱讀描述解決方案的代碼的同時,也是在閱讀問題的表述。所以O(shè)OP允許根據(jù)問題來描述問題。每個對象看起來像一臺微型計算計---他有狀態(tài),也有操作……
(創(chuàng)建一個學(xué)生管理程序,首先最重要的類是Student,他可以有名字、學(xué)號、院系、班級等屬性,并且可以計算每個學(xué)生的綜合素質(zhì)評分、打印各科成績等等。一旦這些都描述好了,你就可以創(chuàng)建學(xué)生Student實(shí)例,對學(xué)生執(zhí)行操作了。這就是OOP吧。)
3、面向?qū)ο蟮奈鍌€基本特征:
A、萬物皆對象。(Java中的原始數(shù)據(jù)類型就不是對象,但是這是出于對效率的權(quán)衡。再者說了,每個原始數(shù)據(jù)類型都有相應(yīng)的包裝器類型,這就把原始類型對象化了。)
B、程序是對象的集合,它們通過發(fā)送消息來告知彼此所要做的。(通過“.”操作符。)
C、每個對象都有自己由其他對象所構(gòu)成的存儲。(樓對象是由鋼筋、水泥、磚頭等等這些對象構(gòu)成。)
D、每個對象都有其類型。(可以通過反射機(jī)制實(shí)現(xiàn)動態(tài)的類型檢查。)
E、某一特定類型的所有對象都可以接收同樣的消息。(傳說中的多態(tài)了,通過父類的引用操作子類。)
4、面向?qū)ο蟪绦蛟O(shè)計的挑戰(zhàn)之一就是,在問題空間的元素和解空間的對象之間創(chuàng)建一對一的映射。建立類,創(chuàng)建對象,然后操縱它們,這就是OOP的全部了。
(問題描述出來了,也就解決了。)
5、每個對象都有一個接口,也就是都只能滿足某些要求,這些要求就是對象的接口定義的。
(聽說有的java架構(gòu)師只給出接口,然后程序員就開工了……沒親眼見到,不知是不是這樣的。)
6、當(dāng)試圖開發(fā)或理解一個程序設(shè)計時,最好的方法是將對象想象為“服務(wù)提供者”,程序本身向用戶提供服務(wù),它通過調(diào)用其他對象提供的服務(wù)來實(shí)現(xiàn)這一目的。你可以創(chuàng)建,也可以從現(xiàn)成的代碼庫中尋找能夠提供理想服務(wù)的對象。
(Java有一個幾乎無所不包的類庫,這個庫還在不斷地增大、改進(jìn)。Java水平的高低指標(biāo)之一就是你能否熟練地使用類庫,快速地查找,并且正確地運(yùn)用。這種能力和時間成正比的。運(yùn)用類庫能提高開發(fā)效率和代碼的質(zhì)量,)
7、在良好的面向?qū)ο笤O(shè)計中,每個對象都可以很好地完成一項任務(wù),但它并不試圖做更多的事。如此做的好處之一就是使對象在別處復(fù)用成為可能。
(該干嘛就干嘛,有助于提高類的內(nèi)聚性。一個無所不能的類有,且只有一個,那就是God類。)
8、(再次強(qiáng)調(diào)對象是服務(wù)提供者)將對象作為服務(wù)提供者是一件偉大的簡化工具,它不僅在設(shè)計過程中非常有用,而且在他人試圖理解你的代碼或者重用某個對象時,它會使調(diào)整對象以適應(yīng)其設(shè)計的過程變得簡單得多。
9、隱藏實(shí)現(xiàn)的概念再怎么強(qiáng)調(diào)也不過分。訪問控制的第一存在原因就是讓客戶端程序員無法觸及它們不應(yīng)該觸及的部分。第二個原因就是,允許庫設(shè)計者可以改變類內(nèi)部的工作方式而不用擔(dān)心會影響到客戶端程序員。
(無論哪家的電器的廠家,都不會讓電路裸露在外面。用戶需要的是一個遙控器和說明書就足夠了。Java庫一直在更新升級,但是由于良好的設(shè)計隱藏了實(shí)現(xiàn),舊有的代碼無需重新編譯就能獲得更高的性能!)
10、事實(shí)證明,復(fù)用性并不容易達(dá)到我們所希望的那種程度,產(chǎn)生一個可復(fù)用的類需要豐富的經(jīng)驗(yàn)和敏銳的洞察力。代碼復(fù)用是OOP所提供的最了不起的優(yōu)點(diǎn)之一。最簡單的復(fù)用就是直接使用一個類的對象。使用現(xiàn)有的類合成新的類,被稱為組合。組合帶來極大的靈活性。新類的成員對象通常被聲明為private,使得新類的客戶端程序員不能訪問它們。
(我想建立一個個人的Java代碼庫,把一些庫中沒有的常用的功能加進(jìn)其中,復(fù)用。)
11、繼承在OOP中如此重要,總被高度地強(qiáng)調(diào),于是程序員新手就會有這樣的印象:處處使用繼承。這會導(dǎo)致難以使用并過分復(fù)雜的設(shè)計。實(shí)際上,建立新類時,應(yīng)優(yōu)先考慮組合,因?yàn)樗雍唵戊`活。一旦有了經(jīng)驗(yàn)就會看出必須使用繼承的場合了。
12、繼承---接口的復(fù)用。當(dāng)父類發(fā)生變化時,子類就會受到牽連。這就是繼承的不靈活的地方。
(房屋的根基動搖了,上層建筑自然要不穩(wěn)了。)
13、以同樣的術(shù)語將解決方案換成問題是大有裨益的,因?yàn)椴恍枰趩栴}描述和解決方案描述之間建立許多中間模型。可以直接從真實(shí)世界中對系統(tǒng)的描述過度到用代碼對系統(tǒng)進(jìn)行描述。(下面這段很有意思)事實(shí)上,對使用面向?qū)ο笤O(shè)計的人們來說,困難之一是從開始到結(jié)束過于簡單。對于訓(xùn)練有素、善于尋找復(fù)雜的解決方案的頭腦來說,可能會在一開始被這種簡單性嚇倒。
(實(shí)際上,像我這種直接學(xué)Java的人來說,學(xué)C/C++是不可想象的……學(xué)中醫(yī)的搞西醫(yī)相對簡單,學(xué)西醫(yī)的搞中醫(yī)就不那么輕松了。)
14、有兩種方式可以導(dǎo)致基類和子類的不同。第一,有時基類的方法并不能需求,那么在可以子類中添加新的方法。但是,應(yīng)該仔細(xì)考慮是否在基類也添加這些額外的方法。這種設(shè)計的發(fā)現(xiàn)與迭代過程在面向?qū)ο蟪绦蛟O(shè)計中會經(jīng)常發(fā)生。第二,改變現(xiàn)有的基類的方法的行為,這被稱為覆蓋。
15、繼承應(yīng)該只覆蓋基類的方法嗎?如果這樣做了,子類和基類就具有完全相同的接口。這被稱為“純粹替代”。這是一種處理繼承的理想的方式。此種關(guān)系可稱之為“is a”關(guān)系。如果子類添加了新的方法,那么他和基類的關(guān)系是“is like a”關(guān)系。