最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript最少知識原則介紹與體現(xiàn)

 更新時間:2022年08月09日 11:27:45   作者:夏安  
最少知識原則(LKP)說的是一個軟件實體應(yīng)當(dāng)盡可能少地與其他實體發(fā)生相互作用。這里的軟件實體是一個廣義的概念,不僅包括對象,還包括系統(tǒng)、類、模塊、函數(shù)、變量等

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

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

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

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

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

中介者模式

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

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

外觀模式

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

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

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

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

最簡單的外觀模式應(yīng)該是類似下面的代碼:

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

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

  • 為一組子系統(tǒng)提供一個簡單便利的訪問入口。
  • 隔離客戶與復(fù)雜子系統(tǒng)之間的聯(lián)系,客戶不用去了解子系統(tǒng)的細(xì)節(jié)。

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

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

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

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

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

  • 變量在全局聲明,或者在代碼的任何位置隱式申明(不用 var),則該變量在全局可見;
  • 變量在函數(shù)內(nèi)顯式申明(使用 var),則在函數(shù)內(nèi)可見。

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

假設(shè)我們要編寫一個具有緩存效果的計算乘積的函數(shù) function mult (){},我們需要一個對象 const cache = {}來保存已經(jīng)計算過的結(jié)果。cache 對象顯然只對 mult 有用,把 cache 對象放在 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 

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

到此這篇關(guān)于JavaScript最少知識原則介紹與體現(xiàn)的文章就介紹到這了,更多相關(guān)JS最少知識原則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 懸浮廣告方法日常收集整理

    懸浮廣告方法日常收集整理

    這篇文章主要介紹了懸浮廣告方法日常收集整理的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • React?diff算法面試考點超詳細(xì)講解

    React?diff算法面試考點超詳細(xì)講解

    渲染真實DOM的開銷很大,有時候我們修改了某個數(shù)據(jù),直接渲染到真實dom上會引起整個dom樹的重繪和重排。我們希望只更新我們修改的那一小塊dom,而不是整個dom,diff算法就幫我們實現(xiàn)了這點。diff算法的本質(zhì)就是:找出兩個對象之間的差異,目的是盡可能做到節(jié)點復(fù)用
    2022-12-12
  • js 分頁代碼帶切換效果

    js 分頁代碼帶切換效果

    js 分頁效果實現(xiàn)代碼,可以切換頁面
    2009-06-06
  • JavaScript中操作字符串小結(jié)

    JavaScript中操作字符串小結(jié)

    字符串在javascript中幾乎無處不在,在你處理用戶的輸入數(shù)據(jù)的時候,在讀取或設(shè)置DOM對象的屬性時,在操作cookie時,當(dāng)然還有更多...。JavaScript的核心部分提供了一組屬性和方法用于通用的字符串操作,如分割字符串,改變字符串的大小寫,操作子字符串等。
    2015-05-05
  • Dropify.js圖片寬高自適應(yīng)的方法

    Dropify.js圖片寬高自適應(yīng)的方法

    本篇文章主要介紹了Dropify.js圖片寬高自適應(yīng)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 一文帶你理解微信小程序中RPC通信的實現(xiàn)

    一文帶你理解微信小程序中RPC通信的實現(xiàn)

    在微信小程序開發(fā)中,要實現(xiàn)兩個線程之間的通信是一項重要的任務(wù),所以本文就來講講如何使用小程序的?postMessage?和?addListener?API?來實現(xiàn)在兩個線程之間進(jìn)行高效的?RPC?通信吧
    2023-06-06
  • 基于JS實現(xiàn)密碼框(password)中顯示文字提示功能代碼

    基于JS實現(xiàn)密碼框(password)中顯示文字提示功能代碼

    這篇文章主要介紹了實現(xiàn)密碼框(password)中顯示文字提示功能代碼,在項目開發(fā)中經(jīng)常會用到,需要的朋友可以參考下
    2016-05-05
  • 詳解JS正則replace的使用方法

    詳解JS正則replace的使用方法

    這篇文章主要為大家詳細(xì)介紹了javascript正則replace的使用方法,感興趣的朋友可以參考一下
    2016-03-03
  • Js 獲取當(dāng)前函數(shù)參數(shù)對象的實現(xiàn)代碼

    Js 獲取當(dāng)前函數(shù)參數(shù)對象的實現(xiàn)代碼

    這篇文章主要介紹了Js 獲取當(dāng)前函數(shù)參數(shù)對象的實現(xiàn)代碼,需要的朋友可以參考下
    2016-06-06
  • JavaScript設(shè)計模式之工廠模式和抽象工廠模式定義與用法分析

    JavaScript設(shè)計模式之工廠模式和抽象工廠模式定義與用法分析

    這篇文章主要介紹了JavaScript設(shè)計模式之工廠模式和抽象工廠模式,結(jié)合實例形式分析了工廠模式的功能、定義、相關(guān)問題解決方法,并分析抽象工廠模式與工廠模式的不同之處,需要的朋友可以參考下
    2018-07-07

最新評論

曲水县| 新巴尔虎左旗| 东丽区| 潮安县| 巴里| 江门市| 乌鲁木齐市| 建湖县| 柯坪县| 淮北市| 开鲁县| 贵溪市| 屯昌县| 禄丰县| 谢通门县| 石渠县| 台前县| 论坛| 澄江县| 子洲县| 临安市| 齐齐哈尔市| 囊谦县| 菏泽市| 灵宝市| 常州市| 石河子市| 水富县| 微山县| 三明市| 融水| 建水县| 广丰县| 民勤县| 贵溪市| 麻栗坡县| 遂川县| 宕昌县| 饶河县| 德阳市| 盱眙县|