在物件導向中,第一個要學會的不外乎就是Data Abstraction(資料抽象化)囉!其實,資料抽象化聽起來很籠統實際上就是定義類別的過程。而定義類別說來簡單,但如何將現實世界直觀的抽象化成類別也是一門學問勒。 

 

在定義類別的過程中主要就是要將需要的屬性跟方法加以定義。若沒有太多OO的基礎,請將屬性想成變數的宣告;方法想成函式的定義。屬性是特徵值的描述,例如:頭髮顏色、膚色、姓名等;方法是動態的描述,也就是作用在屬性之上的運作,這樣說或許有些許抽象,舉例而言:走路此一方法就是作用在屬性腳其狀態的改變(指一步一步往前跨的變化)

 

拿捏的真功夫,過與不及。抽象化說簡單也是簡單,但要說難也算不容易囉。如何拿捏定義出直觀的類別是一門藝術。就如同美術的抽象派如何利用抽象的過程傳遞出現實世界想要表達的意涵。一般而言,越高層次的抽象化越難,但也越值錢。讀過design pattern的同好們應該都知道程式應該對介面撰寫,不該實際操作類別,這是由於介面通常是更高抽象化的象徵,對抽象的介面操作可避免直接面對底層的concrete class(具像類別)。故能寫出好的介面,並善用之的可以使得系統的彈性更強大,同時類別間的相依性可以達到Dependency Injection的效果(這就是spring framework在框架設計上最大的貢獻)由此可知介面設計的好,比類別來的更加重要囉,但介面的設計一般會比類別的設計來的更加抽象,利用跟藝術上的對比可知介面的價值當然更高囉

 

抽象化的過程記得忽略所有跟問題無關的部分。很多人在定義類別或開介面時,往往都會over define,也就是原本只需要五個屬性,但你多定義了不必要的屬性進來,造成程式之後的維護性、可讀性、可理解性都會產生模糊不清,往後接手的人會一直猜測當初定義此一屬性或方法但都不用的原理到底為何、是否有其用途等等。舉例而言,在圖書館系統中我們要定義一個讀者類別,所需屬性為:性別、住址、聯絡電話、身份證字號等,但若你將讀者想成是人的話那可定義的可就多了,諸如:身高、體重、心跳等等,這些根本與圖書館借書系統無關,所以請將之忽略吧!

 

善用抽象化吧,越高度的抽象化往往越有價值、更恆久遠。以數學的例子來看,我覺得加法就是一個非常抽樣化的概念,例如a+b,可以代表所有兩個運算元、搭配一個加法運算子的運作情況。簡單、直觀、恆久遠的使用方式,也道盡了抽像的力量,當在OO當中能善用Data Abstraction時,將可以好好的定義出簡單、直觀、恆久遠的類別跟介面。

 

 

arrow
arrow
    全站熱搜

    劉逸 發表在 痞客邦 留言(2) 人氣()