1. 程式人生 > >GoF設計模式三作者15年後再談模式

GoF設計模式三作者15年後再談模式

關系 ros 聯通 類圖 obj 適合 困難 編程 c++


Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF設計模式發表15年以後,再談模式,另外一位作者,也是四色原型的發明者Peter已經過世。

提問者:如今有85,000 iPhone的小應用遍布全球,使用PHP就能夠寫一個簡單的"Hello, World! The time is X"Web網頁,那麽,面向對象設計是難的,這句話是否還正確呢?

Richard Helm: 軟件設計總是很難的,盡管大多數現代開發環境已經降低了復雜性,通過重用庫和工具(Eclipse, Apple, Microsoft), 設計一個解決業務問題的軟件依然是難的。

Erich Gamma: 是的,iPhone非常有趣. The iPhone SDK 是基於NeXTStep面向對象框架 object-oriented frameworks,如AppKit. 但我們15年前寫GoF設計模式時就已經存在,也是驅動力之一.我們實際上已經在書中提到框架的幾個模式: Adapter, Bridge, Proxy, and Chain of Responsibility.

提問者:是否可以表明好設計能夠延長軟件生命,它能夠在不同技術形態中延續生存呢?

Ralph Johnson: 今天有時寫一行代碼也許就可以,軟件經過多年已經提高很多,許多系統過去需要仔細的設計,今天已經能夠被重用,但是還是還有一些系統寫100K代碼並不比15年前容易。它能實現更多功能,但是耗費也是同樣的。

軟件設計是難的,這正使它變得有趣,善於軟件設計的人會從解決難問題中得到樂趣:將混亂變得秩序,克服困難。過去是難的事情現在變得容易,但是我們今天面臨的問題是15年前不可能面臨的,OO編程有幫助,但是不能消除設計的困難。


提問:關於重用,在90年代作為OO的主要好處,但是過去幾年,很多程序員離開重用,開始使用框架,對於重用的觀點變得:你不可能需要它, 那麽是否重用還是今天開發這的主要目標呢?

Richard: 我認為在復雜層次有一個進化,重用軟件已經演變成在系統語言層次,以框架和工具形式出現,大部分工作留給框架設計專家來實現。

....

Erich: 實際上,我補充的是,最難的是可重用面向對象軟件的演進使用,比如 factories, adapters 和facades模式能夠改變和演進一個可重用的庫.。

.....

Ralph: 大多數程序員都不是被聘請為編寫一個可重用的軟件,但是你必須知道一個可重用的軟件是如何工作的,我們的模式是重用軟件的通用方式,如今他們還是有用的。

Erich: 我同意,但我學習iPhone SDK時,我註意到這些庫非常熟悉,因為他們是我熟悉的模式。

提問者: 曾經有一段時間,每件事都是模式,有模式架構,組織行為,分析等等,如今是否有23種模式的拓展,比如架構模式,是否有新的設計模式關系圖?


Ralph: 如果你的意思是我們是否有,回答是沒有,如果你意思是是否有人做了新圖,回答是有。
....


提問者:在模式熱潮中,有一種反模式anti-patterns,你們是怎麽看的。反模式是模式嗎?

Richard: 有可能,他們提供了一種方法,分享他們犯過的錯誤。

Ralph: 我願意使用這樣概念"代碼味道code smells," or "設計味道design smells"/"架構味道architecture smells"等等,他們並不總是錯誤. 有時他們實際就是你必須面臨的問題, 比如"stove pipe"系統出現,部分是因為公司軟件之間並沒有一個好的互聯通訊方式。 部分因為技術變化太快,部分因為公司之間不同架構,z增長快的公司收購了其他公司也造成,所以,並不是架構領導力的強度能夠消除這個問題的

我的一些學生寫了一個模式叫大泥球"Big Ball of Mud." 大部分知道這個模式的人知道它是一個反模式,但是一些IT組織的人,至少我看到過的,並不做得更好。

...


提問者:如今一些聽到一些面向functional或dynamic語言者宣稱他們的語言不需要模式,你們如何反應?

Erich: 需要註意的是,但我們寫設計模式時,還沒有Java和C#

Ralph: 這些語言不需要模式,是因為這些語言提供了一種解決問題的方式,我們的模式是對於語言C++ 和 Smalltalk,包括今天的大部分叫OO的語言, 當然不適合所有語言,我並不認為使用其他語言就不需要模式,只不過他們使用另外一種其實等同於模式的概念。

Erich: 設計模式最終融入任何語言. 盡管這些經驗並不總是表達為模式,但是他們存在,Erlang的設計原理就是這樣。

提問者:: 有關於dynamic 和面向功能functional語言的模式嗎?

Ralph: 如果動態語言如Smalltalk, Ruby or Python, 那麽我們的模式依然有效,. Functional性語言需要不同的模式,但是目前我不知道有誰發布。

提問者: OOP 提供一個靜態和動態結構的結合,允許設計意圖能在在不同流程中傳達,今天強調面向功能和元編程, 有"domain-specific language" 或 "fluid interface流體接口" 這些概念和模式有什麽區別和聯系?

Richard: 是一種補充. 使用好設計的豐富的類圖結構,可以獲得DSL的特性和功能,庫構成DSL的名詞和動詞。

Erich: 有的是補充設計模式,元編程能夠替代設計模式, 例如JUnit 3 到JUnit 4演變是一個例子, JUnit 3 是一個使用Composite, Template Method 和Command等模式小框架. JUnit 4 導入Annotations meta-programming . 以前的模式使用就消失了,演變成一系列小的元註解。

....
其他不是非常重要的可見原文:Erich Gamma, Richard Helm, and Ralph Johnson talk to Larry O‘Brien about Design Patterns, 15 years later.

GoF設計模式三作者15年後再談模式