2010年8月26日 星期四

Head First Design Patterns

這本「深入淺出設計模式」第一次看到是大學專題meeting在jjliou的桌上看到。研究所的時候有從學校圖書館借來看過一次,不過那時看了沒什麼感覺。而且沒學過Java,C++也不熟,有些Java的關鍵字不知道對應的C++關鍵字是什麼。後來經過了旁聽了一學期的物件導向程式 in Java (這本書範例是用Java寫的),還有寫DigiVFX作業時重看了一次C++ Primer,終於條件湊齊可以來看這本書了。

學資料結構的時候看過C++,一直不知道物件導向可以幹麼,後來看了一些其他東西也不感覺不出物件導向的好處。直到旁聽Compiler的時候有提到一個Visitor設計模式,因為Compiler要對一堆語法做很多道的處理,如果開放給大家都直接改處理核心的部份,那最後程式就會爛掉。所以Visitor就是把公開的介面寫好,每道要用的不同處理方法都把自己傳一個指標給處理的部份,這樣子不同的處理方法都可以寫成一個單獨的東西,而寫好的處理核心也不用動。這是第一次見識到物件導向的威力。

同樣的看完這本書也是差不多的感覺。幾乎每一個模式都是把一堆類似的class做一個抽象化的介面,都用抽象介面提供的功能來存取實際的instance,這樣子加新的class只要有實做抽象化介面的那些功能,那就可以和前面已經寫好的程式碼相容了。就像代數一樣,只定了幾個很抽象的operator,所以一堆數學結構都可以套用到只跟據那幾個抽象的運算求出來的演算法,只要他是用那些operator定義出來的就可以了。

實際寫了書中的幾個範例。以前看不懂的就是Java的abstract、interface是什麼意思,原來在C++都是用pure virtual代替,雖然Java不能多重繼承,但還是有用interface來模擬這個功能。Java全部的method都是virtual,全部的基本型別都會給初始值也跟C++不一樣。還有Java把全部的物件都用reference傳,自己實際用C++寫覺得好像找不到適合用reference的時候?都是用pointer代替,但是Java有垃圾回收所以new的超開心的,用C++就要想到底要在哪裡delete。

最後發現,一個設計的好的架構,要加新功能真的是只要多寫一個class,然後main部份多加幾行就好了,已經寫好的其他class完全不用改!真是太神奇了!以前寫過一堆程式都是要加新功能但是原本的程式碼也要跟著改,結果有的地方就漏掉沒改到,就是物件導向的觀念太差!
--
不過最初提出的經典設計模式有23個,這本書有一步一步推導的只有14個,看來接下來可以看看「大話設計模式」把剩下的也看一看,不過這本書又是用C#寫的了…

沒有留言: