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

jquery 延迟加载代码

您见过那些具有许多属性的巨大物体吗? 这些域对象由于不希望从数据库检索太多信息而在其中使用延迟加载? 我敢打赌你有这种令人怀疑的快乐。

今天,我想与您分享我对它们的印象- 使用延迟加载应被视为一种代码味道!

让我解释一下自己:

  • 延迟加载意味着有时您不需要某个对象的某些属性。 这些属性将在不同的上下文中是必需的。 这是否意味着您要根据上下文构建不同的对象?
  • 使用此对象的功能肯定知道太多。 它知道对象的API,并且此API还包含需要未加载属性的方法。 很好,不是吗?
  • 您必须记住每个地方需要什么,不需要什么…
  • …而且,更糟糕的是,您必须记住您可能使用的功能以及特定位置不支持的方法。

如果还不够,请允许我详细说明。

延迟加载如何工作

简而言之, 延迟加载允许您在加载父级时不加载子级。 仅当您明确要求时才加载它们。

它是如何工作的? 让我们看一个简单的例子:

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对我们意味着什么? 这为我们提供了包含用户角色和订阅的列表的信息,除非我们明确要求此类数据,否则这些数据不会被填充。

什么是有界上下文?

受限上下文是域驱动开发中的主要模式之一。 通过将大型域模型划分为不同的上下文,它可以帮助您使用大型域模型。 由于这个原因,您的域对象变得更小,应用程序的业务逻辑变得更容易理解。

但是...为什么呢?

在前面的段落中,我写了User类的定义告诉我们的内容。 到现在为止,一切都与机制有关。 现在我们可以走得更远。

让我们再来看一下我们的课:

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
}

除了已经提到的内容,您能告诉我更多有关此对象的信息吗?

我们知道我们正在使用其对象在可能需要但不一定需要角色的地方使用的类。 可能需要订阅但不一定要订阅的地方。 名称始终是必需的。

我们知道,在我们的应用程序/环境中有一些功能/位置需要这些属性,而在某些地方这些属性没有用处。

但是……我们必须遍历代码才能找到那些地方。 这需要时间和精力。 不幸的是,我们还有机会错过一些地方。

我们所知道的...我们所不知道的...

知道在哪里和需要什么会更好吗? 当然可以! 问题是:如何实现?

让我们对示例进行简短分析:

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
}

我们已经知道一些事情:

  • 名称始终是必需的。
  • 有时我们需要角色。
  • 有时我们需要订阅。

根据这些信息,我们可以添加另一件事– 我们知道我们并不总是需要所有这些信息 。 也许听起来有些琐碎,但这也很重要。

这就是信息。 现在是未知的时候了:

  • 在哪里我们既需要角色又需要订阅?
  • 在不同的地方需要角色和订阅吗?
  • 有没有我们不需要的地方?
  • 是否取决于上下文需要什么属性?

未知数的问题在于,我们必须遍历代码才能找到答案。 但这还不是问题的终点。 当您最终找到这些位置时,没有方法或变量或任何可重命名的信息,不会在一段时间内丢失此信息。 下次,您将不得不重复该工作。

让我们改进代码

由于上一段中列出了未知数,因此更改现有代码(真正的代码)和我们正在使用的代码并不容易。 这就是为什么我建议您在考虑延迟加载之后立即进行此更改。 这是最便宜的改进的正确时机。

好的,但是我们如何才能改进示例中的代码?

首先要做的是找到未知数的答案。 没有这些答案,我们就无法前进。 在我们的案例中,我假设我们认识到三种不同的情况:

  • 身份验证和授权是我们需要用户名及其角色的地方。
  • 在我们处理报告发送的地方,我们需要用户名及其订阅。
  • 在我们应用程序的其他区域,我们既不需要角色也不需要订阅。

现在,我们可以重构User类并将其拆分为更易于理解的内容:

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
}

现在,我们有了三个类,而不是一个,但是我们的代码中也有更多信息。 我们无需遍历代码即可找出所需内容和位置。 打开类的定义就足够了

下一步是什么?

不幸的是,要在您的域中显示状态,您必须付出很多努力。 为什么? 主要是因为未知。 应用程序越大,获取所有信息的难度就越大。 这就是为什么我鼓励您在考虑将延迟加载作为解决方案之后立即拆分类。

如果您的域中已经有延迟加载的引用,则应仅重构已经使用的部分。 您将最大程度地减少更改的风险和进行更改所需的精力。 无论如何,代码将变得更具描述性。

祝好运!

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

jquery 延迟加载代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

inotify-java下载_inotify-java-2.1.jar

【实例简介】inotify能够对文件系统进行监控&#xff0c;书上举的例子都是c使用inotify的例子&#xff0c;难道没有Java版吗&#xff0c;肯定有&#xff0c;只不过要自己编译&#xff0c;在网上找到别人的博客有&#xff0c;但是人家不愿意分享&#xff0c;我就只能自己编译了&…

SQL语句执行顺序

文章目录SQL 简介SQL 语句的执行顺序重点SQL 简介 SQL 是 Structured Query Language 的缩写&#xff0c;称为结构化查询语言&#xff0c;SQL 是一种操作关系型数据库的规则&#xff0c;SQL 语句以分号结尾&#xff0c;不区分大小写&#xff0c;建议关键词使用大写。 SQL 语句…

getexternalfilesdir 相册_音乐相册(电子相册制作)V5.2 安卓最新版

音乐相册(电子相册制作)是一个功能强大的电子相册创建工具。最新版本的音乐专辑应用程序可以帮助用户快速创建精美的多媒体专辑视频&#xff0c;并匹配优美的音乐伴奏&#xff0c;使照片更精彩。音乐专辑应用程序支持几乎所有流行的图片格式&#xff0c;并支持导入和导出&#…

jdk 9和jdk8_JDK 9是某些功能的终结

jdk 9和jdk8几天前宣布JDK 9是Feature Complete&#xff01; 进行切割的许多“功能”是附加功能&#xff0c;但有些是移除功能。 这篇文章介绍了一些从OpenJDK和/或Oracle JDK with Java 9中删除的项目。 JEP 220 &#xff08;“模块化运行时图像”&#xff09;的一部分是删除…

二级java题型及分值_2016年全国计算机二级java语言程序设计考试大纲

2016年全国计算机二级java语言程序设计考试大纲2016年3月计算机考试即将在3月26日-29日进行&#xff0c;为了帮助大家顺利通过2016年计算机二级考试&#xff0c;下面百分网小编为大家带来2016年全国计算机二级java语言程序设计考试大纲&#xff0c;供大家参考学习&#xff0c;预…

linux系统下安装jdk教程

一、首先下载linux版本jdk jdk官网&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/index.html 根据自己的需求&#xff0c;下载不同版本的jdk 2.将下载好的jdk压缩包&#xff0c;通过ftp上传到linux系统的当前用户下&#xff0c;我当前登录的用户为r…

mqtt java_MQTT和Java入门

mqtt javaMQTT&#xff08;MQ遥测传输&#xff09;是一种轻量级的发布/订阅消息传递协议。 MQTT在物联网应用程序中得到了广泛使用&#xff0c;因为它被设计为在占用空间小的系统上运行在远程位置。 MQTT 3.1是OASIS标准&#xff0c;您可以在http://mqtt.org/上找到所有信息。…

iphone11什么时候上市_hd3手表高仿哪里买 什么时候上市?

hd3手表高仿哪里买 什么时候上市? 导读&#xff1a;hd3手表高仿哪里买zf的万国7日链高仿表怎么样&#xff1f;款式设计非常出色&#xff0c;很多手表的款式&#xff0c;依靠着该性价比的迅速提升来做出的有效转化&#xff0c;年轻人对于复刻表的选择&#xff0c;能拥有的这些细…

arcgis工具python源码_面向Arcgis的python脚本编程_数据

【实例简介】《面向ArcGIS的Python脚本编程》是一本指导ArcGIS for Desktop专业用户进行Python开发的指南。该书将教会您如何通过编写Python代码处理空间数据并在ArcGIS中自动化实现地理处理任务【实例截图】【核心代码】面向arcgis的python脚本编程数据└── 面向arcgis的pyt…

Windows 命令终端(CMD)程序员常用的命令

文章目录certutilcddirmd/mkdirrddelreplacechdir/cdattribhelptypemorefindstrrename/renset环境变量扩展echonetstattskilltasklisttaskkillnettreecopystartpauseprintverwinversysteminfowmiclogofftracertroute printtelnetftppingipconfigshutdown远程关机formatchkdskti…

驱动级的自动按键_空调遥控器特殊按键使用方法及注意事项

在上门维修过程中&#xff0c;用户常常由于遥控器使用不当&#xff0c;或者幵启了特定按键引起空调器的假性故障&#xff0c;这时需要进行电话解答或上门讲解&#xff0c;现对空调遥控器的特殊功能按键作简单介绍。示例遥控器型号为格力YAD0F,与KFR-23GW/ ( 23570 ) Aa-3挂式空…

净资产滚动率_净资产的结构

净资产滚动率Netty的包装结构很棒。 每个程序员都应该研究它。 每个系统都应该模仿它&#xff1b; 每个项目经理都应将其打印出来&#xff0c;拍在墙上&#xff0c;然后对开发人员说&#xff1a;“那样。” Netty是一个“ ...异步事件驱动的网络应用程序框架&#xff0c;用于…

freebsd nginx php mysql_FreeBSD 安装配置Nginx+PHP+APC+MySQL

在 FreeBSD 下安装软件的传统方法是用 ports 源码安装&#xff0c;不过使用 ports 源码编译安装太耗时(尤其是各种库依赖多、大的时候)&#xff0c;个人还是喜欢 pkg 这种软件包管理工具直接安装编译好的二进制软件包&#xff0c;不用自己编译&#xff0c;省时省力。FreeBSD 也…

python入门之类的基础语法-关于一些Python的一些基础语法训练

1&#xff1a;已知a和b元素 a "pyer" b "apple" 用字典和format方法实现&#xff1a;效果&#xff1a;my name is pyer, i love apple. 1、format的方法 c "mysql name is {0},i love {1}".format("pyer","apple") 用字典…

jdk 9和jdk8_JDK 9已完成功能!

jdk 9和jdk8今天的Mark Reinhold消息JDK 9已完成功能完善-现在该降级了 &#xff0c; 它宣布JDK 9的“总体功能集已冻结”。 OracleJava平台小组的首席架构师Reinhold补充说&#xff1a;“极不可能将任何进一步的JEP定向到该发行版。” 与该消息类似的文本也出现在JDK 9页面上 …

Java从键盘输入若干数_用java编程序:从键盘输入若干个整数,输出这些数中大于其平均值的数。...

展开全部引用1楼 christal yhy的答案,考虑到浮点数的存在,特在此基础上优化一下,代码如下:public static void main(String[] args) {Scanner scan new Scanner(System.in);System.out.println("请输入62616964757a686964616fe59b9ee7ad9431333262373933要输入的个数:&qu…

java多线程编程_阿里P8熬到秃头肝出来的:Java多线程+并发编程核心笔记

自学Java的时候&#xff0c;多线程和并发这一块可以说是最难掌握的部分了&#xff0c;很多小伙伴表示需要一些易于学习和上手的资料。所以今天这本「Java并发学习手册.pdf」就是一份集中学习多线程和并发的手册&#xff0c;PDF版&#xff0c;由RedSpider社区的五位大神撰写&…

内外网逻辑隔离物理隔离_隔离域逻辑

内外网逻辑隔离物理隔离在一个设计模式课程中&#xff0c;我对建模域逻辑进行了有趣的讨论。 具体来说&#xff0c;它是关于隔离域逻辑的 。 一个应用程序通常分为三个部分&#xff1a; 演示&#xff08;例如桌面GUI&#xff0c;浏览器&#xff0c;Web服务&#xff09; 域逻辑…

360安全浏览器兼容模式怎么设置_测试新手一定要知道:最实用的Web兼容性测试经验都在这...

在日常工作中&#xff0c;我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试&#xff0c;目的在于保证待测试项目在不同的操作系统平台上正常运行。主要包括待测试项目能在同一操作系统平台的不同版本上正常运行&#xff1b;待测试项目能与相关的其他软件或系统的“和平…

Linux 的命令终端(CMD)的快捷键(Keyboard of MacBook)

文章目录常用移动光标编辑命令查找历史命令控制命令命令终端界面滚屏命令终端页签切换奇葩常用 快捷键说明Ctrl A光标跳到本行的行首Ctrl E光标跳到本行的行尾Ctrl U删除当前光标前面的所有文字&#xff08;还有剪切功能&#xff09;Ctrl K删除当前光标后面的所有文字&…