一起來看看大道至簡的一些基本設計思想,首先我們來看一下什麼是封裝。
封裝:也叫做資訊隱藏,或者資料存取保護。放到程式上來講,就是隱藏類的屬性,還有實現細節,僅對外公開一些介面。那麼外部,就只能通過這個類暴露的這些存取介面,按照這個類提供的方式來存取類的內部資訊或者資料。這樣子的一種情況就叫做封裝。
作為做Java的我們來講,封裝,我們是非常非常熟悉的,因為一開始學Java,學物件導向,就會講封裝、繼承和多型。
接下來,我們就來談一談,到底物件導向當中封裝的本質是什麼。其實從字面意義上理解封裝,就是把什麼東西包裝起來,進一步說就是一個封裝體。事實上大家想,物件導向當中,類是不是就是一個封裝體?
大家想想,類裡面封裝的什麼呢?無外乎就是一些屬性,就是一些資料,然後是方法,其實可以代表它的功能。
也就說一個類,它就是封裝了一定功能的這麼一個封裝體。
當然,封裝並不僅僅只是對一個類而言,你可以擴大一點,以此類推,從設計的角度來看:一個元件是不是一個封裝?只不過它封裝的,不再是屬性、方法,它裡頭封裝的就是一個一個的,其它元件或者模組,或者是類。
以此類推,元件是一個封裝體,那模組是不是一個封裝體? 子系統是不是一個封裝體?系統是不是還是一個封裝體?
只是範圍大小不同而已,所以大家會發現,封裝是咱們做架構設計一個非常非常基礎的、非常重要的思想。
咱們再從另外一個角度來看一看,類,它其實是程式碼功能的一個封裝,或者說是一個聚合方式。
沒有物件導向之前,咱們叫做程式導向設計,或者叫過程化設計。大家可以理解成是這樣,這裡面有一堆的程式碼,我們稱之為函數,或者說是一些過程。
在過程化設計裡面,這些功能都是比較散亂的堆放在一起,也就說每一個功能只管自己,跟其它功能沒有什麼聯絡。但後來大家覺得,這樣子去擺放程式碼非常的不友好。要想找一個功能,尤其是帶流程的,那就在裡頭跳來跳去,非常的亂。
大家就想到一個辦法:把相關的一些功能,比方說發現這裡的功能是相關的,都是用來做,比方說使用者資料的管理。我們就可以把這個東西封裝起來,然後就演化成,可以用一個類來封裝這些東西,就開始物件導向設計了。
這些功能都是相關的,都是使用者這個物件應該要實現的功能,也就說從程式碼的角度,也能夠感覺得到,物件導向設計實際上就是把原來這些過程化設計當中,雜亂無章的這些函數或者是功能,按照一定的方式重新進行組織,把它們封裝到一起。所以說呢,從某種意上說,類是程式碼的一種聚合方式。
咱們一個完整的軟體系統,就是由大大小小的,各種不同的這種封裝體聚合起來的。就好比說一個大的軟體系統,又分成了很多的子系統,這個子系統其實也是一種封裝。
這個子系統又包含另外的子系統,每個子系統裡面可能有很多的模組或者是元件,這些元件裡面又有很多具體的功能,也就是它封裝的是一定的功能。 這不就是大大小小的封裝,最終合起來就是你的這個系統。
所以說大家要從架構設計的眼光來看待這些問題。你看一個大的軟體系統不就是大大小小的各種各樣的封裝體嗎?至於這裡頭到底封裝的是什麼。這個東西就看你怎麼劃分了,直到最後落實到具體的功能上。
從設計上來講,到底封裝什麼呢?對於每一個封裝體來說,主要就是為了把核心業務部分,或者是核心功能部分封裝起來。那麼這麼封裝起來有什麼樣的好處呢?也就是為什麼要封裝呢?
大家想想,當你把這些核心功能封裝起來過後,首先對核心功能是一個安全保護。另外呢,也是為了複用這些核心的功能,除了這些呢,把這包裝起來的目的,是為了可修改,可維護,可延伸。
有些人說,怎麼還會可修改可維護呢?很簡單,你把這些功能封裝在這個,比方說橢圓裡面封裝了一堆的功能,事實上,這內部的功能和外部是不是就分開了?你封裝的這些功能是不是就可以單獨的進行修改,進行維護,並且進行擴充套件。
只要對外提供的介面不發生變化,那你封裝起來的這一塊,是不是就可以隨便改了。所以說呢,從某種意義上來說,也是封裝了變化。
當你覺得這一塊以後可能會變,就可以把這塊先包裝起來,那麼以後的變化,就可以在封裝體內來實現,而不會影響到外部。當然這個了,跟咱們接下去要講的一個思想:隔離,是息息相關的,或者是有類似之處的。總之呢,大家會發現封裝對我們來講,是一個非常非常重要的思想,我們一定要重視對他的理解。
為了大家更好的交流架構設計的思想和知識,大家可以加sishuok,拉你進架構設計群,一起共同學習,共同進步。