設計模式-見解

自從接觸設計模式以來,一般看到的評論是以推崇爲多。不過比較欣慰的是,最近在看《編程人生》中,有兩個人對設計模式比較不屑。 
之所以欣慰,並不是因爲湊個熱鬧看他們互相攻擊,互相批評——而是因爲出現了不同的觀點,特別是兩位非常有分量的人物的觀點。在技術領域,衆口一詞是一件非常恐怖的事情;百花齊放百家爭鳴纔是我們樂於看到的。因爲不同觀點的出現,特別是大師級的不同觀點,能夠促進更多的人去獨立的思考與探索


好了,迴歸主題。編程人生中,《編程人生》中至少有兩個人談到了設計模式。 
jamie zawinski:著名的lisp黑客,Netscape瀏覽器和Mozilla瀏覽器的核心開發者。在談到程序員要讀的書時說: 
“還有一本書叫《設計模式》,人人追捧,奉爲圭臬。不過,在我看來,這本書一派胡言,給人的感覺好像是編程只需要剪貼粘貼就能搞定。你不用全盤考慮要做的任務,只要看看這本配方書,找個有幾分相近的模式,直接套用就行了。那根本不是編程,那是在塗色書。不過,似乎很多人都對這本書着了魔。” 
Brendan eich,JavaScript之父,Mozilla公司CTO,在提到爲編程想做而沒有做的事情時說: 
“我並不是一個熱衷於面向對象和設計模式的人。從來沒有買過Gamma的書(《設計模式》)。網景公司有些人買,Jamie zawinski的人或者網景收購的公司來的那些冤家對頭會買,他們把這本書當聖經一樣顯擺,真有點讓人受不了,他們根本就不是最好的程序員。”

至於什麼是設計模式,他有什麼好處等等,不是我今天要說。我想舉個例子,做個對比。我們都知道,設計模式源於建築領域,建築領域可能離我們太遠,我今天想拿籃球運動做個對比。

籃球運動員爲了提高籃球水平,除了進行身體訓練和投籃訓練外,還會進行一些連貫動作的訓練和一些戰術配合訓練。比如,像交叉步,急停跳投,轉身過人,擋拆等等。這些訓練是從何而來?籃球運動剛剛誕生的時候肯定沒有。而是運動員在籃球運動過程中,發現在某一種情況下(也就是防守隊員和團隊成員的位置),使用某一中類似的連貫動作往往能夠取到非常好的效果。所以就有悟性非常高的人把這種約束條件和要採取的動作都總結出來,讓運動員在訓練中反覆的訓練,以形成一種條件反射,在出現合適的機會的時候,快速而有效的使用這些連貫動作。

我想這也是模式的起源。有一點不同的是,我們學習設計模式的過程,是一種思維訓練的過程

其實,上面的這些分析對於武術也同樣適用。武俠迷可能會記得金庸筆下紛繁複雜招式名稱(其實也是模式)。不過,金庸倒也提到過更高的境界:“無招勝有招”。印象當中張無忌學習太極拳和令狐沖學習獨孤九劍有描述。他們在學成之後確實很厲害。難怪jamie zawinski和Brendan eich會有些反對模式,也許他們已經學到了無招勝有招的真諦。

難道我們要拋棄所有的模式?不過我認爲它可能並不適合所有的人,它依賴於人的造詣,以及天賦,悟性。我們很多人要獲得提高,進行一些模式訓練,也許還是一條非常有效的途徑。

亂七八糟說了這麼多,最後總結一下:

  1. 對於初學者來說,模式是個好東西,學習一些模式是一條有效的提高途徑。
  2. 不要過度使用設計模式,他會給你帶來額外的複雜度。 在我的眼中,簡單性纔是一個技術方案的首要因素。你知不知道李小龍截拳道的核心是什麼?拋開招式,直截了當的進行最有效的攻擊和防守。
  3. 不要把它當成銀彈或者聖盃。
  4. 當你有一定的積累後,你也可以嘗試“無招勝有招”的境界。

http://blog.csdn.net/chgaowei/archive/2011/06/15/6547286.aspx

 

 

其實模式只是一種特定環境下前人找到的特定解決方案,我們應該學習模式,因爲我們還不是大師,但是我們不是爲了學習模式才學習模式,

我們學習模式時更重要的是學習這些模式的思想,比如,模式的優點,缺點,爲什麼會這麼設計,爲了解決什麼問題,要追根溯源。

 

以前看設計模式的書上來就把這個模式的UML圖畫出來,然後開始對這個圖結合代碼進行講解,這樣的書即使背下來了,你對每個模式的UML圖都熟記於心了也只是個皮毛而已。

 

個人對於設計模式的感覺是:

 

1.先知道問題是什麼,在自己去思考解決辦法,再帶着疑問去看別人的解決方案,問問自己,我的問題這個方案都解決了嗎,都是最好的嗎?

 

舉個例子來說:很早前接觸web開發時也聽過分佈式,也聽過別人說要把服務器搞到月球上去,當時也不理解,既然不明白就去看看分佈式等等的書,一看好像是明白了,可以按照書上的理論開始說些理論和概念了,也算是菜鳥了,也算有點得意,畢竟學到點不是所有人都知道的東西,但是也就停留在口頭了,實踐怎麼做呢,我要怎麼實踐呢,我在什麼地方用它呢,無從下手,還是不會,所以返回到開始,我把自己定位爲根本不明白分佈式的還沒入門的人,開始思考,大概思考的過程如下:

 

我要做一個上百萬用戶併發的網站->網站要有很多資源->帶寬,CSS,JS,代碼,數據->可是我自己就一個臺式機->我的帶寬才2M,機器性能也不好啊->一百萬人併發訪問我的網站我這點資源怎麼分啊->看來要多搞點機器啊->好,我現在有100臺牛逼服務器了->可是現在我的這些資源怎麼裝在100臺服務器上呢,每個機器都是可以單獨可以服務的還是100臺機器聯合起來才能服務呢->數據怎麼存儲在100臺機器上呢,如果還是存儲在一個機器上還是一百萬併發數據的讀寫,那就沒意義了->看來資源和數據要分佈在各個服務器上啊->這樣的話我怎麼知道那些數據應該存儲到哪個機器上呢->存儲到某臺機器上的數據,下次怎麼讀取呢??

 

到這裏才發現,分佈式很玄乎啊,也許書裏面講的數據的垂直和水平切分是能解決這些問題的,帶這疑問再去看....

 

2.學習設計模式其實是在學習資源的分配,管理,協調的方法

我們遇到的很多問題,都是在現實生活中可以找到影子的。

 

比如說代理模式,我們就可以理解爲老闆的祕書,大老闆還有很多祕書呢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章