Think in Java反芻筆記(2)---對象是什麼(2)

在Think in Java 中對象是將問題空間中的元素以及它們在方案空間的表示物成爲“對象”,如在問題空間沒有對應體的其他對象,則可通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所有對象都有其特徵和行爲(參考P27)。
個人註解:在上面這段話的意思是對象時問題空間中元素的抽象物,以及該抽象物(對象)有其特徵和行爲。我們可以從這段話中分析出怎麼樣去抽取對象,以及對象的特徵:都有其特徵和行爲。

“純粹”的面向對象程序設計方法是什麼樣的:
      1:所有東西都有對象。可將對象想象成一種新型變量;它保存着數據,但可要求它對自身進行操作。理論上說,可從要解決的問題身上提出所有概念性的組件,然後在程序中將其表達爲一個對象。
      2:程序是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什麼。爲了向對象發出請求,需向那個對象”發送一條信息“。更具體的講,可將消息想象成一個調用請求,它調用的是從屬於目標對象的一個子例程或函數。
      3:每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可製作出新型對象。(如果你善於進行邏輯抽象,那這句話應該不難,也就是說既然對象可以是任何事物,當然也就包括對象的集合或者封裝)。
      4:每個對象都有一種類型。在語法中,每個對象都是某個”類“的一個”實例“。一個類最重要的特徵是”能將什麼消息發給它?“。
      5:同一類所有對象都能接收相同的消息。
   
      個人註解:上面的這段話是面向對象設計的內功心法,是最基礎的幾條。
   
       根據具體的問題建好一個類後,可根據情況生成許多對象。隨後,可將那些對象作爲要解決問題中存在的元素進行處理。事實上,當我們進行面向對象的程序設計時,面臨的最大一項挑戰就是:如何在”問題空間“(問題實際存在的地方)的元素與”方案空間“(對實際問題進行建模的地方,如計算機)的元素之間建立理想的”一對一“對應或映射關係。
       個人註解:上面的翻譯或者不是很準確或者是不容易表達,這句話的意思是說:最難的地方就是根據你的現實問題抽象出”理想的對象“,這種被抽象出來的對象和現實中的問題是存在”一對一“的對應或者叫映射的。有了合理的設計,纔不至於項目中的代碼混亂不堪。

        
       要想讓對象完成真正有用的工作,則必須有一種辦法能向對象發出請求,令其完成一些實際的事情。每個對象僅能接受特定的請求。我們向對象發出的請求是通過它的”接口(interface)“定義的,對象的”類型“或”類“則規定了它的接口形式。”類型“與”接口“的等價或對應關係是面向對象程序設計的基礎。
       個人註解:作爲一個有了幾年工作經驗的人來說,上面這句話很明顯隱藏着深意。因爲在上面提到了”類型“與”類“可以相互等價或轉換,所以我們這裏可以這句話翻譯一下就是:”類“與”接口“是等價或者對應的。很正確,這也就是爲什麼你在IDE中新建的項目之後,可以新建類或者接口。

        按照Think in Java 的例子如圖:
        
        解析:燈泡可開(on),可關(off),可變亮(brighten),可變暗淡(dim)。OK,在這裏他稱這些請求是接口,因爲這裏的方法是在一個Java項目中一個單個的類中,有一個Light,然後Light lt = new Light();  lt.on();  注意作者的意思是這樣的,這句話其實也可以看作是在一個類中定義方法,然後定義一個接口(interface),再創建一個實現類,調用實現類中的開燈方法,來實現開燈。但是從本質上來說,類與接口是等價的,是可以相互映射的,這句話是作者俯瞰式的總結。

       
1.3 實現方案的隱藏
       這一節剛好就是採用了上面解析中的方法,創建一個接口(interface),接口中是如何實現的,調用者不會知道,知道了也無法修改。
         
       Java採用三個顯示(明確)關鍵字以及一個隱式(暗示)關鍵字來設置類邊界:public,private,protected,以及暗示性的friendly。若沒有明確指定其他關鍵字,則默認認爲是暗示性的friendly。
       關鍵字public 意味着後續的定義任何人都可以使用,private則意味着是隻有我自己、類型的創建者以及那個類的內部函數成員,其他任何人都不能訪問後續的定義信息。private 將自己與其他人隔離開,無法訪問。friendly 設計”包裝“或”封裝(package)“的概念---即Java用來構建庫的方法。如某個類是friendly,則意味着它只能在這個包的範圍內使用。”protected“與”private”相似,只是一繼承的類可訪問受保護的成員,但不能訪問私有成員。總結圖如下:
     
       這裏的default也就是friendly。

   
1.4 方案的重複使用
       爲重複使用一個類,最簡單的辦法是直接使用那個類的對象。但同時也能將那個類的一個對象置入一個新類,這被稱爲“創建一個成員對象”。新類可由任意數量和類型的其他對象構成。也就是說在現有類的基礎上組織一個新類。
      個人註解:上面我們已經談到過,對象可以是任何物品,當然也就可以包含已經被抽象過的對象,很多被抽象過的對象組織在一起成爲一個新的更高層次的抽象的“對象”。
       
       對象的組織具有極大的靈活性。新類的“成員對象”通常設爲“私有(private)”,使用這個類的客戶程序員不能訪問它們。這樣我們就可以在不干擾客戶代碼的前提下,從容的修改那些成員,也可以在“運行期”更改成員,這進一步增大了靈活性。在新建類的時候,首先應該考慮“組織”對象;這樣做顯得更加簡單和靈活。利用對象的組織,我們的設計可保持清爽。一旦需要用到繼承,就會明顯意識到這一地點。
       個人註解:也就是說創建一些基礎對象,如輪胎,玻璃,油箱,剎車等等,然後這些對象在組織在一起成爲“汽車”這個對象,我之前碰到過同事這樣設計,當時沒有理解,覺得很麻煩,還不如直接把所有需要的對象都定義好。但是仔細想想,在項目中,幾乎不可能把所有的對象都按照基礎對象那樣去設計,而不在組織對象。只要我們對這些對象或者是組織後的對象進行合理設計,靈活性就會非常好。

     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章