日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

jquery 延迟加载代码_延迟加载是一种代码气味

發(fā)布時(shí)間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jquery 延迟加载代码_延迟加载是一种代码气味 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

jquery 延遲加載代碼

您見過(guò)那些具有許多屬性的巨大物體嗎? 這些域?qū)ο笥捎诓幌M麖臄?shù)據(jù)庫(kù)檢索太多信息而在其中使用延遲加載? 我敢打賭你有這種令人懷疑的快樂。

今天,我想與您分享我對(duì)它們的印象- 使用延遲加載應(yīng)被視為一種代碼味道!

讓我解釋一下自己:

  • 延遲加載意味著有時(shí)您不需要某個(gè)對(duì)象的某些屬性。 這些屬性將在不同的上下文中是必需的。 這是否意味著您要根據(jù)上下文構(gòu)建不同的對(duì)象?
  • 使用此對(duì)象的功能肯定知道太多。 它知道對(duì)象的API,并且此API還包含需要未加載屬性的方法。 很好,不是嗎?
  • 您必須記住每個(gè)地方需要什么,不需要什么…
  • …而且,更糟糕的是,您必須記住您可能使用的功能以及特定位置不支持的方法。

如果還不夠,請(qǐng)?jiān)试S我詳細(xì)說(shuō)明。

延遲加載如何工作

簡(jiǎn)而言之, 延遲加載允許您在加載父級(jí)時(shí)不加載子級(jí)。 僅當(dāng)您明確要求時(shí)才加載它們。

它是如何工作的? 讓我們看一個(gè)簡(jiǎn)單的例子:

class User {private final Name name;@OneToMany(fetch = FetchType.LAZY)private List<Role> roles;@OneToMany(fetch = FetchType.LAZY)private List<Subscription> subscriptions;// Some more attributes and methods }

此類的定義告訴您什么? FetchType.LAZY對(duì)我們意味著什么? 這為我們提供了包含用戶角色和訂閱的列表的信息,除非我們明確要求此類數(shù)據(jù),否則這些數(shù)據(jù)不會(huì)被填充。

什么是有界上下文?

受限上下文是域驅(qū)動(dòng)開發(fā)中的主要模式之一。 通過(guò)將大型域模型劃分為不同的上下文,它可以幫助您使用大型域模型。 由于這個(gè)原因,您的域?qū)ο笞兊酶?#xff0c;應(yīng)用程序的業(yè)務(wù)邏輯變得更容易理解。

但是...為什么呢?

在前面的段落中,我寫了User類的定義告訴我們的內(nèi)容。 到現(xiàn)在為止,一切都與機(jī)制有關(guān)。 現(xiàn)在我們可以走得更遠(yuǎn)。

讓我們?cè)賮?lái)看一下我們的課:

class User {private final Name name;@OneToMany(fetch = FetchType.LAZY)private List<Role> roles;@OneToMany(fetch = FetchType.LAZY)private List<Subscription> subscriptions;// Some more attributes and methods }

除了已經(jīng)提到的內(nèi)容,您能告訴我更多有關(guān)此對(duì)象的信息嗎?

我們知道我們正在使用其對(duì)象在可能需要但不一定需要角色的地方使用的類。 可能需要訂閱但不一定要訂閱的地方。 名稱始終是必需的。

我們知道,在我們的應(yīng)用程序/環(huán)境中有一些功能/位置需要這些屬性,而在某些地方這些屬性沒有用處。

但是……我們必須遍歷代碼才能找到那些地方。 這需要時(shí)間和精力。 不幸的是,我們還有機(jī)會(huì)錯(cuò)過(guò)一些地方。

我們所知道的...我們所不知道的...

知道在哪里和需要什么會(huì)更好嗎? 當(dāng)然可以! 問題是:如何實(shí)現(xiàn)?

讓我們對(duì)示例進(jìn)行簡(jiǎn)短分析:

class User {private final Name name;@OneToMany(fetch = FetchType.LAZY)private List<Role> roles;@OneToMany(fetch = FetchType.LAZY)private List<Subscription> subscriptions;// Some more attributes and methods }

我們已經(jīng)知道一些事情:

  • 名稱始終是必需的。
  • 有時(shí)我們需要角色。
  • 有時(shí)我們需要訂閱。

根據(jù)這些信息,我們可以添加另一件事– 我們知道我們并不總是需要所有這些信息 。 也許聽起來(lái)有些瑣碎,但這也很重要。

這就是信息。 現(xiàn)在是未知的時(shí)候了:

  • 在哪里我們既需要角色又需要訂閱?
  • 在不同的地方需要角色和訂閱嗎?
  • 有沒有我們不需要的地方?
  • 是否取決于上下文需要什么屬性?

未知數(shù)的問題在于,我們必須遍歷代碼才能找到答案。 但這還不是問題的終點(diǎn)。 當(dāng)您最終找到這些位置時(shí),沒有方法或變量或任何可重命名的信息,不會(huì)在一段時(shí)間內(nèi)丟失此信息。 下次,您將不得不重復(fù)該工作。

讓我們改進(jìn)代碼

由于上一段中列出了未知數(shù),因此更改現(xiàn)有代碼(真正的代碼)和我們正在使用的代碼并不容易。 這就是為什么我建議您在考慮延遲加載之后立即進(jìn)行此更改。 這是最便宜的改進(jìn)的正確時(shí)機(jī)。

好的,但是我們?nèi)绾尾拍芨倪M(jìn)示例中的代碼?

首先要做的是找到未知數(shù)的答案。 沒有這些答案,我們就無(wú)法前進(jìn)。 在我們的案例中,我假設(shè)我們認(rèn)識(shí)到三種不同的情況:

  • 身份驗(yàn)證和授權(quán)是我們需要用戶名及其角色的地方。
  • 在我們處理報(bào)告發(fā)送的地方,我們需要用戶名及其訂閱。
  • 在我們應(yīng)用程序的其他區(qū)域,我們既不需要角色也不需要訂閱。

現(xiàn)在,我們可以重構(gòu)User類并將其拆分為更易于理解的內(nèi)容:

class AuthUser {private final Name name;private List<Role> roles;// Some more attributes and methods }class ReportUser {private final Name name;private List<Subscription> subscriptions;// Some more attributes and methods }class ApplicationUser {private final Name name;// Some more attributes and methods }

現(xiàn)在,我們有了三個(gè)類,而不是一個(gè),但是我們的代碼中也有更多信息。 我們無(wú)需遍歷代碼即可找出所需內(nèi)容和位置。 打開類的定義就足夠了

下一步是什么?

不幸的是,要在您的域中顯示狀態(tài),您必須付出很多努力。 為什么? 主要是因?yàn)槲粗?應(yīng)用程序越大,獲取所有信息的難度就越大。 這就是為什么我鼓勵(lì)您在考慮將延遲加載作為解決方案之后立即拆分類。

如果您的域中已經(jīng)有延遲加載的引用,則應(yīng)僅重構(gòu)已經(jīng)使用的部分。 您將最大程度地減少更改的風(fēng)險(xiǎn)和進(jìn)行更改所需的精力。 無(wú)論如何,代碼將變得更具描述性。

祝好運(yùn)!

翻譯自: https://www.javacodegeeks.com/2017/01/lazy-loading-code-smell.html

jquery 延遲加載代碼

總結(jié)

以上是生活随笔為你收集整理的jquery 延迟加载代码_延迟加载是一种代码气味的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。