新聞中心
譯者 | 胥磊

創(chuàng)新互聯(lián)建站服務(wù)項目包括從化網(wǎng)站建設(shè)、從化網(wǎng)站制作、從化網(wǎng)頁制作以及從化網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,從化網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到從化省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
審校 | 孫淑娟
軟件行業(yè)中幾乎在每個公司,我們都會聽到一些話題的討論,我相信關(guān)于設(shè)計模式的爭論絕對是其中之一。你甚至可以找到無數(shù)的帖子、文章或者Quora和Stackoverflow上的問題的問答無不是在爭論設(shè)計模式,前些天我就看到了Quora上一個很古老的問題:“為什么現(xiàn)在程序員很少談及設(shè)計模式?哪些模式(如果有的話)依然還有價值?”顯然提問者所說的設(shè)計模式是面向?qū)ο蟮脑O(shè)計模式,更確切的說是GoF書中介紹的那23種設(shè)計模式,當(dāng)然大多數(shù)回答問題的人也都是這么認為的。
“設(shè)計模式”這個術(shù)語已然成了“面向?qū)ο蟮脑O(shè)計模式”的代名詞,所以當(dāng)你遇到“設(shè)計模式已死”的這種奇怪說法時不要感到震驚。在這篇文章中,我們將重新聲明下什么是設(shè)計模式,這有助于我們在討論或使用某種設(shè)計模式時,能使我們確定我們究竟在談?wù)摶蚴褂玫氖鞘裁础?/p>
1、設(shè)計模式對你意味著什么?
讓我們拋開所有的書面上的定義和解釋,當(dāng)提到設(shè)計模式這個概念時你首先想到的是什么?一個不該被打破的規(guī)則?或是一個字斟句酌的學(xué)術(shù)建議?亦或是又一個的設(shè)計約束?還是說一個你只需要知道就能通過求職面試的法寶?
對我來說,設(shè)計模式就像我腦海中的喃喃警語,時刻提醒我不要重復(fù)造車輪。你可能有過類似的沖動,當(dāng)遇到一個問題后就想立即找出應(yīng)對的解決方案,并開始設(shè)計/編寫程序——如果是這樣的話,那么你也是一個重復(fù)造車輪的人。設(shè)想一下如果已經(jīng)有一個現(xiàn)成的解決方案,你再去創(chuàng)造一個到頭來只是浪費了不必要的時間和精力。盡管這種沖動可能會隨著時間的推移而有所克制,但要完全克服這種沖動情緒,我相信設(shè)計模式就是“良藥”之一。
許多軟件工程師應(yīng)該都碰到過一個相似的問題,因為某些原因都以某種特定的方式解決了它。上述情況同時也提醒了我,這背后可能隱藏了一個道理,啟示我們要從不同角度去看待問題,即使我們很少這么干。讓我們看一下GoF的書中介紹的一段:
“我們都知道設(shè)計經(jīng)驗的價值,但你又有過多少次那種“似曾相識”的感覺的經(jīng)歷——那種你曾經(jīng)解決過類似問題,但卻不知道在哪以及如何解決的感覺?如果你能記住以前問題的細節(jié)以及解決的方法,那么你就可以重新使用這種經(jīng)驗,而不是再次去找解決問題的方案”。
或多或少我們都有過類似的經(jīng)歷:當(dāng)我們無法記住之前的解決方案時,就會出現(xiàn)反復(fù)去解決同一個常見的設(shè)計問題的情況。設(shè)計模式就是重用解決方案去解決反復(fù)出現(xiàn)的問題,從而節(jié)省了我們的時間和精力,可以轉(zhuǎn)而去做其他事情?,F(xiàn)在,讓我們深入探討一些模式的基本概念和定義。
2、模式意味著什么?
什么是模式?模式的概念并不是軟件行業(yè)所特有的,其他學(xué)科和行業(yè)如建筑學(xué)、經(jīng)濟學(xué)等同樣適用。讓我們來看下建筑學(xué)界權(quán)威人士克里斯托弗-亞歷山大對模式的定義:
“每種模式都是一個由三部分組成的規(guī)則,它描述了某種背景、問題和解決方案之間的關(guān)系?!?Alexander, 1979)“每個模式都描述了一個在我們的環(huán)境中反復(fù)出現(xiàn)的問題,然后描述了解決這個問題的核心。通過這種方式,你就可以無數(shù)次地使用這個解決方案,而不是用同樣的方式做多次?!?Alexander, 1977)
現(xiàn)在讓我們看看模式在軟件行業(yè)的意義?!败浖軜?gòu)的設(shè)計模式描述了在特定的設(shè)計環(huán)境中反復(fù)出現(xiàn)的特定的設(shè)計問題,并為其提供了一套可行的通用方案。解決方案是通過描述其組成部件、它們之間責(zé)任和關(guān)系以及協(xié)作方式來指定的。”(BMRSS, 96)
基于上述定義,我們可以將模式視為背景、問題和解決方案三者之間的有機結(jié)合。它是一個寬泛的概念,可以應(yīng)用于不同的規(guī)模和抽象層次,從設(shè)計整個軟件系統(tǒng)到解決特定編程語言的設(shè)計問題都可以應(yīng)用。
3、不同的模式類別
模式是根據(jù)其規(guī)模和抽象程度來分類的:
(1)架構(gòu)模式
(2)設(shè)計模式
(3)習(xí)語
架構(gòu)模式關(guān)注的是整個軟件系統(tǒng)的架構(gòu),它的子系統(tǒng),不同的大組件,以及它們的結(jié)合方式。這種模式是一種高層級的抽象,并不關(guān)心編程語言是什么,也不關(guān)心使用的是什么框架。
“架構(gòu)模式描述了軟件系統(tǒng)的基本結(jié)構(gòu)的組織模式。它提供了一套預(yù)定義的子系統(tǒng),并規(guī)定了它們的責(zé)任,其中包括組織它們之間關(guān)系的規(guī)則和指導(dǎo)手冊”。(BMRSS, 96)
另一方面,我們在最低的抽象層次上也有一些模式,稱之為習(xí)語,它涉及到設(shè)計和實現(xiàn)。習(xí)語是針對特定語言的,也就是說A語言中的習(xí)語在B語言中是不相干的?!傲?xí)語是一種針對特定編程語言的低級模式。習(xí)語描述了如何使用給定語言的特性來實現(xiàn)特定方面的組件或組件之間的關(guān)系”。(BMRSS, 96)。在上述那些規(guī)模和抽象水平的模式之間,還有一些其他的模式,那就是設(shè)計模式。
4、設(shè)計模式的近距離觀察
讓我們回顧一下設(shè)計模式的定義:“設(shè)計模式為完善軟件系統(tǒng)的子系統(tǒng)或組件,以及它們之間的關(guān)系而提供的一個方案。它描述了一個相互通信的組件的常見結(jié)構(gòu),用以解決特定的環(huán)境中常見的設(shè)計問題”。(BMRSS, 96) 。設(shè)計模式屬于中等規(guī)模,這意味著它們既不像架構(gòu)模式那樣高度抽象,也不像習(xí)語那樣與編程語言耦合。使用設(shè)計模式并不影響軟件系統(tǒng)的架構(gòu),但它會影響子系統(tǒng)的結(jié)構(gòu)及其較小的組件。
現(xiàn)在讓我們來討論下面這句話(摘自同一參考文獻),其中包含了關(guān)于設(shè)計模式的一個重要事實?!八鼈兺毩⒂谀撤N特定的編程語言或編程范式”。(BMRSS, 96) 。根據(jù)之前在文章中談到的模式類別,我們重新表述一下:“它們獨立于一種特定的編程語言,但往往(不總是)依賴于一種編程范式?!边@句話的第一部分很清楚:如果一個模式依賴于特定的編程語言,那么它就屬于習(xí)語的范疇。關(guān)于第二部分,設(shè)計模式是為解決編程范式中出現(xiàn)的常見問題而做出的嘗試。它們很可能是對范式的缺陷的應(yīng)對。例如GoF書中描述的23種面向?qū)ο蟮脑O(shè)計模式,其中大部分都不是函數(shù)式編程范式中的關(guān)注點。反過來也一樣,因為設(shè)計模式都有不同的背景。正如你在下圖中看到的,不同的范式可以共享設(shè)計模式,但我們不打算討論這個話題,因為它超出了本文的范圍。
5、一個著名觀點的分析
記住前面的章節(jié),讓我們快速瀏覽一下當(dāng)你簡單地用谷歌搜索設(shè)計模式時可能遇到的觀點:函數(shù)式編程語言不需要設(shè)計模式。你可以在這里找到答案,顯然這種說法是錯誤的,因為它暗示設(shè)計模式只屬于面向?qū)ο蠓妒?。設(shè)計模式是一個在函數(shù)式編程范式和面向?qū)ο缶幊谭妒街卸伎梢源嬖诘母拍?,設(shè)計模式是針對各種范式的問題和需求而設(shè)計的。函數(shù)式編程范式同樣有專門針對其背景的設(shè)計模式。此外,正如我們在前幾節(jié)所討論的,不同的范式有不同的背景,因此就會遇到不同的問題,我們不應(yīng)該指望范式B的設(shè)計模式來解決范式A的問題。
6、快速回顧
設(shè)計模式與其他模式類型類似,試圖解決一個特定環(huán)境中反復(fù)出現(xiàn)的問題。
(1)它們是獨立于語言的,但大多是跟范式耦合。
(2)作為中等規(guī)模,它們不像架構(gòu)模式那樣抽象。
(3)它們的應(yīng)用并不影響軟件系統(tǒng)的基本架構(gòu),但會影響子系統(tǒng)的架構(gòu)。
(4)最后但也同樣重要的是,它們是(所有類型的模式)防止我們重復(fù)造輪的手段。
在我看來設(shè)計模式并不是約束我們設(shè)計的嚴格規(guī)則。它們既不是固定的,也不是無懈可擊的,因為它們可以進化,可以變得完善,甚至可以消逝,但模式的概念仍然存在。遵循模式就像是一種思維方式,幫助我們找出可能更好的解決方案。
分享名稱:“設(shè)計模式已死”,這不是你所了解的設(shè)計模式
URL地址:http://www.dlmjj.cn/article/dhdogid.html


咨詢
建站咨詢
