JavaScript 什么是設(shè)計(jì)模式?

2018-08-02 16:22 更新

什么是設(shè)計(jì)模式

一個(gè)模式就是一個(gè)可重用的方案,可應(yīng)用于在軟件設(shè)計(jì)中的常見問題 - 在我們的例子里 - 就是編寫JavaScript的web應(yīng)用程序。模式的另一種解釋就是一個(gè)我們?nèi)绾谓鉀Q問題的模板 - 那些可以在許多不同的情況里使用的模板。 那么理解和熟悉模式為什么是如此的重要?設(shè)計(jì)模式有以下三點(diǎn)好處:

  • 模式是行之有效的解決方法:他們提供固定的解決方法來解決在軟件開發(fā)中出現(xiàn)的問題,這些都是久經(jīng)考驗(yàn)的反應(yīng)了開發(fā)者的經(jīng)驗(yàn)和見解的使用模式來定義的技術(shù)。
  • 模式可以很容易地重用:一個(gè)模式通常反映了一個(gè)可以適應(yīng)自己需要的開箱即用的解決方案。這個(gè)特性讓它們很健壯。
  • 模式善于表達(dá):當(dāng)我們看到一個(gè)提供某種解決方案的模式時(shí),一般有一組結(jié)構(gòu)和詞匯可以非常優(yōu)雅地幫助表達(dá)相當(dāng)大的解決方案。

模式不是一個(gè)確切的解決方案。我們要記住模式的角色僅僅是給我們提供一個(gè)解決方案。模式不能解決所有的設(shè)計(jì)問題,也不能代替優(yōu)秀的軟件設(shè)計(jì)師。然而,它們?cè)趲椭覀儭=酉聛砦覀儗⒖纯茨J奖仨毺峁┑钠渌囊恍﹥?yōu)勢(shì)。

  • 模式的重用可以幫助防止在應(yīng)用程序開發(fā)過程中出現(xiàn)的一些可能導(dǎo)致重大問題的小問題。這意味著當(dāng)代碼是建立在行之有效的模式上時(shí),我們可以花更少的時(shí)間去關(guān)心我們的代碼結(jié)構(gòu),從而能花更多的時(shí)間關(guān)注我們的解決方案的整體質(zhì)量。這是因?yàn)槟J娇梢怨膭?lì)我們?cè)诟玫慕Y(jié)構(gòu)化和有組織的方式下編碼,這將避免在未來由于清潔的目的而去重構(gòu)它。
  • 模式可以提供一個(gè)不需要綁定到一個(gè)特定問題的書面的概括性的解決方案。這個(gè)廣義的方法意味著不用管我們正在處理的應(yīng)用程序 (許多情況下的編程語言) 設(shè)計(jì)模式的應(yīng)用可以提高我們的代碼的結(jié)構(gòu)。
  • 某些模式可以通過避免重復(fù)來減小我們代碼的文件大小。通過鼓勵(lì)開發(fā)者更仔細(xì)地看待他們的解決方案來減少重復(fù)的地方,如通過將類似的執(zhí)行流程作為一個(gè)一般性的函數(shù)來減少函數(shù)的數(shù)量,這樣我們就可以減小代碼庫(kù)的總體大小,這也成為使代碼更DRY。
  • 模式增加了開發(fā)者的詞匯,這使得交流更快速。
  • 經(jīng)常使用的模式可通過收集其他使用這些模式的開發(fā)人員貢獻(xiàn)給設(shè)計(jì)模式社區(qū)的經(jīng)驗(yàn)來改進(jìn)。在某些情況下,這將導(dǎo)致全新模式的創(chuàng)建,同時(shí)也可以提供改進(jìn)的指導(dǎo)大家如何使用特定的模式才是最好的。這可以確?;谀J降慕鉀Q方案繼續(xù)變得比特別的解決方案更健壯。

我們已經(jīng)每天都在使用模式

為了了解模式有多有用,讓我們看看jQuery提供給我們的一個(gè)很簡(jiǎn)單的元素選擇問題。 假設(shè)我們有一個(gè)為頁(yè)面上每一個(gè)class為"foo"的DOM元素添加一個(gè)計(jì)數(shù)器的腳本,什么才是查詢這個(gè)元素的集合的最有效的方法呢?有幾種不同的方法可以解決這個(gè)問題:

選擇頁(yè)面上所有的元素并存儲(chǔ)它們的引用,然后使用正則表達(dá)式 (或其他方式) 來過濾這個(gè)集合中那些class為"foo"的元素的引用。

  • 使用像asquerySelectorAll()的現(xiàn)代原生瀏覽器的特性,來選擇所有的class為"foo"的元素。
  • 使用像asgetElementsByClassName()的原生特性同樣可以獲取期望的集合。

那些,這些選擇哪個(gè)是最快的呢?實(shí)際上第三個(gè),比其他的替代選擇快 8-10倍。但在實(shí)際的應(yīng)用程序中,第三個(gè)選擇無法在Internet Explorer 9以下的版本中使用,從而只能使用第一個(gè),第二個(gè)和第三個(gè)都不支持。

使用jQuery的開發(fā)人員就不必?fù)?dān)心這個(gè)問題,因?yàn)楹苄疫\(yùn)的是它使用Facade模式把這個(gè)問題抽象了出來。正如我們即將在后面更詳細(xì)的介紹的那樣,這種模式提供了一組簡(jiǎn)單的對(duì)更復(fù)雜的底層代碼的抽象接口 (例如$el.css(),$el.animate()) 。正如我們所看到的,這意味著我們只會(huì)對(duì)實(shí)現(xiàn)級(jí)別的細(xì)節(jié)花費(fèi)更少的時(shí)間。

在其后,庫(kù)會(huì)根據(jù)我們當(dāng)前瀏覽器的支持自動(dòng)選擇最優(yōu)的方法來選擇元素,我們只使用抽象層。

我們可能都熟悉jQuery的$("selector"),這是更容易使用的在一個(gè)頁(yè)面選擇HTML元素的方法,這樣我們就不必手動(dòng)來選擇getElementById(),getElementsByClassName(),getElementByTagName()等方法。

雖然我們知道querySelectorAll()試圖解決這個(gè)問題,但比比使用jQuery的Facade接口和自己來選擇最優(yōu)的方式時(shí)花費(fèi)的精力,毫無疑問,使用模式可以提供真實(shí)世界的抽象價(jià)值。

我們將在本書的后面看到更多的設(shè)計(jì)模式。

“模式特性”測(cè)試,模式原型和三條規(guī)則

記住并不是每個(gè)算法、每個(gè)最佳實(shí)踐和每個(gè)解決方案都可能被認(rèn)為是一個(gè)完整的模式。這兒可能缺少了幾個(gè)關(guān)鍵因素,而且模式社團(tuán)除非經(jīng)過嚴(yán)格的審查才謹(jǐn)慎地聲明某東西為模式的。即使某東西對(duì)我們來說似乎滿足了模式標(biāo)準(zhǔn),它都不應(yīng)該被當(dāng)作模式,直到它由他人經(jīng)過適當(dāng)時(shí)間的周密調(diào)查和測(cè)試后才可能當(dāng)作模式。

回頭看看Alexander曾經(jīng)做過的工作,他聲明模式應(yīng)當(dāng)既是過程也是“事物”。這個(gè)定義故意不明確,因?yàn)樗o跟著說模式應(yīng)該是創(chuàng)建“事物”的過程。這就是為什么模式通常集中定位在表面上可識(shí)別的結(jié)構(gòu)的原因。例如,我們應(yīng)當(dāng)能夠可視化地描繪(或者繪制)圖片來展示把模式應(yīng)用到實(shí)踐中的結(jié)構(gòu)。

在研究設(shè)計(jì)模式的時(shí)候,無意間碰到術(shù)語“模式原型”是很正常的。那么什么是模式原型呢? 好,仍然沒有通過"模式特性”測(cè)試的模式通常認(rèn)為是模式原型。模式原型也許源自于某人已經(jīng)確定的值得與社團(tuán)共享的特定解決方案的工作,然而由于它提出時(shí)間短,所以可能仍然沒有機(jī)會(huì)接受嚴(yán)格的審查。

另外,個(gè)人共享的模式也許沒有時(shí)間或者沒有興趣通過“模式特性”測(cè)試這個(gè)過程,不過可能發(fā)布了這些模式原型的簡(jiǎn)短說明。這種類型模式的簡(jiǎn)要描述或者片段就是眾所周知的小模式。

全面文檔化具有資格的模式這樣的工作是非常令人氣餒的?;仡^看看設(shè)計(jì)模式領(lǐng)域最早期的某些工作,如果一個(gè)模式能做到以下事情,那么這個(gè)模式就可以認(rèn)為是“好的”模式:

  • 解決一類特定的問題:模式不能假設(shè)僅僅關(guān)注原理或者策略。它們需要關(guān)注解決方案。這是好的模式最重要的因素之一。
  • 問題的解決方案不是表面上的:我們發(fā)現(xiàn)解決問題的技術(shù)常常首先試圖源自于某個(gè)眾所周知的原理。最佳的設(shè)計(jì)模式通常間接地提供問題的解決方案-認(rèn)為模式是與設(shè)計(jì)相關(guān)的最具有挑戰(zhàn)性的問題必然的解決方法。
  • 所描述的想法一定得到了證明:設(shè)計(jì)模式需要提供所描述的它們運(yùn)行的證據(jù),如果沒有這些證據(jù),就不會(huì)認(rèn)真的考慮這個(gè)設(shè)計(jì)。如果模式事實(shí)上是高度理論性的話,那么只有冒險(xiǎn)者才可能試著用它。
  • 它必須說明與代碼之間關(guān)系:在某些情況下,模式似乎說明了一種類型的模塊。雖然實(shí)現(xiàn)的可能就是這個(gè)方法,但是官方的模式說明一定要更深入的描述系統(tǒng)結(jié)構(gòu)和機(jī)制,以解釋它與代碼之間的關(guān)系。

我們認(rèn)為不滿足準(zhǔn)則的模式原型不值得學(xué)習(xí),這可以得到諒解,然而,事實(shí)遠(yuǎn)不是這樣的。許多模式原型確實(shí)非常的好。我不是說所有的模式原型都值得看,不過總有幾個(gè)在自然環(huán)境下成長(zhǎng)的有用的模式原型可以在未來的項(xiàng)目中幫到我們。從心底里使用上面列表來做最佳評(píng)判的話,你在選擇哪個(gè)是模式的過程中將感覺非常愉快。

模式是否有效的附加要求之一是模式要展示某些重現(xiàn)現(xiàn)象。這個(gè)就是至少在三個(gè)關(guān)鍵方面 ,也就是三條規(guī)則驗(yàn)證是否取得資格經(jīng)常要做的事情。為了展示使用這個(gè)規(guī)則后的重現(xiàn),模式必須證明其:

  • 適用性-模式怎樣才能被認(rèn)為是成功的。
  • 有用性-為什么認(rèn)為這個(gè)模式是成功的?
  • 可用性 -因?yàn)樵O(shè)計(jì)得到廣泛的應(yīng)用,所以認(rèn)為這個(gè)設(shè)計(jì)就是模式嗎?如果是這樣的話,那么需要說明。重新審核或者定義模式的時(shí)候,牢記以上規(guī)則非常重要。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)