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