最近看了不少關於設計模式的東東,是應該總結一下下了,呵呵,純屬個人觀點,有些題目比較大,只是說說我的看法吧,如有不當之處,敬請板磚輕點。
程式設計師的成長用修煉這個詞形容真是恰當,修煉當然也分內功和外功了,像我們平時使用的什麼ext、flex、struts、spring,如果你只是會使用, 那麼也就是會這些外功了,當然你也能從這些外功的修煉中,體會到內功的重要以及內功的某些門路。外功很強,但是內功弱,同樣的外功,在內功強的人手裡會出神入化。
歐陽峰和十幾歲的楊過都會**功 就是比**功 肯定是歐陽峰厲害了。為什麼?歐陽峰內功厲害阿。設計模式就是很厲害的內功.
在專案中,我們發現貌似我們沒有用那些模式阿??那些東東難道只是看上去很美??
其實毋庸置疑,設計模式肯定是老前輩們辛辛苦苦修煉總結出來的內功**,而且絕對是讓你功力大增的內功秘籍,那麼什麼時候用呢?怎麼使用呢??有什麼要注意的呢??
好,下面開始。。。。。
1、什麼時候使用設計模式呢??
敏捷以及極限程式設計中倡導不預先設計,不會首次使用設計模式,
我個人認為如果設計師發現是明顯的需要使用設計模式,明顯地屬於設計模式的經典場合,那麼毫不猶豫的使用,
如果發現另外的設計引入了**壞味那麼也是毫不猶豫的使用.
如果發現使用設計模式的地方可以明顯提高靈活性 我也毫不猶豫的使用。
大多數開發人員還是做企業級應用,大多數人是做專案,設計模式就是先找到變化的部分並且提取出來進行封裝,怎麼找到變化的部分呢??
我想還是從作產品的角度,在系統地設計開發中,發現變化的部分,想想這塊邏輯是不是這個專案獨有的呢??
當然,你在開發的過程中,會發現某些**屬於壞味或者很適合使用設計模式呢,那麼都是些什麼場合呢??可以詳見《重構與模式》
2、怎麼防止過度設計呢??
使用設計模式,但是防止過度設計,那麼怎麼區分是過度設計呢?讓我們去依靠嗅覺尋找**壞味,不斷重構吧
過度設計的壞味包括哪些呢?
(1)繼承結構層次太多造成過度複雜
(2)繼承與聚合不能分清楚 優先使用聚集而不是繼承應該使用介面還是抽象類
繼承本身沒有錯,關鍵主要是繼承了不該繼承的方法,這時候很可能導致增加繼承類的層次,採用繼承也不能像策略模式那樣動態或者說執行時變化行為。
(3)過度抽象了你的介面
介面過度抽象往往造成不必要的複雜性,比如一些有時候看到很多類繼承類似common***的類,我個人認為這個時候就需要考慮是不是需要繼承
(4)全域性的公用類
我們為了在某個專案中復用某些靜態方法,往往寫了個大雜燴的類,包含了很多公用的方法,或者staticfinal的域.貌似好像提高了復用,實際上專案中大多數包
依賴於這種**,造成不易拆解進行單元測試,不符合測試驅動的思想,而依賴這些類的包也往往會依賴一些本身不使用的介面,違反了介面隔離原則。
3、設計模式增加了設計複雜度,怎麼辦??
設計模式增加了複雜度,但是這是相對的。
一方面閱讀**的人需要有設計模式的基本知識,了解設計模式的基本結構,這樣可以很快地意識到這是在使用什麼模式。
一方面書寫**的人需要在**中以清晰設計意圖的名稱去命名你的**,比如你想表達策略模式那麼使用****stragey,你想表達裝飾意圖那麼使用****decrator,你想使用**那麼命名為****proxy,這樣閱讀**的人可以很快了解你的設計意圖
4、有人說為什麼在我的程式中沒有使用設計模式呢??
其實,使用設計模式的地方一定也可以採用過程化的思想去解決,只不過這種**靈活性不高,不滿足某些設計原則如開閉原則罷了。
很可能你的**中就是存在很多這種過程化的**,存在類的職責不清,職責過大的類或者是方法,也就是說你解決了你專案中的問題,但是靈活性不夠,如果作產品,往往需要大面積的修改。
如果你做框架那麼為了讓他人擴充套件,設計模式是逃不過的,
如果你做企業級應用,某個專案業務邏輯雖然很複雜,但是共性的問題少,這個也是有可能的,但是也有可能你沒有一雙慧眼,很可能說明你不熟悉設計模式,這個原因往往是最主要的。比如你現在對**、裝飾意圖區別、模板、策略的意圖區別了然於胸嗎?如果不是,那麼還是不了解。
當然有時候我們並不是為了使用設計模式而使用設計模式,其實完全可以按照某些經典的設計原則去推導出某種設計結果,推導出來你發現哦原來他就是這個設計模式,當然在這個過程中,你也會發現你熟悉的某些模式幫助你得到了很好地設計,呵呵。
也有可能你使用了設計模式,但是不知道它是一種模式。
5、不能只是關注設計模式阿
如果你只是學某些設計模式,你可能理解不深刻,有些物件導向的設計原則是肯定要熟悉並且深刻理解的。
(1)單一職責原則
(2)開閉原則
(3)黎克特制替換原則
(4)介面隔離原則
(5)這裡不詳細談了
5、推薦幾本書
《設計模式解析》第二版
《head first 深入淺出設計模式》
《敏捷 模式、原則、實踐》(書名不確切)
《重構--改善既有的**》
《重構與模式》
都是經典,都與jolt大獎有關,其中就有不少講解設計模式的,在這裡我不得不提下《head first 深入淺出設計模式》我個人認為是本很不錯的書,讀起來十分有趣,而且講解十分到位,有一針見血的感覺。
《設計模式解析》第二版講解非常清晰,就像是一位教授給你上課,還有習題,很正統,也非常好。
今天你用 了嗎?
今天遇到了乙個bug,也順便見識了js這門語言的可怕之處。事情的起因是這樣,有一行 類似如下 var code response.result if code code 是rpc的返回值,明明服務端沒有任何問題,但是客戶端一直報錯,結果定位到 的時候發現服務端錯誤的把返回型別轉成了string,而 ...
今天你笑了嗎?
1 有次等公共汽車時,開過去一輛寶馬,旁邊一位高人對他身邊的人說 看,剛過去那輛就是ibm.2 我一朋友在聯通實習,一天,一老頭走近來,劈頭蓋臉就來句 給我辦張移動卡,好吧?然後我那朋友頭也不抬的就來句 師傅,有人來砸場子 3 同事去見客戶,可能是緊張,一開口便是 劉先生你好,請問你貴姓啊?汗啊 4...
今天,你學習了嗎?
1 對meta的理解 在每個html的頁面中,有這樣一行 charset utf 8 因為每次新建html檔案自動生成這行,一直沒在乎過這個標籤有什麼意義。今天看到這樣的 name viewport content width device width,minimum scale 1.0,maxim...