即使是經驗豐富的軟體專業人士,也會發現要為其企業找到能帶來實質價值的模式套用方式殊非易事。本書首次以全面的方法論介紹基元設計模式,給出標準的命名和描述,闡述它們的重要性,幫助人們比較和選用,充分利用模式的真正力量,將它們轉化成實際的、更加簡潔直接的軟體實現,並得到非常不錯的效果。
基本介紹
- 書名:Jolt大獎精選叢書:基元設計模式
- 作者:史密斯 (Jason McC. Smith)
- 出版日期:2013年10月1日
- 語種:簡體中文, 英語
- ISBN:7121211912
- 外文名:Elemental Design Patterns
- 出版社:電子工業出版社
- 頁數:333頁
- 開本:16
- 品牌:電子工業出版社
基本介紹,內容簡介,作者簡介,圖書目錄,序言,
基本介紹
內容簡介
《基元設計模式(英文版)/Jolt大獎精選叢書》編著者史密斯。
本書介紹了一類全新的設計模式,稱為基元設計模式(Elemental Design Pattem),其為軟體工程設計模式的研究和套用打下了基礎。基元設計模式深深植根於軟體程式設計理論的研究,但其目的卻在於實踐性和實用性。從程式設計的新手,到資深的開發工程師,都是基元設計模式的目標客群。它能夠帶領學生加入軟體工業的大軍,也能夠為研究者打開新的思路。
本書介紹了一類全新的設計模式,稱為基元設計模式(Elemental Design Pattem),其為軟體工程設計模式的研究和套用打下了基礎。基元設計模式深深植根於軟體程式設計理論的研究,但其目的卻在於實踐性和實用性。從程式設計的新手,到資深的開發工程師,都是基元設計模式的目標客群。它能夠帶領學生加入軟體工業的大軍,也能夠為研究者打開新的思路。
作者簡介
Jason McC. Smith,2005 年畢業於北卡羅萊納州立大學教堂山分校,獲計算機科學博士學位。該校也是基元設計模式的誕生地,基元設計模式當時是模式查詢和識別系統(System for Pattern Query and Recognition,SPQR)項目的組成部分。Smith 博士因其在校的研究項目而榮獲兩項美國國家專利,一項與SPQR所採用的技術相關,另一項則來自FaceTop 分散式文檔協作系統。
此前,Smith 博士在物理仿真工程和諮詢界工作過多年,取得了華盛頓州立大學的物理學和數學學士學位。值得一提的項目包括聲納和海洋環境仿真、電子工程仿真、商用和軍用飛機飛行仿真,以及實時圖形訓練系統等。
在 IBM 沃森研究中心工作的四年,使Smith 博士有機會將從SPQR 和EDP 目錄中獲得的經驗加以組織,並套用到大量的軟體實體中去,包括遺留系統和現代系統。
Smith 博士現在供職於華盛頓州柯克蘭市的The Software Revolution 公司,任資深研究科學家。在那裡,他持續地最佳化EDP 目錄,並尋找各種方法來推進公司在自動控制現代化以及遺留系統改造方面的業務目標。
此前,Smith 博士在物理仿真工程和諮詢界工作過多年,取得了華盛頓州立大學的物理學和數學學士學位。值得一提的項目包括聲納和海洋環境仿真、電子工程仿真、商用和軍用飛機飛行仿真,以及實時圖形訓練系統等。
在 IBM 沃森研究中心工作的四年,使Smith 博士有機會將從SPQR 和EDP 目錄中獲得的經驗加以組織,並套用到大量的軟體實體中去,包括遺留系統和現代系統。
Smith 博士現在供職於華盛頓州柯克蘭市的The Software Revolution 公司,任資深研究科學家。在那裡,他持續地最佳化EDP 目錄,並尋找各種方法來推進公司在自動控制現代化以及遺留系統改造方面的業務目標。
圖書目錄
1 Introduction to Design Patterns
1.1 Tribal Musings
1.2 Art or Science?
1.2.1 Viewing Patterns as Rote
1.2.2 Language-Dependent Views
1.2.3 From Myth to Science
2 Elemental Design Patterns
2.1 Background
2.2 The Where, the Why, the How
2.2.1 Decomposition of Decorator
2.2.2 Down the Rabbit Hole
2.2.3 Context
2.2.4 The Design Space
2.3 Core EDPs
2.4 Conclusion
3 Pattern Instance Notation
3.1 Basics
3.2 The PINbox
3.2.1 Collapsed PINbox
3.2.2 Standard PINbox
3.2.3 Expanded PINbox
3.2.4 Stacked PINboxes and Multiplicity
3.2.5 Peeling and Coalescing
3.3 Conclusion
4 Working with EDPs
4.1 Composition of Patterns
4.1.1 Isotopes
4.2 Recreating Decorator
4.3 Refactoring
4.4 The Big Picture
4.5 Why You May Want to Read the Appendix
4.6 Advanced Topics
4.6.1 Focused Documentation and Training
4.6.2 Metrics
4.6.3 Procedural Analysis
4.7 Conclusion
5 EDP Catalog
Create Object
Retrieve
Inheritance
Abstract Interface
Delegation
Redirection
Conglomeration
Recursion
Revert Method
Extend Method
Delegated Conglomeration
Redirected Recursion
Trusted Delegation
Trusted Redirection
Deputized Delegation
Deputized Redirection
6 Intermediate Pattern Compositions
Fulfill Method
Retrieve New
Retrieve Shared
Objectifier
Object Recursion
7 Gang of Four Pattern Compositions
7.1 Creational Patterns
7.1.1 Abstract Factory
7.1.2 Factory Method
7.2 Structural Patterns
7.2.1 Decorator
7.2.2 Proxy
7.3 Behavioral Patterns
7.3.1 Chain of Responsibility
7.3.2 Template Method
7.4 Conclusion
A ρ-Calculus
A.1 Reliance Operators
A.2 Transitivity and Isotopes
A.3 Similarity
A.4 EDP Formalisms
A.5 Composition and Reduction Rules
A.6 Pattern Instance Notation and Roles
A.7 EDP Definitions
A.7.1 Create Object
A.7.2 Retrieve
A.7.3 Inheritance
A.7.4 Abstract Interface
A.7.5 Delegation
A.7.6 Redirection
A.7.7 Conglomeration
A.7.8 Recursion
A.7.9 Revert Method
A.7.10 Extend Method
A.7.11 Delegated Conglomeration
A.7.12 Redirected Recursion
A.7.13 Trusted Delegation
A.7.14 Trusted Redirection
A.7.15 Deputized Delegation
A.7.16 Deputized Redirection
A.8 Intermediate Pattern Definitions
A.8.1 Fulfill Method
A.8.2 Retrieve New
A.8.3 Retrieve Shared
A.8.4 Objectifier
A.8.5 Object Recursion
A.9 Gang of Four Pattern Definitions
A.9.1 Abstract Factory
A.9.2 Factory Method
A.9.3 Decorator
A.9.4 Proxy
A.9.5 Chain of Responsibility
A.9.6 Template Method
Bibliography
Index
1.1 Tribal Musings
1.2 Art or Science?
1.2.1 Viewing Patterns as Rote
1.2.2 Language-Dependent Views
1.2.3 From Myth to Science
2 Elemental Design Patterns
2.1 Background
2.2 The Where, the Why, the How
2.2.1 Decomposition of Decorator
2.2.2 Down the Rabbit Hole
2.2.3 Context
2.2.4 The Design Space
2.3 Core EDPs
2.4 Conclusion
3 Pattern Instance Notation
3.1 Basics
3.2 The PINbox
3.2.1 Collapsed PINbox
3.2.2 Standard PINbox
3.2.3 Expanded PINbox
3.2.4 Stacked PINboxes and Multiplicity
3.2.5 Peeling and Coalescing
3.3 Conclusion
4 Working with EDPs
4.1 Composition of Patterns
4.1.1 Isotopes
4.2 Recreating Decorator
4.3 Refactoring
4.4 The Big Picture
4.5 Why You May Want to Read the Appendix
4.6 Advanced Topics
4.6.1 Focused Documentation and Training
4.6.2 Metrics
4.6.3 Procedural Analysis
4.7 Conclusion
5 EDP Catalog
Create Object
Retrieve
Inheritance
Abstract Interface
Delegation
Redirection
Conglomeration
Recursion
Revert Method
Extend Method
Delegated Conglomeration
Redirected Recursion
Trusted Delegation
Trusted Redirection
Deputized Delegation
Deputized Redirection
6 Intermediate Pattern Compositions
Fulfill Method
Retrieve New
Retrieve Shared
Objectifier
Object Recursion
7 Gang of Four Pattern Compositions
7.1 Creational Patterns
7.1.1 Abstract Factory
7.1.2 Factory Method
7.2 Structural Patterns
7.2.1 Decorator
7.2.2 Proxy
7.3 Behavioral Patterns
7.3.1 Chain of Responsibility
7.3.2 Template Method
7.4 Conclusion
A ρ-Calculus
A.1 Reliance Operators
A.2 Transitivity and Isotopes
A.3 Similarity
A.4 EDP Formalisms
A.5 Composition and Reduction Rules
A.6 Pattern Instance Notation and Roles
A.7 EDP Definitions
A.7.1 Create Object
A.7.2 Retrieve
A.7.3 Inheritance
A.7.4 Abstract Interface
A.7.5 Delegation
A.7.6 Redirection
A.7.7 Conglomeration
A.7.8 Recursion
A.7.9 Revert Method
A.7.10 Extend Method
A.7.11 Delegated Conglomeration
A.7.12 Redirected Recursion
A.7.13 Trusted Delegation
A.7.14 Trusted Redirection
A.7.15 Deputized Delegation
A.7.16 Deputized Redirection
A.8 Intermediate Pattern Definitions
A.8.1 Fulfill Method
A.8.2 Retrieve New
A.8.3 Retrieve Shared
A.8.4 Objectifier
A.8.5 Object Recursion
A.9 Gang of Four Pattern Definitions
A.9.1 Abstract Factory
A.9.2 Factory Method
A.9.3 Decorator
A.9.4 Proxy
A.9.5 Chain of Responsibility
A.9.6 Template Method
Bibliography
Index
序言
本書介紹了一類全新的設計模式,稱為基元設計模式(Elemental Design Pattern),其為軟體工程設計模式的研究和套用打下了基礎。基元設計模式深深植根於軟體程式設計理論的研究,但其目的卻在於實踐性和實用性。從程式設計的新手,到資深的開發工程師,都是基元設計模式的目標客群。它能夠帶領學生加入軟體工業的大軍,也能夠為研究者打開新的思路。
一言以蔽之,本書的寫作目的在於為人所用。
讀畢掩卷之時,您將在工具箱中收穫一整套全新的工具,您將對日常的程式設計基本概念有更深入的理解,並知道它們是以怎樣的方式聯繫和互動才產生了偉大的創意。基元設計模式,簡稱EDP,是一組基礎的程式設計思想,我們本能地使用它們,而幾乎不會去反思。但本書給予了它們正式的描述以及標準的名字,以便在討論時使用;本書還提供了一個框架來保證概念的一致性,並針對它們各自的特點加以比較。如果您是一個剛入學的學生,您將會了解到,如雨後春筍般湧現的設計模式文獻並非要么全盤接受、要么全盤棄用的鐵板一塊,而是可以將其分解為若干的片段逐個取用,採用科學的方法論來一點點地理解這些鴻篇巨著。如果您早已是軟體設計和模式方面的行家裡手,也仍然可以找到研究老辦法的新視角,並發現我們這個行業里的新機會。
本書假定您對於設計模式領域曾多少有過一些了解和熟悉,但並未深度套用或研究過。僅僅知道存在這么一個領域,並對其有一些道聽途說的認知,已經足夠開展我們的討論。本書並不期望您有程式設計理論或語言設計的背景,甚至不要求您精通一門面向對象的程式設計語言,只要心懷渴望,想要學習軟體設計的辯證思維即可。在本書中這些主題會有所涉及,但只是以針對想要藉由參考文獻深入了解相關主題者的出發點論述。本書將採用統一建模語言(Unified Modeling Language,UML)來描述一些小例子,如果您還不了解UML,請參考 或。您需要有一點點程式設計基礎,面向過程或面向對象皆可,最好是後者,但並不是必需的——本書內容已經把面向對象程式設計必知必會的信息打包成易於理解的模組了。經驗豐富的面向對象程式開發工程師亦會有驚喜,發現自認為早已掌握的概念仍有新意,從而提升自己對於面向對象程式設計的整體認識。
許多程式設計師都把“設計模式社區”看作一個專家怪人的群體,認為自己並非其中一員。通過帶給您新的視角,讓您認識到設計模式是怎么來的,本書應能說服您接受如下觀點,即每一位程式設計師都是設計模式社區的一員,無論其自覺與否。每一位程式設計師在寫下每一行代碼的時候,都在運用設計模式,無論其是否這樣去想。正因如此,有些選項近在眼前卻被人棄如草芥。設計模式是一種共享的概念空間,我們在其中編織自己的電子夢想,並由此改變世界。是時候給出一張標識地界的地圖了,這樣我們才能更好地工作和享受。
遵循Gang of Four 樹立的典範,本書亦分為兩部分。前半部分講述了本書為何而寫,為誰而寫,解釋了什麼是EDP,它源自何處,為何重要。該部分闡述的是基本理論,是EDP 背後的“為什麼”。該部分還介紹了模式實例記號(Pattern Instance Notation),這是一種能和各種粒度級別上的模式協同工作的圖表系統。前半部分的收尾章節討論了如何使用EDP 來構建出更大尺度的設計模式,以及如何與其協同工作。後半部分則是設計模式的大閱
兵,以EDP 為起點,通過案例來講述它們如何以組合方式形成過渡模式,最後,從EDP 組合的視角重新審視了若干GoF 設計模式。這裡講述的EDP 只是全部EDP 目錄的一部分,只是首輪被定義和描述的基礎模式集合。軟體工程社區將不斷地定義和精化更多的EDP,只要它們背後的概念能夠生根發芽。
我們期待您能參與其中。
熱烈歡迎您的加入!
致 謝
本書得以問世,有太多人要感謝,就讓我不按時間先後地致謝吧。
我在北卡羅萊納州立大學教堂山分校的博士生導師David Stotts,見證了SPQR 和 EDP 的誕生過程。我所在的委員會裡的同事們,儘管他們一度感覺EDP 沒有什麼可行性,仍然認為這會是樁有意義的工作,並給予我自由,讓我追夢。Jan Prins、David Plaisted、Al Segars 和Sid Chatterjee,你們每個人都在關鍵的時候施以我無價的幫助。
在 IBM 沃森研究中心度過的歲月里,是Sid Chatterjee 說服了我參與Big Blue Playpen 項目;Clay Williams 放手讓我沉浸在這些天馬行空的思想中,我十分懷念與他共度的咖啡時光。Peter Santhanam 支持我的這些思想,而我也從他身上學到了對於遺留系統的敬畏。Brent Hailpern 教給了我很多管理方面的無價經驗,我也學到了職場生活的黑色幽默,以及人性的簡單。Edith Sconberg 忍受了我的多次惡作劇,本來作為一個老闆他大可不必如此。還有好多同事都聽我一遍遍地嘮叨關於本書的長篇痴語。朋友們,我真想念你們!
還是在IBM,但我要特別鳴謝的是Grady Booch,將我愛護於他的羽翼之下,我卻無以為報。Grady,您的指導、幫教和建議對我的意義無法度量,唯有期望未來的合作和友誼長青。
位於華盛頓州柯克蘭市的The Software Revolution 公司,是我如今任職資深計算機科學家的單位。我要感謝這裡的每一位同事的理解,感謝他們在我發表論文時提供我所需要的信息。我為能與你們共事倍感自豪,我急切地盼望看到我們能一起把公司做到多大。
對本書的多位審閱者,你們的建議和評論具有深刻的洞見,頗有教益。你們使本書增色不少,對下列同仁則致以最高的謝意:Lee Ackerman、Lars Bishop、Robert Bogetti、Robert Couch、Bernard Farrell、Mary Lou Hines Fritts、Gail Murphy、Jeffrey Overbey、Ethan Roberts、Carlota Sage、Davie Sweis、Peri Tarr 和 Rebecca Wirfs-Brock。Addison-Wesley 出版社的 Elizabeth Ryan、Raina Chrobak、Chris Zahn 和 Chris Guzikowski 在整個成書過程中堪稱模範支持團隊——在此對你們,以及其餘同事致謝,特別要鳴謝的是 Carol Lallier,她對全書的打磨真是無以倫比。
我謹以個人的名義向我的朋友和家人致謝,他們在我投入那似乎遙遙無期的寫書工作時表現出了特別的耐心,現在我搬回了西雅圖地區,他們總算能和我多見上幾面了。
最後要感謝的是我的妻子Leah。我們在一起的時候,你給了我大大小小的幫助何以計數。你付出的是時間、耐心和愛,我對你的愛和謝意也是無盡的。謝謝你!和這些相比,任何語言都是蒼白的。
謝謝所有以你們的方式改進了本書的思想和文字的人們。本書雖然是我的“孩子”,但無疑離不開眾多“助產士”的一臂之力。
Jason McC. Smith
西雅圖
2011 年9 月4 日
一言以蔽之,本書的寫作目的在於為人所用。
讀畢掩卷之時,您將在工具箱中收穫一整套全新的工具,您將對日常的程式設計基本概念有更深入的理解,並知道它們是以怎樣的方式聯繫和互動才產生了偉大的創意。基元設計模式,簡稱EDP,是一組基礎的程式設計思想,我們本能地使用它們,而幾乎不會去反思。但本書給予了它們正式的描述以及標準的名字,以便在討論時使用;本書還提供了一個框架來保證概念的一致性,並針對它們各自的特點加以比較。如果您是一個剛入學的學生,您將會了解到,如雨後春筍般湧現的設計模式文獻並非要么全盤接受、要么全盤棄用的鐵板一塊,而是可以將其分解為若干的片段逐個取用,採用科學的方法論來一點點地理解這些鴻篇巨著。如果您早已是軟體設計和模式方面的行家裡手,也仍然可以找到研究老辦法的新視角,並發現我們這個行業里的新機會。
本書假定您對於設計模式領域曾多少有過一些了解和熟悉,但並未深度套用或研究過。僅僅知道存在這么一個領域,並對其有一些道聽途說的認知,已經足夠開展我們的討論。本書並不期望您有程式設計理論或語言設計的背景,甚至不要求您精通一門面向對象的程式設計語言,只要心懷渴望,想要學習軟體設計的辯證思維即可。在本書中這些主題會有所涉及,但只是以針對想要藉由參考文獻深入了解相關主題者的出發點論述。本書將採用統一建模語言(Unified Modeling Language,UML)來描述一些小例子,如果您還不了解UML,請參考 或。您需要有一點點程式設計基礎,面向過程或面向對象皆可,最好是後者,但並不是必需的——本書內容已經把面向對象程式設計必知必會的信息打包成易於理解的模組了。經驗豐富的面向對象程式開發工程師亦會有驚喜,發現自認為早已掌握的概念仍有新意,從而提升自己對於面向對象程式設計的整體認識。
許多程式設計師都把“設計模式社區”看作一個專家怪人的群體,認為自己並非其中一員。通過帶給您新的視角,讓您認識到設計模式是怎么來的,本書應能說服您接受如下觀點,即每一位程式設計師都是設計模式社區的一員,無論其自覺與否。每一位程式設計師在寫下每一行代碼的時候,都在運用設計模式,無論其是否這樣去想。正因如此,有些選項近在眼前卻被人棄如草芥。設計模式是一種共享的概念空間,我們在其中編織自己的電子夢想,並由此改變世界。是時候給出一張標識地界的地圖了,這樣我們才能更好地工作和享受。
遵循Gang of Four 樹立的典範,本書亦分為兩部分。前半部分講述了本書為何而寫,為誰而寫,解釋了什麼是EDP,它源自何處,為何重要。該部分闡述的是基本理論,是EDP 背後的“為什麼”。該部分還介紹了模式實例記號(Pattern Instance Notation),這是一種能和各種粒度級別上的模式協同工作的圖表系統。前半部分的收尾章節討論了如何使用EDP 來構建出更大尺度的設計模式,以及如何與其協同工作。後半部分則是設計模式的大閱
兵,以EDP 為起點,通過案例來講述它們如何以組合方式形成過渡模式,最後,從EDP 組合的視角重新審視了若干GoF 設計模式。這裡講述的EDP 只是全部EDP 目錄的一部分,只是首輪被定義和描述的基礎模式集合。軟體工程社區將不斷地定義和精化更多的EDP,只要它們背後的概念能夠生根發芽。
我們期待您能參與其中。
熱烈歡迎您的加入!
致 謝
本書得以問世,有太多人要感謝,就讓我不按時間先後地致謝吧。
我在北卡羅萊納州立大學教堂山分校的博士生導師David Stotts,見證了SPQR 和 EDP 的誕生過程。我所在的委員會裡的同事們,儘管他們一度感覺EDP 沒有什麼可行性,仍然認為這會是樁有意義的工作,並給予我自由,讓我追夢。Jan Prins、David Plaisted、Al Segars 和Sid Chatterjee,你們每個人都在關鍵的時候施以我無價的幫助。
在 IBM 沃森研究中心度過的歲月里,是Sid Chatterjee 說服了我參與Big Blue Playpen 項目;Clay Williams 放手讓我沉浸在這些天馬行空的思想中,我十分懷念與他共度的咖啡時光。Peter Santhanam 支持我的這些思想,而我也從他身上學到了對於遺留系統的敬畏。Brent Hailpern 教給了我很多管理方面的無價經驗,我也學到了職場生活的黑色幽默,以及人性的簡單。Edith Sconberg 忍受了我的多次惡作劇,本來作為一個老闆他大可不必如此。還有好多同事都聽我一遍遍地嘮叨關於本書的長篇痴語。朋友們,我真想念你們!
還是在IBM,但我要特別鳴謝的是Grady Booch,將我愛護於他的羽翼之下,我卻無以為報。Grady,您的指導、幫教和建議對我的意義無法度量,唯有期望未來的合作和友誼長青。
位於華盛頓州柯克蘭市的The Software Revolution 公司,是我如今任職資深計算機科學家的單位。我要感謝這裡的每一位同事的理解,感謝他們在我發表論文時提供我所需要的信息。我為能與你們共事倍感自豪,我急切地盼望看到我們能一起把公司做到多大。
對本書的多位審閱者,你們的建議和評論具有深刻的洞見,頗有教益。你們使本書增色不少,對下列同仁則致以最高的謝意:Lee Ackerman、Lars Bishop、Robert Bogetti、Robert Couch、Bernard Farrell、Mary Lou Hines Fritts、Gail Murphy、Jeffrey Overbey、Ethan Roberts、Carlota Sage、Davie Sweis、Peri Tarr 和 Rebecca Wirfs-Brock。Addison-Wesley 出版社的 Elizabeth Ryan、Raina Chrobak、Chris Zahn 和 Chris Guzikowski 在整個成書過程中堪稱模範支持團隊——在此對你們,以及其餘同事致謝,特別要鳴謝的是 Carol Lallier,她對全書的打磨真是無以倫比。
我謹以個人的名義向我的朋友和家人致謝,他們在我投入那似乎遙遙無期的寫書工作時表現出了特別的耐心,現在我搬回了西雅圖地區,他們總算能和我多見上幾面了。
最後要感謝的是我的妻子Leah。我們在一起的時候,你給了我大大小小的幫助何以計數。你付出的是時間、耐心和愛,我對你的愛和謝意也是無盡的。謝謝你!和這些相比,任何語言都是蒼白的。
謝謝所有以你們的方式改進了本書的思想和文字的人們。本書雖然是我的“孩子”,但無疑離不開眾多“助產士”的一臂之力。
Jason McC. Smith
西雅圖
2011 年9 月4 日