設計模式只是一把錘子

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"談起《設計模式》,那是幾乎無人不知,無人不曉,大名鼎鼎的GoF的驚世之作,真是“平生不識GoF,學盡設計也枉然”!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然而,設計模式真的是軟件設計的“瑞士軍刀”,切、削、鋸、鑽樣樣精通嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"讀過《設計模式》的讀者估計不少,但真正注意過《設計模式》的副標題的估計很少,而這個副標題卻是避免誤解設計模式的關鍵。《設計模式》的副標題是:可複用面向對象軟件的基礎!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不要小看了這短短的一句話,如果你沒有看這句話,或者只是一掃而過並沒有仔細體會,那麼你很可能就認爲設計模式是一把“瑞士軍刀”,能夠解決所有的設計問題;而實際上“設計模式只是一把錘子”,有句諺語叫作“如果你手裏有一把錘子,那麼所有的問題都變成了釘子”,如果你拿着設計模式這把錘子到處去敲,要麼東西被敲壞,要麼就不起作用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲什麼說設計模式只是一把錘子呢?我們還是從副標題來看。《設計模式》的副標題揭示了設計模式的兩個主要約束。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"設計模式解決的是“可複用”的設計問題;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"設計模式應用的領域是“面向對象”。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"相信經過我這麼一提醒,大家基本上都能夠明白了爲什麼說“設計模式只是一把錘子”了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"設計模式只能解決“可複用”的設計問題,其他的例如性能設計、可靠性設計、安全性設計、可服務性設計等都不是設計模式能夠解決的;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"設計模式只是在面向對象的語言中應用,如果是非面向對象的語言,那麼就不怎麼好用了。當然,你可以在C語言中應用設計模式,但畢竟要有不少折騰,用起來也不那麼得心應手。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以,當你遇到一個問題就想到設計模式的時候,一定要注意“設計模式只是一把錘子”,不要拿着這把錘子到處去敲!"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"知易行難—設計模式應用的問題"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"形而上者謂之道,形而下者謂之器。—《易經·繫辭》"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正如很多流行的技術(面向對象、UML等)一樣,幾乎大部分人都會宣稱自己“掌握”“熟練掌握”,甚至“精通”,然而,真正掌握或者精通的人實在是少之又少。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一個典型的現象是:很多人能夠熟練背誦出所有的設計模式,能夠快速畫出各種設計模式的UML類圖,也能夠熟練地寫出《設計模式》一書中各個模式的樣例代碼。但一到實際的項目設計和開發的時候,往往都會陷入迷茫:要麼無從下手,不知道哪個地方要用設計模式;要麼生搬硬套,胡亂使用設計模式,將方案和代碼搞得一團亂麻。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是什麼原因呢?難道是設計模式不好用,或者設計模式根本就是一個噱頭?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"答案不在於設計模式本身是否有用,而是在於我們沒有掌握正確的學習和應用設計模式的方法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"學習《設計模式》一書中的23個設計模式,只是掌握了設計模式的“器”,但並沒有掌握設計模式的“道”。就像一個工匠,鋸、鑽、錘、刨樣樣精通,但如果不知道在什麼地方該用鋸,在什麼地方該用鑽,那麼他肯定是一個不合格的工匠。爲了能夠更好地學習和應用設計模式,我們也需要掌握設計模式的“道”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"設計模式的“道”就是用來指導我們什麼時候用設計模式,爲什麼要用設計模式,23個設計模式只是告訴了我們How,而設計模式之道卻可以告訴我們Why和Where!"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"撥雲見日—尋找設計模式之道"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"熟悉《設計模式》一書內容的讀者可能會想到:在《設計模式》中,不是每個模式都有“適用性”的說明嗎?這個其實就是回答了Where和Why的問題啊!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如,Facade模式的“適用性”說明如下(摘自《設計模式》中文版)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在遇到以下情況時使用Facade模式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當你要爲一個複雜子系統提供一個簡單接口時,子系統往往因爲不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類,這使得子系統更具可重用性,也更容易對子系統進行定製。但這也給那些不需要定製子系統的用戶帶來一些使用上的困難。Facade可以提供一個簡單的默認視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過Facade層。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"客戶程序與抽象類的實現部分之間存在着很大的依賴性,引入Facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當你需要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,則可以讓它們僅通過Facade進行通信,從而簡化了它們之間的依賴關係。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上面這段文字,看起來回答了Where和Why的問題,但實際上我個人感覺作用並不大。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先,這段描述太長了:上面這段文字是否花了你幾分鐘的時間去閱讀和理解?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其次,這段描述比較抽象:什麼是複雜,什麼叫作簡單,什麼叫作很大依賴性……可能每個人的理解都不一樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,23個模式,所有的“適應性”條款加起來估計有幾十條,你能夠記住嗎?即使能夠全部記住,你能夠全部理解嗎?即使能夠全部理解,當你面對一個具體問題的時候,你知道幾十條裏面哪一條適應你的情況嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以,《設計模式》一書中關於“適用性”的描述,實際上還是太複雜、太多了,不具備很強的實踐指導意義和可操作性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們需要的是一個更簡單的指導思想,“大道至簡”,最好是一兩句話就能夠描述清楚!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"幸運的是,答案竟然就在《設計模式》一書中,但這個答案並不是那麼明顯!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"《設計模式》一書內容的側重點是23個模式的詳細闡述,大部分人可能都是直奔主題,逐一去研究每個模式,而對於本書開頭部分第1章和第2章的內容並沒有詳細研讀和思考,或者對於這兩章只是簡單地瀏覽,並未認真領會和思考,由此錯過了最重要的內容。再加上GoF在這兩章的內容中,既要引入一個全新的概念,又要提綱挈領地介紹各個模式,還要引入實例進行分析,以至於大量的內容反而將真正核心的內容給淹沒或者沖淡了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"設計模式之道就隱藏在“2.6.2封裝實現依賴關係”的最後一段,很簡單的一句話:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"對變化的概念進行封裝(encapsulate the concept that varies)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你看到這句話可能有點失望,前面分析了那麼久,賣了那麼多的關子,結果就這麼簡簡單單一句話,這不是在忽悠嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你可千萬別小看了這句話,“大道至簡”,設計模式之道也不例外,但“簡”並不意味着沒用;相反,正因爲其“簡”,每個人的理解才一致,也更好掌握,在實踐中才更好應用。正所謂:“真傳一句話,假傳萬卷書”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"GoF在《設計模式》一書中最早提出這個原則,後來不斷地有其他專家進行闡述,其中《設計模式精解》("},{"type":"text","marks":[{"type":"italic"}],"text":"Design Pattern Explained"},{"type":"text","text":")一書的闡述我認爲是最精闢的:Find what varies and encapsulate it。翻譯一下即“找到變化,封裝變化”。雖然含義和GoF描述的基本一致,但其更加容易理解。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正所謂:踏破鐵鞋無覓處,得來全不費工夫!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"庖丁解牛—解析設計模式之道"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在,讓我們來深入理解“找到變化,封裝變化”的設計模式之道。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"首先,“找到變化”解決了“在哪裏”使用設計模式的問題,即回答了“where”的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“找到變化”看起來是比較抽象的一句話,但在實踐中非常好應用和操作,而且不同領域、不同行業的系統都可以完美地應用這句話。雖然不同領域、不同行業變化的因素、方式、時機等都不一樣,但每個領域或者行業的需求分析人員、設計人員,對自己所處行業和領域的可能變化肯定是有比較深刻的理解的,什麼會變化、會如何變化、什麼時候會變化……肯定都能夠自己判斷,這種判斷並不需要高深的技巧和知識水平,只需要一定的經驗積累。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果我們剛接觸一個行業或者領域,經驗積累不夠,那麼怎麼辦呢?是否就無法“找到變化”了?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其實也不然,有一個萬能的辦法,只是要花費更多的精力了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這個萬能的辦法就是“唯一不變的是變化本身”,也就是說,如果你不知道什麼會變化,那麼就抱着懷疑一切的想法,一切都可能是變化的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但光有這條指導原則還不行,如果我們真的抱着“一切都是可能變化的”的想法,然後封裝一切變化,那麼就會陷入變化的旋渦中無法自拔,因爲變化是會遞歸的,A可能變成B,B也可能繼續變化,於是這樣無窮無盡,系統是不可能做出來的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所以我們需要一個終止條件,避免陷入無窮無盡的變化遞歸旋渦中。這個終止條件就是“有限時間內可能發生的變化”。這裏的“有限時間”隨行業和領域的不同而變化。例如(以下時間僅供參考):"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"互聯網行業可以說,半年內可能發生的變化……"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"電信行業可以說,1年內可能發生的變化……"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"金融行業可以說,2年內可能發生的變化……"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"政府行業可以說,3年內可能發生的變化……"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有了這個指導原則後,你可以這樣去問有經驗的前輩、“大牛”等:XXX在1年內會發生變化嗎?會怎樣變化?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"就這樣,即使你是“菜鳥”,通過這麼一招“借花獻佛”,也能夠輕鬆發現“變化”的地方。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"其次,“封裝變化”解決了“爲什麼”使用設計模式的問題,即回答了“Why”的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲什麼我們要用設計模式?是因爲我們要封裝變化!但我們爲什麼要封裝變化呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"答案很明顯:變化不好!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然這個“不好”不是從業務的角度來說的,而是從系統的角度來說的。從業務的角度來說,“變化”是好的,變化意味着新的機會;但從系統的角度來說,變化並不好,因爲變化必然要求系統改動,改動就意味着風險!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然變化給系統帶來風險,但我們不能因此而“拒絕變化”,因爲拒絕變化就意味着失去了機會。簡單來說,賺不到錢的系統,設計再優美,功能再強大,系統再穩定,也不過是一堆無用的擺設:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"客戶給你提了新需求,你不做,能拿到合同嗎……"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"行業正在興起新的流行功能,你不做,你的系統有人用嗎……"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一項創新帶來了新的機遇,你不做,能搶佔市場嗎……"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此,我們要“擁抱變化”,但又不能讓變化帶來太大的風險,所以就提出了“封裝變化”。“封裝變化”意味着將變化的影響範圍控制到最小,將風險降到最低。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們來看看變化會帶來哪些問題和風險。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"開發人員需要編碼以適應變化,設計不好的方案將導致大量的編碼工作量、自測工作量;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"測試人員不單要測試因變化而新增的部分,還要測試受影響的部分,設計不好的方案,牽一髮而動全身,導致測試工作量大大增加;"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果爲了適應某個變化而對系統做了比較大的改動,則系統的質量風險將上升,很可能導致上線失敗,或者上線後出現各種問題。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此,我們要儘量減少變化帶來的工作量和風險,而減少的最有效方法就是將變化的影響範圍縮小,即將變化封裝起來,使其只在有限的範圍內有影響。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"舉一反三—活學活用設計模式之道"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"就像一個武林高手有了深厚的內功,天下萬物皆可成爲手中的利器,而不必拘泥於具體的武器和招數一樣,掌握了設計模式之道後,我們其實也完全可以不拘泥於只使用《設計模式》一書中的23個設計模式,可以根據需要選擇最合適的方案。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如:"}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不同的業務有不同的規則排列組合,規則引擎可以封裝各種變化的規則……"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"類之間的依賴是變化的,Spring使用XML配置文件來封裝這種變化……"}]}]},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個銀行的卡都不一樣,銀聯封裝了這種變化,使得不同銀行可以互通……"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"總之,你可以使用類和設計模式來封裝變化,也可以使用配置文件和模塊來封裝變化,還可以使用一個系統來封裝變化……"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文節選自《"},{"type":"text","marks":[{"type":"strong"}],"text":"編程的邏輯:如何用面向對象方法實現複雜業務需求"},{"type":"text","text":"》一書"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"李運華著"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"電子工業出版社出版"}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/7c/7c038656fb996af2893febbf78b86c92.jpeg","alt":null,"title":"","style":[{"key":"width","value":"50%"},{"key":"bordertype","value":"none"}],"href":"https://u.jd.com/8HJfpn","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"編輯推薦"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1)面向對象基礎"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過對面向對象相關的歷史、發展、與面向過程的對比等相關背景知識的介紹,讓讀者對面向對象有一個更完整的認識;並深入的闡述了面向對象的各種概念,讓讀者“知其然並知其所以然”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2)面向對象方法"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過一個實例,完整的介紹面向對象相關技術如何在軟件開發流程中落地,整個面向對象的開發流程一環扣一環,步步爲營,讓讀者避免“拍腦袋”、“頭腦風暴”式的開發方式"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3)面向對象技巧"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對“內聚耦合”、“設計模式”、“設計原則”、“UML”等最常見的面向對象技術進行了深入和別具一格的闡述,讓讀者不但知道“What”(是什麼),還能知道“Why”(爲什麼)和“How”(如何用)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4)面向對象架構實戰"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過在朋友圈增加踩、ZooKeeper的源碼分析兩個實戰案例展示如何在實際開發項目中使用面向對象方法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章