對象是理解面向對象技術的關鍵。現在環視四周你就會發現許多真實世界的對象范例:你的小狗,你的桌子,你的電視機,還有你的自行車。
真實世界的對象共享了兩種特征:他們都擁有狀態與行為。小狗有狀態(名字,顏色,品種,餓了)和行為(咆哮,迷人,搖尾巴)。自行車同樣有狀態(當前的檔位,當前的踏板節奏,當前的速度)和行為(改變檔位,改變踏板節奏,改變速度)。識別真實世界對象的這些狀態和行為是開始考慮面向對象編程術語的一種主要方式。
現在花幾分鐘時間來觀察你周圍的真實世界對象。至于你所看到的每個對象,需要詢問你自己兩個問題:[這個對象可以有怎樣的狀態?]和[這個對象可以完成怎樣的行為?]。確保把你的觀察記下來。這樣你就會注意到真實世界對象的變化是多樣的;你的臺燈可能只有兩個狀態(開或者關)和兩個行為(打開或者關閉),但是你的臺式收音機可能有額外的狀態(開,關,當前音量,當前頻道)和行為(打開,關閉,增加音量,減少音量,搜索,掃描和調音)。你同樣還有可能注意到一些對象,同樣會包含其他對象。最后,這些真實世界的觀察全部都會被翻譯成面向對象的編程世界。
一個軟件對象。
軟件對象的概念類似于真實世界的對象:它們也由狀態與相關的動作所組成。對象把它的狀態存儲在字段(一些編程語言中的變量)中并且通過方法(一些編程語言中的功能)來暴露它的行為。方法操作一個對象的內部狀態并且與對象到對象的通訊的主要機制一樣提供服務。隱藏內部狀態并且要求所有的交互都通過對象的方法而被完成,這就是數據封裝,面向對象編程的基本原則。
考慮一部自行車,例如:
作為軟件對象的自行車模型。
通過定義狀態(當前的速度,當前的踏板節奏,和當前的檔位)和提供改變這些狀態的方法,對象仍然保持著對于外部世界所允許使用的控制。例如,如果自行車有 6 種檔位,那么一個改變檔位的方法就可能會拒絕小于 1 或者大于 6 的任何值。
把代碼建立到單獨的軟件對象中可以提供許多的好處,包括:
- 模塊化:被編寫的對象源代碼可以獨立于其他對象的源代碼而得到維護。一旦對象被創建,它就可以簡單地在系統的內部進行傳遞。
- 信息隱藏:通過只對于對象方法的相互作用,它詳細的內部實現就會從外部世界中被隱藏。
- 代碼重用:如果對象已經存在(或許由其他軟件開發者所編寫),你就可以在你的程序中使用這個對象。這樣允許專家完成對于特定任務對象的復雜實現 / 測試 / 設計,然后你就可以在你自己的代碼中信任并且運行它。
- 易于插拔和調試:如果一個特定的對象出現問題,你就可以簡單地把它從你的應用程序中移除并且插入一個不同的對象來替代它的位置。這與在真實世界中修復機械性的問題有點類似。如果平衡被打破,你就可以替換它,而不是整個機器。