溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JavaScript最少知識(shí)原則與體現(xiàn)是什么

發(fā)布時(shí)間:2022-08-09 13:49:36 來(lái)源:億速云 閱讀:109 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下JavaScript最少知識(shí)原則與體現(xiàn)是什么的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

1. 減少對(duì)象之間的聯(lián)系

單一職責(zé)原則指導(dǎo)我們把對(duì)象劃分成較小的粒度,這可以提高對(duì)象的可復(fù)用性。但越來(lái)越多的對(duì)象之間可能會(huì)產(chǎn)生錯(cuò)綜復(fù)雜的聯(lián)系,如果修改了其中一個(gè)對(duì)象,很可能會(huì)影響到跟它相互引用的其他對(duì)象。對(duì)象和對(duì)象耦合在一起,有可能會(huì)降低它們的可復(fù)用性。在程序中,對(duì)象的“朋友”太多并不是一件好事,“城門(mén)失火,殃及池魚(yú)”和“一人犯法,株連九族”的故事時(shí)有發(fā)生。

最少知識(shí)原則要求我們?cè)谠O(shè)計(jì)程序時(shí),應(yīng)當(dāng)盡量減少對(duì)象之間的交互。如果兩個(gè)對(duì)象之間不必彼此直接通信,那么這兩個(gè)對(duì)象就不要發(fā)生直接的相互聯(lián)系。常見(jiàn)的做法是引入一個(gè)第三者對(duì)象,來(lái)承擔(dān)這些對(duì)象之間的通信作用。如果一些對(duì)象需要向另一些對(duì)象發(fā)起請(qǐng)求,可以通過(guò)第三者對(duì)象來(lái)轉(zhuǎn)發(fā)這些請(qǐng)求。

2. 設(shè)計(jì)模式中的最少知識(shí)原則

最少知識(shí)原則在設(shè)計(jì)模式中體現(xiàn)得最多的地方是中介者模式和外觀模式,下面我們分別進(jìn)行介紹。

中介者模式

在世界杯期間購(gòu)買(mǎi)足球彩票,如果沒(méi)有博彩公司作為中介,上千萬(wàn)的人一起計(jì)算賠率和輸贏絕對(duì)是不可能的事情。博彩公司作為中介,每個(gè)人都只和博彩公司發(fā)生關(guān)聯(lián),博彩公司會(huì)根據(jù)所有人的投注情況計(jì)算好賠率,彩民們贏了錢(qián)就從博彩公司拿,輸了錢(qián)就賠給博彩公司。

中介者模式很好地體現(xiàn)了最少知識(shí)原則。通過(guò)增加一個(gè)中介者對(duì)象,讓所有的相關(guān)對(duì)象都通過(guò)中介者對(duì)象來(lái)通信,而不是互相引用。所以,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),只需要通知中介者對(duì)象即可。

外觀模式

外觀模式在 JavaScript 中的使用場(chǎng)景并不多。外觀模式主要是為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,外觀模式定義了一個(gè)高層接口,這個(gè)接口使子系統(tǒng)更加容易使用。

外觀模式的作用是對(duì)客戶(hù)屏蔽一組子系統(tǒng)的復(fù)雜性。外觀模式對(duì)客戶(hù)提供一個(gè)簡(jiǎn)單易用的高層接口,高層接口會(huì)把客戶(hù)的請(qǐng)求轉(zhuǎn)發(fā)給子系統(tǒng)來(lái)完成具體的功能實(shí)現(xiàn)。大多數(shù)客戶(hù)都可以通過(guò)請(qǐng)求外觀接口來(lái)達(dá)到訪問(wèn)子系統(tǒng)的目的。但在一段使用了外觀模式的程序中,請(qǐng)求外觀并不是強(qiáng)制的。如果外觀不能滿(mǎn)足客戶(hù)的個(gè)性化需求,那么客戶(hù)也可以選擇越過(guò)外觀來(lái)直接訪問(wèn)子系統(tǒng)。

拿全自動(dòng)洗衣機(jī)的一鍵洗衣按鈕舉例,這個(gè)一鍵洗衣按鈕就是一個(gè)外觀。如果是老式洗衣機(jī),客戶(hù)要手動(dòng)選擇浸泡、洗衣、漂洗、脫水這 4 個(gè)步驟。如果這種洗衣機(jī)被淘汰了,新式洗衣機(jī)的漂洗方式發(fā)生了改變,那我們還得學(xué)習(xí)新的漂洗方式。而全自動(dòng)洗衣機(jī)的好處很明顯,不管洗衣機(jī)內(nèi)部如何進(jìn)化,客戶(hù)要操作的,始終只是一個(gè)一鍵洗衣的按鈕。這個(gè)按鈕就是為一組子系統(tǒng)所創(chuàng)建的外觀。但如果一鍵洗衣程序設(shè)定的默認(rèn)漂洗時(shí)間是 20 分鐘,而客戶(hù)希望這個(gè)漂洗時(shí)間是 30 分鐘,那么客戶(hù)自然可以選擇越過(guò)一鍵洗衣程序,自己手動(dòng)來(lái)控制這些“子系統(tǒng)”運(yùn)轉(zhuǎn)。

外觀模式容易跟普通的封裝實(shí)現(xiàn)混淆。這兩者都封裝了一些事物,但外觀模式的關(guān)鍵是定義一個(gè)高層接口去封裝一組“子系統(tǒng)”。子系統(tǒng)在 C++或者 Java 中指的是一組類(lèi)的集合,這些類(lèi)相互協(xié)作可以組成系統(tǒng)中一個(gè)相對(duì)獨(dú)立的部分。在 JavaScript 中我們通常不會(huì)過(guò)多地考慮“類(lèi)”,如果將外觀模式映射到 JavaScript 中,這個(gè)子系統(tǒng)至少應(yīng)該指的是一組函數(shù)的集合。

最簡(jiǎn)單的外觀模式應(yīng)該是類(lèi)似下面的代碼:

const A = function () {
	a1();
	a2();
}
const B = function () {
	b1();
	b2();
}
const facade = function () {
	A();
	B();
}
facade();

現(xiàn)在再來(lái)看看外觀模式和最少知識(shí)原則之間的關(guān)系。外觀模式的作用主要有兩點(diǎn)。

  • 為一組子系統(tǒng)提供一個(gè)簡(jiǎn)單便利的訪問(wèn)入口。

  • 隔離客戶(hù)與復(fù)雜子系統(tǒng)之間的聯(lián)系,客戶(hù)不用去了解子系統(tǒng)的細(xì)節(jié)。

從第二點(diǎn)來(lái),外觀模式是符合最少知識(shí)原則的。比如全自動(dòng)洗衣機(jī)的一鍵洗衣按鈕,隔開(kāi)了客戶(hù)和浸泡、洗衣、漂洗、脫水這些子系統(tǒng)的直接聯(lián)系,客戶(hù)不用去了解這些子系統(tǒng)的具體實(shí)現(xiàn)。

假設(shè)我們?cè)诰帉?xiě)這個(gè)老式洗衣機(jī)的程序,客戶(hù)至少要和浸泡、洗衣、漂洗、脫水這 4 個(gè)子系統(tǒng)打交道。如果其中的一個(gè)子系統(tǒng)發(fā)生了改變,那么客戶(hù)的調(diào)用代碼就得發(fā)生改變。而通過(guò)外觀將客戶(hù)和這些子系統(tǒng)隔開(kāi)之后,如果修改子系統(tǒng)內(nèi)部,只要外觀不變,就不會(huì)影響客戶(hù)的調(diào)用。同樣,對(duì)外觀的修改也不會(huì)影響到子系統(tǒng),它們可以分別變化而互不影響。

3. 封裝在最少知識(shí)原則中的體現(xiàn)

封裝在很大程度上表達(dá)的是數(shù)據(jù)的隱藏。一個(gè)模塊或者對(duì)象可以將內(nèi)部的數(shù)據(jù)或者實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),只暴露必要的接口 API 供外界訪問(wèn)。對(duì)象之間難免產(chǎn)生聯(lián)系,當(dāng)一個(gè)對(duì)象必須引用另外一個(gè)對(duì)象的時(shí)候,我們可以讓對(duì)象只暴露必要的接口,讓對(duì)象之間的聯(lián)系限制在最小的范圍之內(nèi)。

同時(shí),封裝也用來(lái)限制變量的作用域。在 JavaScript 中對(duì)變量作用域的規(guī)定是:

  • 變量在全局聲明,或者在代碼的任何位置隱式申明(不用 var),則該變量在全局可見(jiàn);

  • 變量在函數(shù)內(nèi)顯式申明(使用 var),則在函數(shù)內(nèi)可見(jiàn)。

把變量的可見(jiàn)性限制在一個(gè)盡可能小的范圍內(nèi),這個(gè)變量對(duì)其他不相關(guān)模塊的影響就越小,變量被改寫(xiě)和發(fā)生沖突的機(jī)會(huì)也越小。這也是廣義的最少知識(shí)原則的一種體現(xiàn)。

假設(shè)我們要編寫(xiě)一個(gè)具有緩存效果的計(jì)算乘積的函數(shù) function mult (){},我們需要一個(gè)對(duì)象 const cache = {}來(lái)保存已經(jīng)計(jì)算過(guò)的結(jié)果。cache 對(duì)象顯然只對(duì) mult 有用,把 cache 對(duì)象放在 mult 形成的閉包中,顯然比把它放在全局作用域更加合適,代碼如下:

const mult = (function () {
	const cache = {};
	return function () {
		const args = Array.prototype.join.call(arguments, ',');
		if (cache[args]) {
			return cache[args];
		}
		let a = 1;
		for (let i = 0, l = arguments.length; i < l; i++) {
			a = a * arguments[i];
		}
		return cache[args] = a;
	}
})();
mult(1, 2, 3); // 輸出: 6

雖然遵守最小知識(shí)原則減少了對(duì)象之間的依賴(lài),但也有可能增加一些龐大到難以維護(hù)的第三者對(duì)象。跟單一職責(zé)原則一樣,在實(shí)際開(kāi)發(fā)中,是否選擇讓代碼符合最少知識(shí)原則,要根據(jù)具體的環(huán)境來(lái)定。

以上就是“JavaScript最少知識(shí)原則與體現(xiàn)是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI