2009年4月13日 星期一

設計模式-(序) 是設計更是藝術

序言


最近在研讀設計模式(Design Pattern),至從看了有關這類的書
再回頭看看我以前寫的程式,只能用不堪回首來形容
我覺得設計模式是每個物件導向程式設計師都該看的
在眾多設計模式的書籍當中,個人推薦這本:大話設計模式 出版(代裡)社:悅知


這本是之前去紀伊國屋看到的,由於紀伊國屋的東西都貴到昏倒
所以買這本的時候我很猶豫,加上我對悅知出品的印象都是:夠廣不夠深
就是悅知有關資訊的書籍都是探討範圍很廣,但是不夠深入(我是讀書狂,所以對出版社風格會有刻板映像)
但是這本推翻了我以往的想法,這本大話設計模式用對話跟日常生活例子為對象來延伸到設計模式,除了探討內容夠之外,容易閱讀是特點,這本大話設計模式我花了數個小時就閱讀完畢,而且也吸收豐富,相較於之前培生出版社那本,這本真是好物。

回到正題,就算不懂設計模式,程式寫多了也多多少少會用到類似的概念
Java或是.NET等都用到不少相關的設計模式,有拜讀過那些core的原始碼的話,一開始會像看天書一樣,有看沒有懂,但是了解其中的設計模式後,會發覺他是那麼的美麗。

設計模式:是設計更是藝術



一個設計好的程式,就像是美麗的女人般讓人百看不厭,以前從未注意過程式可以這樣散發如寶石般的光輝,想想之前我class隨便亂用,幾乎一個函式幾百行那種程式,真的只能用垃圾來形容。
程式寫多了,之後就只是語法上的問題,我甚至斷言照著書作人人都可以寫出一個系統。
尤記得我大學時候一位同學,他們的專題是作進銷存系統,雖然他們都不太會寫程式,但是靠著微軟VS2005的強大到也讓他們做出有模有樣的東西,但是一旦放上戰場,缺點立刻出來,根本就不堪用。
再舉一個比較近的例子,微軟最近在徵招實習生(未來生涯體驗),他們的主題網頁外觀華麗,但是根本經不起考驗,我因為也想報名,所以有去看他們的網頁,一開始我還讚嘆外觀設計的真漂亮,一旦報名按下去,缺點立刻浮現,也就是他們的網頁firefox不支援某些動作,逼得我一定要用IE去跑這是敗點一:瀏覽器的相容性沒做好。
再來就是註冊時明明沒叫我填身分證,登入時卻要填身分證(啥鬼),然後我身份證填好後不給我登入,造成我原本二月多要報名托到三月中,而且我可以登入還是因為我發現身分證少填就可以登入,敗點二:程式邏輯沒設計好,驗證也做不完全。

其他零零總總的缺點,所以說程式人人會寫,有些套裝軟體甚至拉一拉就寫好一套系統(VS之類的),但是是不是經得起考驗的系統才是我們資訊人員的優勢所在,不然套件拉一拉程式就寫好了,工程師還有飯吃嗎?

記得當初上一堂課,助教要抓有沒有抄襲,他就把程式碼瀏覽過一遍之後,就抓出了誰抄誰,他說了一句話:"程式是個藝術,每個人風格皆不同,只要看了程式碼架構,大概就能猜出是誰寫的"
這句話在我碰觸過設計模式之後更是非常認同,程式如果沒設計好,寫出來的只是把螺絲起子,轉過螺絲後就毫無價值,但是設計好的程式就像把萬用刀,什麼事情都可以用,栓了螺絲還能用他做其他事情。

但是設計模式會造成程式效能的降低(function call增加),如何在這之間做取捨,就是程式設計師的功力了。
用我喜歡的RPG來舉兩個極端的例子,一支效能到極限但是沒有設計過的程式就像是萬靈藥,可以解除所有異常狀態(問題),但是用過一次就消失不能再用了。
而一個設計到毫無破綻,但是效能普普的程式,就像是僧侶,可以作到萬靈藥的作用但是一次只能做一件(解毒、治療、增加力量etc),而且還要考慮僧侶有沒有MP(現在的問題適不適合),但是僧侶沒有使用上的限制,只要有MP(設計模組正好能解決問題),就能一再使用。

說了那麼多,主要是在說程式是否能夠Reuse,一隻好的程式除了效能好之外,他還必須能夠重複使用來增加他的生命週期,如此一來才能說他是個有設計的程式。

copy不等於reuse


很多人都學過物件導向程式目標就是寫出內聚力強、耦合力弱的程式,但是會真正去實踐他的人卻不多,我認識許多人都有錯誤的概念,認為寫程式寫到後面就是copy&paste,這種是最要不得的概念,就因為程式沒設計好才會用複製貼上取代程式碼的覆用,當copy&paste用多了的時候,哪天要改就會花費非常大的成本,假如這隻程式用在一百個地方,就要改一百次(老闆會寧用fire這種人請另一個高明的來重構),這時候其實可以考慮用提煉函式的方法解決,但這是重構(Refactor)的部分了,在此不贅言。



接下來我打算花幾個篇幅連講解設計模式的基本23個pattern,希望我能完成

沒有留言: