1. 程式人生 > >開發複用:模式 設計模式 反模式 分析模式

開發複用:模式 設計模式 反模式 分析模式

模式的起源

       設計模式的起源是建築師Christopher Alexander 的研究,不同時代建築師留下的偉大建築作品中,有很多重複出現的設計,於是,他找到了一種結構化、可重用的方法來捕捉並描述這些重複的設計, 還給這些描述的結果起了一個名字叫模式(Pattern)。

     “每一個模式描述了一個在人們周圍不斷重複發生的問題,以及該問題的解決方案的核心。這樣,你就能不斷地使用該方案而不必做重複勞動。”軟體開發者最討厭的東西也許就是重複,於是軟體開發者很容易接受了這個思想。這裡說一點題外話,中國的建築史從來不以複用為目標的,中國至今沒有一本像樣的古代建築史,是因為建築師往往要突破舊例,而這些知識卻往往是獨佔的。所以樣式雷家族的建築圖譜遺失之後,故宮的建築能拆開但是裝不上去。

模式的描述

      建築大師用四個重要部分來描述一個模式:

名稱:就像頁面元素的ID一樣,提到它的時候沒有歧義就夠了。但是有的名字太受歡迎了,哪裡都有:比如工廠模式
問題:也就是模式的適用場景
 解決方案:從規約層面來看設計的各部分的責任和關係
 效果:好多書上這裡都用“後果”,這個詞略帶貶義,我使用了“效果”。
    這種描述方式也被借鑑到了軟體開發領域,我們現在看到的設計模式的描述中,也都按照這樣的格式來刻畫某一個設計模式的關鍵特徵。我們知道對於具體事物的描述大體上可分為兩種。一種是對事物的屬性進行度量,屬於定量的表示方法。另一種則是對事務所包含的成分進行分析,稱為定性的描述或結構性描述。顯然這種方式還是定性分析。

       這裡就有一個有趣的問題了,設計模式的定義是定性的。讓機器辨別事物的最基本方法是計算,原則上講是對計算機要分析的事物與作為標準的稱之為“模板”的相似程度進行計算。所以現在很多人研究設計模式自動選擇時,第一件事情就是把設計模式進行量化描述。而在這種研究沒有成功之前,分析、描述、判斷還是人的強項,設計模式也體現了一個開發人員的價值。

設計模式

1995年,Erich Gamma、Richard Helm、Ralph Johnson 和John Vlissides發表了著名的《Design Patterns:Elements of Reusable Object-Oriented Software》,這本書成為了設計模式的經典之作,這四位也被稱為GOF.

        設計模式複用的是面向物件設計知識和經驗,它是用模板描述的,在設計階段廣泛使用。設計模式的關注者主要是設計師 開發人員。面向物件技術的日益成熟使其可操作性很強,通過學習面向物件的設計原則和設計模式的描述模板開發人員可以逐漸將設計模式應用到自己的設計過程中。

     反模式   

1996 年,Michael Akroyd 發表了“AntiPatterns:Vaccinations against Object Misuse”的論文,提出了反模式(Anti Patterns)的概念,反模式標識了導致軟體質量低劣和專案失敗的不好的設計概念、技術途徑和開發實踐,並提出了軟體重組方案。現在我桌面上有《反模式:危機中軟體、架構和專案的重構》,反模式方面的資料相對設計模式太少,這本200多頁的小冊子也成了反模式的經典。

      設計模式的組織思路是集中以往的優秀軟體的設計經驗,它的思路可以簡單的表達為:站在巨人的肩膀上。而反模式的思路則是:失敗是成功之母。反模式複用的是軟體開發失敗的知識和經驗,它適用的場景跨越整個軟體開發過程。因而無論是開發者、設計師還是軟體開發的管理者都可以從反模式中獲益。基於對軟體開發最常見慘痛教訓的總結,這種實踐特徵也讓反模式具有較強的可操作性。反模式的也是像設計模式一樣用模板來描述,它會包含反模式名稱、根源、以及重構方案等組成部分。

分析模式

1996 年,Martin Fowler 的《Analysis Pattern:Reusable Object Models》一書提出了分析模式的概念。去年年底我翻譯了Martin Fowler的一篇經典文章《新方法論》,隨即發現這位大師在好多領域都是領先者比如Ioc,比如分析模式Analysis Pattern 經常在Martin Fowler的網站上轉悠收穫不少。

     複用的最高境界是什麼?是需求的複用。OOA中可複用的分析知識和經驗是分析模式複用的內容。分析模式著眼於軟體的分析和藍圖規劃階段,它不是從計算機系統的角度來看問題而是從領域工程的角度,反映的是業務過程的概念抽象而不是軟體實現。所以分析模式是使用面向物件的思維方式來幫助領域專家,分析師來認識問題的,它是高度抽象的。高度抽象同時意味著它在實踐中的可操作性比較差,曲高和寡,向來如此。

       

  總結   

        做為一個開發者,從最簡單的程式碼複用開始,堅持不懈的學習設計模式,並借力設計模式將煙囪型的系統變成一個可擴充套件的健壯的系統。這個過程是漫長的,艱難的,要走好多的彎路,但是追求更好的設計是大部分開發者的共同點。

        這個磨礪過程之後才有開發過程中的舉重若輕,這讓我想到黃庭堅的詩句:“桃李春風一杯酒,夜雨江南十年燈”,繼續吧…