1. 程式人生 > >《面向物件分析與設計》讀後感

《面向物件分析與設計》讀後感

近看Grady Booch的書—《面向物件分析與設計》,同時有些感受,隨便說說:

    我在學的過程中園子裡搜尋了下,摘了一種一句話:“面向物件是一組思維方法、分析方法和程式設計方法的集合,當然不是最終的結果。”

    的確“OO”就是一個種思維方式,這樣的思維不是隻用在程式上,其實可以用在很多地方(看起來有點廢話,但是可能很多像我一樣的初學的人會認為OO就是為程式設計而生的,它們是一樣東西),主要強調的就是用抽象對現實世界的事物進行拆分(書的作者用Decompose一詞),

    按照書中作者的意思,“抽象”是OO的關鍵,什麼是抽象呢?是一個具有對現實事物的性質的描述,而且這個描述是能有效的區別(Distingnish)於其它事物,並且這個描述能提供一個清楚的概念邊界,這個概念的提出依賴於觀察者的角度。

    當把這樣的思維放到程式上面來就形成了幾個概念“型別,繼承,多型,封裝”

    型別(Type):

    比如‘禽’類就是一個型別,在用程式碼語言表述的時候就是‘Class’但是Class 不等於是型別(Type).

    繼承:

    繼承這個東西為什麼需要它呢,正如在描述抽象的時候說的,描述一個型別要描述它特有性質,有明確的區別於其它的事物。

    比如我描述一個東西,”兩隻腳,長翅膀和羽毛“,從這個抽象你能推斷這個是什麼嗎?不能,因為雞和鴨都具有這樣的特性,

    我們的概念”兩隻腳,長翅膀和羽毛“ 雖然不能清楚的定義雞和鴨的分類邊界,但是卻能清楚的界定 是‘禽’類還是‘昆蟲’類。

    再者因為雞和鴨具有同樣的特性我們可以看出同樣的型別。所以我們可以把‘禽’ 類,這樣的型別定義個雞和鴨的基礎型別。

    而我們要抽象雞和鴨這兩樣事物,我們需要更具體的描述,這個描述要能界定各自的特性 。但是如果雞或鴨的特性描述只帶有各自獨特的描述,

    比如這樣描述雞‘有喙,腳不帶噗,會咯咯叫’ 單獨看這樣的描述(假如沒有繼承父類的東西),這樣也是不能清楚的界定事物,因為雞至少必須具備‘禽’類的特性。這些特性界定在一起才是能清楚的界定雞,而不是隻有'有喙,腳不帶噗,會咯咯叫'這樣的描述。

    所以我們把這樣的一個界定‘兩隻腳,長翅膀和羽毛,有喙,腳步不噗,會咯咯叫’ (我們假定這樣的界定能定義雞,因為我們都不生物學家)

    這樣一來就順利成章的推出繼承的概念,描述某個具體的型別的時候它應該具有本來高一抽象層次的特性,然後加上自己的特有性質 。

    如果說我們沒有采用繼承,把所有描述描述“兩隻腳,長翅膀和羽毛,有喙,腳不帶噗,會咯咯叫” 這樣的界定也能清楚的界定‘雞’,但是‘兩隻腳,長翅膀和羽毛’不屬於‘雞’類這個類目所特有的性質,它用在界定禽類範圍內彼此動物之間的界限的時候是不清楚的,除非把這個“兩隻腳,長翅膀和羽毛”用於界定‘禽’與‘昆蟲’,這樣的界定是明確的,清晰的區別了昆蟲和禽。

    繼承同時為我們帶來的程式碼的重用,節約程式設計量和便於維護。

    多型:

    有了繼承,肯定就成在多型的情況了,比如‘雞’ 和‘鴨’表象了‘禽’類的特性,這個屬於是繼承多型,是一種性質上有區別的多型表現,

    還有種就是‘行為多型’ 比如 ‘叫聲’ ,禽類都會叫(可能你能找出不叫的禽類,這裡咱們暫時拋開)但是‘鴨’的叫聲和‘雞’的叫聲就不同。這種多型可以表現為程式碼中的抽象方法和介面繼承上,因為我認為這兩者關注點都是在方法(就是行為)。

    封裝:

    至於這點我自己也不是很明白,希望有人能幫忙指點,

    目前我認為封裝主要表現在類的行為上,有點型別黑盒的效果,你給雞鴨飼料吃,他們負責生蛋。如果這個行為的”過程“是被公開的,這個”過程"可以被外界直接操作,這樣就會出問題,導致雞鴨更本生不出蛋或者蛋有問題。

    以上是寫學習中的思考,請各位網友多多指教。 《面向物件分析與設計》 這本書也是個不錯的書,推薦看看,只不過目前第三版只有英文。