《敏捷開發(fā)(紀(jì)念版)》介紹敏捷原則、模式和實踐,包含4部分38章24個附錄,首先概述敏捷開發(fā)、包含6個主題,分別為敏捷實踐、極限編程、規(guī)劃、測試、重構(gòu)和編程活動。接下來介紹敏捷設(shè)計,解釋了5個設(shè)計原則、UML及其應(yīng)用,包括狀態(tài)圖、對象圖、用例圖、序列圖和類圖,并以一個完整的咖啡機編程案例來介紹具體的用法。通過薪水支付系統(tǒng)Payroll的實戰(zhàn)練習(xí),書中呈現(xiàn)了敏捷開發(fā)的整個過程及其實用價值。 《敏捷開發(fā)(紀(jì)念版)》適合真正想要通過敏捷方法來提升軟件開發(fā)技能以及及時交付軟件價值的所有讀者閱讀和參考,尤其適合開發(fā)、管理和業(yè)務(wù)分析崗位的人員學(xué)習(xí)。通過本書的閱讀,讀者還可以了解UML、設(shè)計模式、面向?qū)ο笤O(shè)計原則以及包括極限編程在內(nèi)的敏捷方法。
《敏捷開發(fā)(紀(jì)念版)》通過豐富的案例來詮釋了敏捷開發(fā)和敏捷設(shè)計的基礎(chǔ)知識,介紹了UML模型如何轉(zhuǎn)為實際可用的C#代碼。在總體上概述敏捷運動之后,展示了敏捷實踐過程,并通過大量有價值的源代碼實例來展示了敏捷設(shè)計、開發(fā)與實踐。
通過本書的閱讀,讀者可以掌握以下主題:
● 12個敏捷原則和14個極限編程實踐
● 技術(shù)預(yù)研,故事拆分,速率,迭代和版本規(guī)劃
● 測試驅(qū)動開發(fā)、測試先行設(shè)計以及驗收測試
● 單元測試與重構(gòu)
● 結(jié)對編程
● 敏捷設(shè)計與設(shè)計異味
● 5類UML圖及其高效用法
● 面向?qū)ο蟮能浖O(shè)計及其設(shè)計模式
● 如何綜合運用所有要點來實現(xiàn)一個真實的項目
可是老兄,你說你去年就會完成這本書的。距離1999年Claudia發(fā)出這一正當(dāng)?shù)谋г,已?jīng)過去7年了,但我(Bob)(前言為兩名作者共同寫成,因而在我的后面指出了具體的作者名稱,以示區(qū)分)覺得已經(jīng)做出了補償。我要經(jīng)營一家咨詢公司,做大量編碼、培訓(xùn)、輔導(dǎo)和演講工作,寫文章、專欄和博客,更不用提還要養(yǎng)家糊口并享受大家庭的樂趣。所以,這期間寫三本書(每兩年一本)真的是一個巨大的挑戰(zhàn)。但是,我樂在其中。
敏捷開發(fā)是在需求快速變化的情況下快速開發(fā)軟件的一種能力。為實現(xiàn)這種敏捷性,需使用能提供必要紀(jì)律和反饋的實踐,需遵守保持軟件靈活且易于維護的設(shè)計原則,需知道已證明能為特定問題權(quán)衡那些原則的設(shè)計模式。本書旨在將這三個概念整合成一個有機的整體。
本書介紹了這些原則、模式與實踐,然后通過多個案例來演示其實際運用。更重要的是,這些案例都不是成品。相反,它們是進行中的設(shè)計。你會看到設(shè)計人員犯錯,觀察到他們?nèi)绾伟l(fā)現(xiàn)并終糾正錯誤,會看到設(shè)計人員對一個難題苦思不得其解,并擔(dān)心歧義和得失?傊,你看到的是設(shè)計實際在進行。
2005年初,我(Micah)在一個小開發(fā)團隊做事,當(dāng)時要著手用C#來寫一個.NET應(yīng)用程序。項目要求采用敏捷開發(fā)實踐,這正是我進入該項目的原因之一。雖然以前用過C#,但我熟悉的還是Java和C 。
當(dāng)時沒想過用.NET會有多大區(qū)別,事實證明確實如此。項目進行了兩個月,我們發(fā)布了個版本。不是完整版本,只包含所有預(yù)期功能的一部分,但足夠用。他們也真的在用。僅過了兩個月,公司就從我們的開發(fā)收獲了好處。管理層高興,嚷著要雇更多人,啟動更多項目。
多年來一直出沒于敏捷社區(qū),我知道有許多敏捷開發(fā)人員能幫到我們。我給他們打了電話,請他們加入。終,沒有任何一個搞敏捷的人加入我們的團隊。為什么?或許重要的原因是我們用的是.NET。
幾乎所有敏捷開發(fā)人員都有Java,C 或Smalltalk的背景。但幾乎沒聽說過有敏捷.NET程序員。我說要用.NET進行敏捷軟件開發(fā),我的那些朋友可能根本沒有把我的話當(dāng)真,或者他們就是不想和.NET扯上關(guān)系。這是一個大問題。而且,發(fā)生過好多次。
為期一周的有關(guān)各種軟件主題的課程使我能結(jié)識來自世界各地的開發(fā)人員。
就各種軟件主題講授大約一周的課程,使我有機會接觸來自世界各地有代表性的開發(fā)人員。許多學(xué)員都是.NET程序員,也有許多是Java或C 程序員。雖然不好聽,但根據(jù)我的經(jīng)驗,.NET程序員通常比Java和C 程序員要弱一些。顯然,并非總是如此。但通過在課堂上反復(fù)觀察,我只能得出這樣的結(jié)論:.NET程序員在敏捷軟件實踐、設(shè)計模式和設(shè)計原則等方面通常要弱一些。據(jù)我觀察,許多.NET程序員從未聽說過這些基本概念。這種情況必須改變!
我父親Robert C. Martin于2002年出版了的《敏捷軟件開發(fā):原則、模式與實現(xiàn)》榮獲了2003年Jolt大獎。那是本好書,受到許多開發(fā)人員的推崇。遺憾的是,它對.NET社區(qū)影響甚微。雖然書的內(nèi)容同樣適合.NET,但鮮有.NET程序員讀過。
我希望講.NET的這一版能在.NET和開發(fā)社區(qū)其余部分之間建立起一座橋梁。希望程序員能讀一讀,了解構(gòu)建軟件的更優(yōu)方式。希望他們開始使用更好的軟件實踐,創(chuàng)建更好的設(shè)計,提升.NET應(yīng)用程序員的質(zhì)量標(biāo)準(zhǔn)。希望.NET程序員不再比其他程序員弱。希望.NET程序員在軟件社區(qū)取得更多話語權(quán),就連Java開發(fā)人員也樂意加入一個.NET團隊。
寫書的過程中,我經(jīng)常糾結(jié)于要不要把我的名字放在一本.NET書的封面。這樣會不會將我和.NET聯(lián)系起來,會不會有不好的暗示?但終我不再糾結(jié)。我是一名.NET程序員。不對!一名敏捷.NET程序員!我為此感到驕傲。
關(guān)于本書
20世紀(jì)90年代初,我(Bob)寫了Designing Object-Oriented C Applications Using the Booch Method一書,是我的代表作,我對其影響和銷量都很滿意。其實你現(xiàn)在正在看的開始就是想作為那本書的第3版,只是后來完全不是那么回事。原作內(nèi)容在本書所剩無己,不超過3章,而且都進行了大幅修訂。書的意圖、精神和許多啟發(fā)并沒有改變。在該書問世后的十年里,我在軟件設(shè)計和開發(fā)方面學(xué)到了很多。本書反映了我學(xué)到的東西。
這是怎樣的十年!該書是在互聯(lián)網(wǎng)時代之前出版的;ヂ(lián)網(wǎng)問世后,需要掌握的縮寫詞數(shù)量大增。我們現(xiàn)在有了EJB、RMI、J2EE、XML、XSLT、HTML、ASP、JSP、ZOPE、SOAP、C#和.NET,另外還有設(shè)計模式、Java、Servelets和Application Servers;旧希贡緯姓鹿(jié)的內(nèi)容保持是很難的。
本書和Booch的關(guān)系
1997年,Grady Booch(Grady Booch是統(tǒng)一建模語言(UML)的締造者之一)邀請我?guī)兔懰潜敬螳@成功的Object-Oriented Analysis and Design with Applications一書的第3版。我以前和Grady在一些項目上合作過,是其許多作品(包括UML)的熱心讀者和內(nèi)容貢獻者。所以,我高興地接受了邀請,并請我的好友Jim Newkirk共同參與。
接下來的兩年,我和Jim為Booch寫了許多章節(jié),花在本書上的精力自然就少了。但是,我覺得Booch的書值得投入。另外,當(dāng)時還在想本書反正只是第2版,所以并不是特別上心。如果我要寫一些有份量的內(nèi)容,我會寫一些新的、不一樣的。
遺憾的是,Booch的書難產(chǎn)了。本來就很難在正常時間寫書,在互聯(lián)網(wǎng)泡沫的那段時間更是不太可能。Grady在Rational Software的工作更忙了,同時還忙于像Catapulse這樣的風(fēng)投企業(yè)。所以,項目陷入停頓。終,我問Grady和Addison-Wesley出版社能不能把我和Jim寫的章節(jié)放到本書。他們慷慨地同意了。本書的幾個案例分析和UML章節(jié)就是這么來的。
極限編程的影響
1998年末,極限編程(XP)嶄露頭角,挑戰(zhàn)我們對于軟件開發(fā)的傳統(tǒng)觀念。是應(yīng)該在寫任何代碼之前創(chuàng)建大量UML圖,還是避免一切形式的圖,直接寫大量代碼?是應(yīng)該寫許多說明性的文檔來描述設(shè)計,還是使代碼更具說明性,從而無需輔助文檔?要結(jié)對寫程序嗎?寫生產(chǎn)代碼前要先寫好測試代碼嗎?我們到底應(yīng)該怎么做?
這個變革來得恰是時候。20世紀(jì)90年代中期,Object Mentor幫助許多公司解決OO(面向?qū)ο?設(shè)計和項目管理問題。我們幫這些公司完成其項目。在這個過程中,我們向團隊灌輸了自己的態(tài)度與實踐。遺憾的是,這些東西沒有形成書面記錄。相反,只是從口頭上傳達給了客戶。
1998年,我意識到需要把我們的過程和實踐記錄下來,以便更好地向客戶傳達。所以我在C Report上寫了許多關(guān)于這一過程的文章(有4篇文章。前三篇是Iterative and Incremental Development(I, II, III)。后一篇是C.O.D.E Culled Object Development process)。但是,這些文章沒有達到目標(biāo)。信息量大,有時還十分有趣,但它們沒有將我們在項目中采用的實踐和態(tài)度整理成文,面是對數(shù)十年來我形成的價值觀的一種無意識的折衷。后是Kent Beck提醒了我。
本書和Kent的關(guān)系
1998年末,正當(dāng)我為Object Mentor過程的整理而煩惱時,Kent和Beck在極限編程(XP)方面的成果讓我眼前一亮。這些成果散見于Ward Cunningham(沃德·坎寧安,Wiki概念的發(fā)明者,設(shè)計模式和敏捷軟件方法的先驅(qū)之一)的wiki(http://c2.com/cgi/wiki包含涉及廣泛主題的大量文章。有數(shù)百上千的作者。有人說,也就Ward Cunningham才能用幾行Perl代碼發(fā)起一次社會革命),和其他許多人的作品混在一起。盡管如此,作為一個有心人,我還是掌握了Kent的要點。感興趣的同時,我也有了一些疑慮。極限編程的某些東西契合我的開發(fā)過程目標(biāo)。但另一些東西,比如缺乏一個明確的設(shè)計階段,卻讓我疑惑。
我和Kent處于截然不同的軟件環(huán)境。他是公認(rèn)的Smalltalk顧問,我是公認(rèn)的C 顧問。這兩個世界相互很難溝通,存在像庫恩范式(1995年到2001年任何可靠的學(xué)術(shù)著作采用的都肯定是庫恩(Kuhnian)一詞。它是指托馬斯·庫恩(Thomas S. Kuhn)所著的《科學(xué)革命的結(jié)構(gòu)》一書(芝加哥大學(xué)出版社1962年出版)。庫恩認(rèn)為科學(xué)不是通過新知識的線性積累進步,而是經(jīng)歷周期性的革命,稱范式轉(zhuǎn)移。)那么大的鴻溝。
其他時候我絕不會邀請Kent為C Report撰稿。但是,由于我們對于過程的看法取得了一致,所以語言的鴻溝不再重要。1999年2月,我在慕尼黑的OOP大會上見到了Kent。我當(dāng)時在講OOD的原則,他就在對面的房間里講XP。由于沒法聽到他的演講,我在午餐時找到了Kent。我們討論了XP,我提出了讓他為C Report撰稿的請求。這是一篇很棒的文章,討論了Kent如何和一名同事花一小時左右的時間在某個live system中進行一次全面的設(shè)計更改。
接著幾個月,我慢慢梳理出了自己對XP的憂慮。擔(dān)心的是如何采納一個沒有明顯前期設(shè)計階段的過程。感覺自己好像卡在了這里。對于我的客戶及其整個行業(yè),我難道不應(yīng)該告訴他們值得花時間在設(shè)計上嗎?
后,我終于意識到自己都沒有真正注重過這樣的一個階段。即使在我寫的關(guān)于設(shè)計、Booch圖和UML圖的所有文章和書里,都總是將代碼作為驗證圖是否有意義的一種方式來使用。在我的所有客戶咨詢中,我會花一兩個小時幫客戶畫圖,再指導(dǎo)他們通過代碼來利用這些圖。我意識到雖然XP關(guān)于設(shè)計的說法有點陌生,有點庫恩(如果在文章中兩次提到庫恩的話,論文的可信度更高),但其背后的實踐我本來就熟悉。
我對XP的其他擔(dān)心較容易解決。我私底下一直擁護結(jié)對編程。XP使我能光明正大地和伙伴一起編程。重構(gòu)、持續(xù)集成、在客戶現(xiàn)場工作……所有這些對我來說都很容易接受。它們很接近我向客戶建議的工作方式。
XP的一個實踐對我來說是新的發(fā)現(xiàn)。次聽說測試驅(qū)動開發(fā)(Test-driven development,TDD)(Kent Beck著,中文版《實戰(zhàn)測試驅(qū)動開發(fā)》)時可能感覺沒什么:寫生產(chǎn)代碼前先寫好測試用例,寫所有生產(chǎn)代碼的目的都是使失敗的測試用例通過測試。但是,我對這種開發(fā)模式所帶來的深遠(yuǎn)影響始料未及。該實踐徹底改變了我寫軟件的方式:變得更好了。
所以,1999年秋,我確信 Object Mentor 應(yīng)采納 XP 作為其選擇的過程,并且我應(yīng)該放棄寫自己的過程的想法。Kent已經(jīng)很好地歸納了XP的實踐與過程,我的小小嘗試與之相比不值一提。
.NET
各大企業(yè)正在進行一場戰(zhàn)爭,目的是爭取你的效忠。它們認(rèn)為,只要擁有了語言,就擁有了程序員以及雇用這些程序員的公司。
這場戰(zhàn)爭的個爭奪點是Java。Java是個由大公司為贏得程序員關(guān)注而創(chuàng)建的語言,并取得了極大成功。Java在軟件社區(qū)深得人心,基本上是現(xiàn)代多層IT應(yīng)用程序的事實上的標(biāo)準(zhǔn)。
相應(yīng)的一個還擊來自IBM,它通過Eclipse開發(fā)環(huán)境奪走了很大一塊Java市場。Microsoft技術(shù)精湛的開發(fā)人員也不甘落后,他們提供了常規(guī)意義上的.NET和為特殊的C#。
令人驚訝的是,Java和C#很難區(qū)分。兩種語言語義一致,語法也相似,以至于許多代碼段沒有差別。雖然Microsoft在技術(shù)創(chuàng)新上差點意思,但它趕超別人并取得終勝利的能力還是相當(dāng)不錯的。
本書版采用Java和C 作為編碼語言。本書則完全采用C#和.NET平臺。不要把這當(dāng)成是背書。這場戰(zhàn)爭我們不選邊站。事實上,大公司為爭奪程序員的關(guān)注而發(fā)起的戰(zhàn)爭沒有太大意義。未來幾年一旦出現(xiàn)更好的語言,程序員的心思立即就會發(fā)生轉(zhuǎn)移。
本書之所以出.NET版,自然是為了方便.NET讀者。雖然書中的原則、模式與實踐和語言無關(guān),但案例分析不是。.NET程序員看.NET的案例分析更舒服,Java程序員看Java的例子更愉快。
魔鬼就在細(xì)節(jié)里
本書包含大量.NET代碼。希望你能仔細(xì)讀代碼,因為代碼在很大程度上就是本書的重點。代碼具現(xiàn)了本書要表達的意思。
本書采用固定寫作模式:大小不一的一系列案例分析。有的非常小,有的則需要用幾章來講解。每個案例分析都有一些前置材料,描述了該案例分析要用到的面向?qū)ο笤O(shè)計原則和模式。
本書首先討論開發(fā)實踐和過程,其中穿插了許多小的案例分析和例子。然后開始討論設(shè)計和設(shè)計原則,接著討論一些設(shè)計模式,對包進行管控的更多設(shè)計原則,以及更多模式。所有這些主題都伴隨有相應(yīng)的案例分析。
所以,要做好讀一些代碼和研究一些UML圖的準(zhǔn)備。本書技術(shù)性很強,它要傳授的經(jīng)驗教訓(xùn)如同惡魔一樣隱藏在細(xì)節(jié)里(細(xì)節(jié)決定成敗)。
本書的結(jié)構(gòu)
本書包含4部分38章和2個附錄。
第Ⅰ部分:敏捷開發(fā)。本部分描述敏捷開發(fā)的概念。首先展示敏捷聯(lián)盟宣言,概述了極限編程(XP),然后通過許多小的案例分析來闡述一些單獨的XP實踐,尤其是對設(shè)計和代碼編碼方式有影響的那些。
第Ⅱ部分:敏捷設(shè)計。本部分討論面向?qū)ο筌浖O(shè)計,包括它的定義,對復(fù)雜性進行管理的問題和技術(shù),以及面向?qū)ο箢愒O(shè)計的原則。本部分后用幾章描述了UML的一個實用子集。
第Ⅲ部分:案例學(xué)習(xí):Payroll系統(tǒng)。本部分描述面向?qū)ο笤O(shè)計和一個簡單的批處理Payroll系統(tǒng)的C 實現(xiàn)。前幾章描述本案例分析遇到的設(shè)計模式。后一章是完整的案例分析,是本書和完整的一個。
第Ⅳ部分:案例學(xué)習(xí):打包Payroll系統(tǒng)。本部分首先描述面向?qū)ο蟀O(shè)計的原則,然后通過增量打包上一部分的類來演示這些原則。后幾章描述了Payroll應(yīng)用程序的數(shù)據(jù)庫和UI設(shè)計。
附錄A:兩家公司的諷刺故事
附錄B:Jack Reeves的什么是軟件一文。
如何使用本書
如果你是開發(fā)人員,請將本書從頭讀到尾。本書主要為開發(fā)人員而寫,包含以敏捷方式開發(fā)軟件所需的資訊。先學(xué)習(xí)實踐,然后是原則,然后是模式,然后是把所有這些結(jié)合起來的案例分析。整合所有這些知識將有助于你完成項目。
如果你是管理人員或業(yè)務(wù)分析師,請閱讀第Ⅰ部分敏捷開發(fā)。第1章~第6章深入討論了敏捷原則和實踐,從需求到計劃,再到測試、重構(gòu)和編程。本部分將指導(dǎo)你建立團隊和管理項目。
如果想學(xué)習(xí)UML,請先閱讀第13章~第19章,然后閱讀第Ⅲ部分案例學(xué)習(xí):薪水支付系統(tǒng)Payroll的全部章節(jié)。這將幫助你在UML的語法和使用方面打下良好基礎(chǔ),同時幫助你在UML和C#之間轉(zhuǎn)換。
如果想學(xué)習(xí)設(shè)計模式,請閱讀第Ⅱ部分敏捷設(shè)計,從而先學(xué)習(xí)設(shè)計原則。然后閱讀第Ⅲ部分案例學(xué)習(xí):薪水支付系統(tǒng)Payroll和第Ⅳ部分案例學(xué)習(xí):打包Payroll系統(tǒng)。它們定義了所有模式,并展示了它們在典型情況下的使用。
如果想學(xué)習(xí)面向?qū)ο笤O(shè)計原則,請閱讀第Ⅱ部分敏捷設(shè)計和第Ⅲ部分案例學(xué)習(xí):薪水支付系統(tǒng)Payroll和第Ⅳ部分案例學(xué)習(xí):打包Payroll系統(tǒng)。它們描述了面向?qū)ο笤O(shè)計原則并展示了如何使用它們。
如果想學(xué)習(xí)敏捷開發(fā)方法,請閱讀第Ⅰ部分敏捷開發(fā)。本部分描述了敏捷開發(fā)的需求、計劃、測試、重構(gòu)和編程。
如果想找樂子,請閱讀附錄A兩家公司的諷刺故事。
羅伯特·C.馬丁
(Robert C. Martin)
業(yè)內(nèi)人士尊稱的鮑勃大叔(Uncle Bob),是國際知名的軟件工程師和導(dǎo)師,一位有五十多年健康編碼經(jīng)驗的程序員。cleancoders.com聯(lián)合創(chuàng)始人和UncleBob咨詢公司創(chuàng)始人,主要提供軟件咨詢、技能培訓(xùn)和視頻教學(xué)服務(wù)。
他在專業(yè)技術(shù)領(lǐng)域具有較深的造詣。除了擔(dān)任C Report雜志的總編輯,他還發(fā)表了大量有影響力的文章,受邀在許多國際性軟件大會上發(fā)表演講。他是SOLID五大原則的奠基人,是《敏捷宣言》聯(lián)合簽署人并擔(dān)任過敏捷聯(lián)盟屆主席。他擅長的主題有軟件匠藝、敏捷軟件開發(fā)和測試驅(qū)動開發(fā)等。
馬丁是個終生學(xué)習(xí)者,52年出生的他,還在考飛行駕照。
米咖·馬丁
(Micah Martin)
軟件工程師、咨詢顧問、培訓(xùn)師,擅長的領(lǐng)域有面向?qū)ο笤O(shè)計原則與模式、敏捷軟件開發(fā)實踐。他是開源項目FitNesse項目的創(chuàng)始人和開發(fā)總監(jiān)。他著述頗豐,同時也是很多軟件大會的演講嘉賓。
詳細(xì)目錄
第Ⅰ部分 敏捷開發(fā)
第1章 敏捷實踐 002
敏捷聯(lián)盟 003
個人和互動優(yōu)先于過程和工具 004
可以工作的軟件優(yōu)先于詳盡的文檔 004
客戶合作優(yōu)先于合同談判 005
應(yīng)對變化優(yōu)先于遵循計劃 006
原則 007
小結(jié) 009
參考文獻 010
第2章 極限編程概述 011
極限編程實踐 011
完整的團隊 011
用戶故事 012
短的周期 012
驗收測試 013
結(jié)對編程 014
測試驅(qū)動開發(fā) 015
集體所有權(quán) 015
持續(xù)集成 016
可持續(xù)的開發(fā)速度 016
開放的工作空間 017
規(guī)劃游戲 017
簡單設(shè)計 018
重構(gòu) 019
隱喻 019
小結(jié) 020
參考文獻 021
第3章 計劃 022
初探 023
技術(shù)預(yù)研、故事拆分和速率 023
發(fā)布計劃 024
迭代計劃 024
定義完成 025
任務(wù)計劃 025
迭代 027
跟蹤 027
小結(jié) 028
參考文獻 029
第4章 測試 030
測試驅(qū)動開發(fā) 030
驗收測試 035
意外獲得的架構(gòu) 037
小結(jié) 037
參考文獻 038
第5章 重構(gòu) 039
素數(shù)產(chǎn)生程序:一個簡單的重構(gòu)示例 040
重構(gòu) 043
后檢查 049
小結(jié) 053
參考文獻 054
第6章 一次編程實踐 055
保齡球比賽 056
小結(jié) 106
保齡球規(guī)則概述 107
第Ⅱ部分 敏捷設(shè)計
臭味和原則 110
參考文獻 110
第7章 什么是敏捷設(shè)計 111
設(shè)計臭味 112
設(shè)計的臭味:軟件腐化的氣味 112
僵化 113
脆弱 113
頑固 113
粘滯 114
不必要的復(fù)雜 114
不必要的重復(fù) 114
晦澀 115
為什么軟件會腐化 115
Copy程序 116
一個熟悉的場景 116
Copy程序的敏捷設(shè)計 120
小結(jié) 122
參考文獻 123
第8章 單一職責(zé)原則(SRP) 124
定義職責(zé) 126
分離耦合的職責(zé) 127
持久化 128
小結(jié) 128
參考文獻 129
第9章 開/關(guān)原則(OCP) 130
描述 131
Shape應(yīng)用程序 133
違反OCP 133
遵循OCP 136
預(yù)測變化和貼切的結(jié)構(gòu) 138
放置鉤子 139
使用抽象獲得顯式封閉性 140
使用數(shù)據(jù)驅(qū)動的方法獲取
封閉性 141
小結(jié) 142
參考文獻 143
第10章 里氏替換原則(LSP) 144
違反LSP的情形 145
更微妙的違反情形 147
一個實際的例子 154
用提取公共部分的方法代替繼承 158
啟發(fā)式規(guī)則和習(xí)慣用法 162
小結(jié) 162
參考文獻 163
第11章 依賴倒置原則(DIP) 164
層次化 165
倒置的接口所有權(quán) 166
依賴于抽象 167
一個簡單的DIP例子 168
找出底層抽象 169
熔爐示例 171
小結(jié) 172
參考文獻 173
第12章 接口隔離原則(ISP) 174
接口污染 174
分離客戶端就是分離接口 176
類接口和對象接口 177
通過委托來分離接口 178
使用多重繼承隔離接口 179
ATM 用戶界面的例子 180
小結(jié) 187
參考文獻 187
第13章 C#程序員UML概述(C#語言) 188
類圖 191
對象圖 193
順序圖 193
協(xié)作圖 194
狀態(tài)圖 195
小結(jié) 196
參考文獻 196
第14章 使用UML 197
為什么建模 197
為什么要建軟件模型 198
寫代碼之前是否應(yīng)該做好詳細(xì)設(shè)計 198
有效使用UML 199
與他人交流 199
脈絡(luò)圖 201
項目結(jié)束文檔 202
要保留的和要丟棄的 203
迭代式改進 204
行為優(yōu)先 204
檢查結(jié)構(gòu) 206
想象代碼 208
圖示的演化 209
何時以及如何繪制圖示 210
何時要畫圖,何時不要畫圖 210
CASE工具 211
那么,文檔呢 212
小結(jié) 212
第15章 狀態(tài)圖 214
基礎(chǔ)知識 214
特定事件 216
超狀態(tài) 217
初始偽狀態(tài)和結(jié)束偽狀態(tài) 218
使用FSM圖示 219
小結(jié) 220
第16章 對象圖 221
即時快照 221
主動對象 223
小結(jié) 227
第17章 用例 228
寫用例 229
備選流程 230
其他東西呢 230
用例圖 231
小結(jié) 232
參考文獻 232
第18章 順序圖 233
基礎(chǔ)知識 234
對象、生命線、消息及其他 234
創(chuàng)建和析構(gòu) 235
簡單循環(huán) 236
時機和場合 237
高級概念 240
循環(huán)和條件 240
耗費時間的消息 241
異步消息 243
多線程 248
主動對象 249
向接口發(fā)送消息 250
小結(jié) 251
第19章 類圖 252
基礎(chǔ)知識 253
類 253
關(guān)聯(lián) 253
繼承 254
類圖示例 255
細(xì)節(jié) 258
類的衍型 258
抽象類 259
屬性 260
聚合 260
組合 261
多重性 263
關(guān)聯(lián)衍型 263
嵌套類 264
關(guān)聯(lián)類 265
關(guān)聯(lián)修飾符 266
小結(jié) 266
參考文獻 266
第20章 咖啡的啟示 267
Mark IV型專用咖啡機 267
規(guī)格說明書 268
常見的丑陋方案 271
虛構(gòu)的抽象 273
改進方案 275
實現(xiàn)抽象模型 279
這個設(shè)計的好處 295
面向?qū)ο筮^度設(shè)計 303
參考文獻 304
第21章 命令模式和主動對象模式 310
簡單的命令模式 311
事務(wù)操作 313
實體上的解耦和時間上的解耦 314
時間上的解耦 315
UNDO()方法 315
主動對象模式 316
小結(jié) 322
參考文獻 322
第22章 模板方法模式和策略模式:繼承和委托 323
模板方法模式 324
模式濫用 327
冒泡排序 328
策略模式 332
小結(jié) 338
參考文獻 338
第23章 外觀模式和中介者模式 339
外觀模式 339
中介者模式 340
小結(jié) 343
參考文獻 343
第24章 單例模式和單狀態(tài)模式 344
單例模式 345
好處 347
代價 347
單例模式實戰(zhàn) 348
單狀態(tài)模式 350
好處 351
代價 352
單狀態(tài)模式實戰(zhàn) 352
小結(jié) 358
參考文獻 359
第25章 空對象模式 360
描述 360
小結(jié) 363
參考文獻 364
第26章 案例學(xué)習(xí):Payroll系統(tǒng)的輪迭代 365
規(guī)格說明書 366
基于用例進行分析 367
添加新員工 368
刪除員工 369
提交考勤卡 370
提交銷售憑證 370
提交工會服務(wù)費 371
更改員工信息 372
薪水支付日 374
反思:我們從中學(xué)到了什么 376
薪水支付類別抽象 376
支付薪水時間表抽象 377
第Ⅲ部分 案例學(xué)習(xí):薪水支付系統(tǒng)Payroll
支付方式 378
工會所屬關(guān)系 378
小結(jié) 379
參考文獻 380
第27章 案例學(xué)習(xí):Payroll系統(tǒng)
實現(xiàn) 381
事務(wù) 381
添加員工 382
Payoll系統(tǒng)的數(shù)據(jù)庫 384
刪除雇員 388
考勤卡、銷售憑證和服務(wù)費用 390
更改員工信息 399
更改員工類別 403
我犯了什么暈? 409
支付員工薪水 413
我們是否希望開發(fā)人員來做商業(yè)決策? 415
按月薪結(jié)算的員工支付薪水 415
支付小時工的薪水 418
主程序 431
數(shù)據(jù)庫 432
小結(jié) 433
關(guān)于本章 433
參考文獻 434
第Ⅳ部分 案例學(xué)習(xí):打包Payroll系統(tǒng)
第28章 包和組件的設(shè)計原則 436
包和組件 436
組件的內(nèi)聚性原則:粒度 437
重用-發(fā)布等價原則(REP) 438
共同重用原則(CRP) 439
共同封閉原則(CCP) 440
組件內(nèi)聚性小結(jié) 441
組件耦合原則:穩(wěn)定性 441
無環(huán)依賴原則(ADP) 441
穩(wěn)定依賴原則(SDP) 447
穩(wěn)定抽象原則(SAP) 452
小結(jié) 456
第29章 工廠模式 457
依賴問題 460
靜態(tài)類型與動態(tài)類型 461
可替換的工廠 462
對測試支架使用對象工廠 463
工廠模式的重要性 465
小結(jié) 465
參考文獻 465
第30章 案例學(xué)習(xí):Payroll系統(tǒng)的包分析 466
組件結(jié)構(gòu)和符號 467
應(yīng)用共同封閉原則(CCP) 469
應(yīng)用發(fā)布等價原則(REP) 471
耦合和封裝 474
度量指標(biāo) 475
在薪水支付系統(tǒng)中使用這些度量 477
對象工廠 479
重新思考內(nèi)聚的邊界 483
終的包結(jié)構(gòu) 483
小結(jié) 485
參考文獻 485
第31章 組合模式 487
組合命令 489
多重性還是非多重性 490
小結(jié) 490
第32章 觀察者模式 491
數(shù)字時鐘 492
觀察者模式 512
模型 513
觀察者模式與面向?qū)ο笤O(shè)計原則 514
小結(jié) 514
參考文獻 515
第33章 抽象服務(wù)器、適配器和橋接模式 516
抽象服務(wù)器模式 517
適配器模式 518
類形式的適配器 519
調(diào)制解調(diào)器問題、適配器和里氏替換原則 520
橋接模式 524
小結(jié) 527
參考文獻 527
第34章 代理模式和TDG模式:管理第三方API 528
代理模式 529
代理購物車應(yīng)用 534
小結(jié) 550
處理數(shù)據(jù)庫、中間件以及其他第三方
接口 550
TDG模式 553
測試和內(nèi)存TDG 561
測試DbGateway 562
小結(jié) 568
參考文獻 568
第35章 訪問者模式 569
訪問者模式 570
非循環(huán)訪問者模式 575
使用訪問者模式 581
訪問者模式的其他用途 589
裝飾者模式 589
擴展對象模式 596
小結(jié) 610
參考文獻 610
第36章 狀態(tài)模式 611
嵌套語句switch/case 612
內(nèi)部作用域內(nèi)有效的狀態(tài)變量 615
測試動作 616
代價和好處 616
遷移表 617
使用表解釋 618
代價和收益 619
狀態(tài)模式 620
狀態(tài)模式和策略模式 624
使用狀態(tài)模式的代價和好處 624
SMC(狀態(tài)機編譯器) 625
SMC生成的Turnstile.cs以及其他
支持文件 628
代價和收益 634
狀態(tài)機的應(yīng)用場合 634
作為 GUI 中的高層應(yīng)用策略 634
GUI 交互控制器 636
分布式處理 637
小結(jié) 638
參考文獻 639
第37章 案例學(xué)習(xí):Payroll系統(tǒng)的數(shù)據(jù)庫 640
建立數(shù)據(jù)庫 641
代碼設(shè)計中的一個缺陷 642
增加雇員 644
事務(wù) 658
加載Employee對象 665
還有什么工作? 680
第38章 案例學(xué)習(xí):Payroll系統(tǒng)的用戶界面 681
界面 683
實現(xiàn) 684
構(gòu)建窗口 696
Payroll的窗口 705
真面目 720
小結(jié) 720
參考 721
Rupert:Alpha項目 722
附錄A 兩家公司的諷刺故事 722
附錄B 源碼即設(shè)計 739