rosial

          lost memory
          數(shù)據(jù)加載中……

          《爪哇夜未眠》- 軟件工程篇 - Design Pattern 新解

          什么是 Design Pattern?許多人一講到 Design Pattern,就會(huì)扯到什么建筑設(shè)計(jì),因?yàn)樗麄內(nèi)际强此娜藥偷摹窪esign Patterns」經(jīng)典本的解釋,沒消化就照單全收。 如果不能用更生活化的方式解釋 Design Pattern,我會(huì)懷疑他們是不是真的了解 Design Pattern 的真義。

          什么是 Pattern

          Pattern 最簡(jiǎn)單的定義是:只要是一再重復(fù)出現(xiàn)的事物,就是 Pattern。依照此定義,生活中就可以找到一堆 Pattern 的例子:

          第四臺(tái)廣告中的 Pattern:

          1. 原價(jià) ... ,現(xiàn)在購(gòu)買只要 ... ,還送你一組 ... ,請(qǐng)馬上來(lái)電 ... ,如忙線中請(qǐng)稍后再撥。
          2. 利用分割畫面顯示出使用前使用后的差別,來(lái)加強(qiáng)說(shuō)服力。例如:由 C 升級(jí)到 E (注: C E 不是指程序語(yǔ)言)。
          3. 找人現(xiàn)身說(shuō)法:「杰瑞!感謝你介紹這套歐萊禮 Java 系列,讓我在短短的三個(gè)月內(nèi)成為公司內(nèi)首屈一指的 Java 專家,這實(shí)在是太神奇了!」

          選舉時(shí)的 Pattern:

          1. 質(zhì)疑對(duì)手 A 錢或搞婚外情
          2.
          把家人通通拉上臺(tái)痛哭一場(chǎng)以示選情告急
          3.
          開口唱「愛拼才會(huì)贏」

          其它像是金光黨的手法,刮刮樂(lè)詐財(cái)?shù)募紓z ... 等,也都具有一再重復(fù)出現(xiàn)的特性,所以都可算是 Pattern。

          電影中的 Pattern

          電影中也有大量的 Pattern,請(qǐng)看下面的例子。

          提高追殺時(shí)緊張程度的 Pattern

          1. 壞人追殺好人時(shí),好人躲進(jìn)車子,卻發(fā)現(xiàn)車子發(fā)不動(dòng),引擎嘎嘎作響,一面努力地繼續(xù)發(fā)動(dòng),一面念念有詞「 Come on, Come one 」。
          2. 壞人追殺好人時(shí),好人沖進(jìn)電梯,死命地押著 close 按鈕,脫口而出「 Come on, Come one 」。

          許多電影都會(huì)使用上述兩個(gè) Pattern ,雖然是老掉牙的 Pattern ,但每次看到這里,總是讓我緊張得心臟病差點(diǎn)發(fā)作,我不得不承認(rèn)這兩個(gè) Pattern 實(shí)在是挺有效的。

          增加主角殺死壞人合理性的 Pattern

          電影最后,壞人和好人大對(duì)決,最后好人勝利,但是好人如果直接把壞人宰了,那好人在觀眾心中的形象就會(huì)受損,所以好人先饒壞人一條生路,但是壞人卻壞到骨子里了, 偷偷拿出一把槍瞄準(zhǔn)好人,說(shuō)時(shí)遲那時(shí)快,好人機(jī)警地察覺,為了自保于是將壞人一槍斃命。這個(gè) Pattern 可以讓好人有人性,又讓壞人死有余辜。

          床戲的 Pattern

          不管和劇情有沒有關(guān)系,編劇和導(dǎo)演總愛加上一段激情的床戲。這個(gè) Pattern 相當(dāng)困擾我和我的家人,因?yàn)槊看慰吹竭@里,我們保守的一家人往往覺得很尷尬,我們所反應(yīng)出來(lái)的 Pattern 是:借口倒茶水,上廁所,打電話 ... 而離座避風(fēng)頭 ... 但眼睛仍不時(shí)偷瞄。

          恐怖片的 Pattern

          無(wú)須我舉例,電影驚聲尖叫( Scream )第一集就為我們剖析出恐怖片的一大堆 Pattern

          公式化

          好萊塢的電影比較多 Pattern,而歐洲的電影比較少 Pattern。至于昆丁塔倫提諾(Quentin Tarantino)編導(dǎo)的電影,完全是不按排理出牌,很難找到 Pattern。正因?yàn)楹萌R塢的電影很容易就可以找出 Pattern,所以常常會(huì)有似曾相似的感覺。許多人批評(píng)好萊塢的電影很「公式化」。

          基本上,Pattern 就是一種公式化的表現(xiàn)。那么,究竟公式化是不是好事?

          以藝術(shù)來(lái)說(shuō),公式化的結(jié)果會(huì)造成僵化,所以負(fù)面效果居多。電影號(hào)稱是「第八藝術(shù)」,也是一種藝術(shù)創(chuàng)作,所以最好不要出現(xiàn)太多 Pattern,否則肯定被影評(píng)人痛批「了無(wú)新意」。

          以工程來(lái)說(shuō),公式化是好事。這些公式都是「千錘百煉」的結(jié)果,運(yùn)用這些公式可以確保工程具備一定的品質(zhì),并加快工程的進(jìn)行。而軟件開發(fā)也是一項(xiàng)工程,也需要盡量運(yùn)用公式。 (軟件另有需要藝術(shù)的一面,這不在本文的討論范圍)。

          什么是 Design Pattern

          所以,Pattern 就是一種「千錘百煉」的智能結(jié)晶。有經(jīng)驗(yàn)的專家和沒經(jīng)驗(yàn)的新手,差別就在于:有經(jīng)驗(yàn)的專家知道如何在適當(dāng)?shù)臅r(shí)機(jī),套用某些公式(Pattern)以解決特定 的問(wèn)題,這是專家經(jīng)年累月所培養(yǎng)出來(lái)的 Know-How(請(qǐng)參見「軟件產(chǎn)業(yè)的知識(shí)經(jīng)濟(jì)」一文)。

          一般來(lái)說(shuō),對(duì)象導(dǎo)向軟件開發(fā)的程序可以粗略分成 OOA(對(duì)象導(dǎo)向分析)、OOD(對(duì)象導(dǎo)向設(shè)計(jì))、OOP(對(duì)象導(dǎo)向?qū)嵶鳎T?OOD(Object-Oriented Design)階段所采用的 Pattern 就稱為 Design Pattern。運(yùn)用良好的 Design Pattern,可以使得系統(tǒng)架構(gòu)更優(yōu)良(也更快完成),對(duì)于后續(xù)的 OOP、測(cè)試、維護(hù),都會(huì)有很大的 幫助。Design Pattern 會(huì)告訴你,什么情況下用 Delegation 而不要用繼承、什么情況下用 Interface 而不要用 Class... 諸如此類的知識(shí)。這些都是軟件界前輩的智能結(jié)晶。

          我要強(qiáng)調(diào) Design Pattern 專指 Design 時(shí)期的 Pattern。但是 Coding 時(shí)的 Pattern(例如程序代碼內(nèi)縮)最好不要稱為 Pattern,以免混淆。Coding 時(shí)期的 Pattern 最好稱為 Coding Style(或 Code Style)。

          Design Pattern 這個(gè)名詞也可沿用到許多地方。我認(rèn)為孫子兵法就是一本軍事領(lǐng)域 Design Pattern 的書,它告訴你什么時(shí)候該采什么樣的軍事動(dòng)作。至于怎么去砍人,則是屬于 implementation 的部分,不屬于孫子兵法的范圍。

          什么是 Anti-Pattern

          并非所有的 Pattern 都是好的,不好的 Pattern 稱為 Anti-Pattern。如果你的系統(tǒng)中出現(xiàn)了 Anti-Pattern,就表示你犯了別人「常犯的典型錯(cuò)誤」。簡(jiǎn)言之,Anti-Pattern 就是錯(cuò)誤的示范,要盡量避免。

          Design Pattern 成為你的不時(shí)之需

          許多人在設(shè)計(jì)階段才來(lái)喟嘆:「 Pattern 到用時(shí)方恨少。」其實(shí)你可以避免這樣的情況。現(xiàn)在市面上有許多本 Design Pattern 和 Anti-Pattern 的書。只要好好把這些書讀過(guò),體會(huì)每個(gè) Pattern 的真正涵義,你可以在短短的時(shí)間內(nèi),功力激增一甲子。即使讀過(guò)的 Design Pattern,如果比較少用,一陣子之后也可能會(huì)忘記。 所以最好能隔一陣子就把 Design Pattern 的書拿出來(lái)復(fù)習(xí)。

          ?

          posted on 2006-07-10 14:52 rosial 閱讀(269) 評(píng)論(0)  編輯  收藏 所屬分類: 蔡學(xué)鏞

          主站蜘蛛池模板: 额敏县| 安义县| 天峨县| 榆中县| 会泽县| 大余县| 太白县| 搜索| 沂源县| 谢通门县| 衡东县| 东兴市| 宜良县| 康乐县| 师宗县| 罗平县| 高陵县| 河南省| 达拉特旗| 武强县| 泰来县| 化德县| 和硕县| 万山特区| 仁怀市| 蛟河市| 隆林| 五莲县| 日土县| 庆元县| 曲水县| 大同市| 泰和县| 南木林县| 高邑县| 即墨市| 叙永县| 民乐县| 娄烦县| 东丽区| 农安县|