封裝和類

封裝和類

類是面向對象(OOP)編程的基礎,類封裝了存在關聯的數據以及操作數據的函數,對象是類的具體實現。之所以要提出類和對象的概念,是因爲它們的存在有助於軟件開發,能清晰程序邏輯結構,能提升開發速度。

 

我想先從類的基本特性之一封裝談起。

在開發過程中我們不希望不斷重複的書寫一段相同的程序,所以我們引進循環和函數,絕大多數函數都需要處理來自外部的數據,這些數據要麼來自於參數,要麼是可見性高的數據(如全局變量)。無論是那種,隨着程序的整個容量的不斷擴大,要進行處理的數據越來越多,顯而易見的結果是要麼全局變量變得越來越多,要麼是函數的參數列表變得的越來越長。此時出現了幾個比較重要的問題。

  1. 記憶問題:當你想調用一個函數時,你費力地記着函數參數列表中各個參數的用處和可用類型
  2. 修改問題:當你想修改一處被廣泛調用的變量名時,你難以尋找全部的調用點,調用它的函數可能被分散在各個不同文件的各處
  3. 適應性問題:因爲函數的的內部具體實現不同,大體相似的函數卻難以被複用
  4. ...

可見,僅有函數是不夠的。

函數需要和他形影不離的數據在一起。

把彼此相關的數據和函數放在一起,隱藏起來,對外提供標準化接口(API),稱之爲封裝。

被封裝起來的結構,一般是我們稱之爲的

之所以說一般以類封裝,是因爲你只要能滿足封裝的必要條件(函數,數據,訪問接口),就是完整的封裝。比如把函數和數據放在單獨的文件下,提供幾個可用的接口,也是封裝。而類是一種封裝的標準結構。

 

我們現在來看看封裝的好處,即更深入的瞭解什麼時候我們應該進行封裝。

  1. 封裝爲數據和函數提供了一個友好的環境。在環境內的函數可以直接調用同環境的數據。一個或多個函數和相同數據親密,就可以考慮和這些數據封裝在一起,把其他”不親密“的數據作爲參數傳遞。這樣就減少了參數列表。
  2. 封裝能提供一個清晰的觀測點,可以由此監控數據的變化和使用情況,我們還可以輕鬆地添加數據被修改時的後續邏輯。封裝之後的結構,易於在內部增加更多功能。
  3. 封裝縮小變量的可見範圍。當我們需要一個變量時,我們不直接調用變量本身而是調用一個返回該變量的函數。這樣做的好處是提供了一種靈活性,當你想改名或搬移一份變量時(別告訴我你從來不怎麼做),修改函數比前修改數據更加容易(我們可以先修改函數內部變量,在創建新函數調用舊函數,之後可以安全的修改調用點),因爲函數只有一種功能,就是調用。
  4. 封裝意味着每個模塊之間應該儘可能少了解系統的其他部分,如此一來,一旦發生變化,需要了解這一變化的模塊就會比較少,這會使變化比較容易進行。在這裏我想舉個例子來說明:我(A)想叫服務員(B)幫我要一份蘭州拉麪(D),其中廚師(C)被封裝隱藏了,我不在意誰是誰下的廚,我只想喫拉麪。哪怕有一天換了個廚師,這不管我的事!這些變化只會影響服務對象,而不會直接波及所有的客戶。顯而易見,我實現同樣的功能卻減少變化帶來的影響。
  5. .....

需求的變化、新功能的實現貫穿了開發的整個生命週期,擁有應付變化的抵抗力和新功能編寫的優良環境,是高效開發的基礎。有效的封裝能幫助提供這些優良特性。

 

此博客根據本人少有的編程經驗以及《重構》書中相關介紹提煉而成,記錄本人對類與封裝的一點理解與看法

由於本人的表述或理解問題,文中可能存在一些錯誤,敬請見諒,歡迎指正

 

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