iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript单一职责原则深入分析
  • 828
分享到

JavaScript单一职责原则深入分析

JavaScript单一职责原则JavaScript单一职责JavaScript设计模式 2022-11-13 14:11:21 828人浏览 薄情痞子
摘要

目录单一职责原则设计模式中的SRP原则何时应该分离职责违反 SRP 原则SRP 原则的优缺点单一职责原则 就一个类而言,应该仅有一个引起它变化的原因。在 javascript 中,需

单一职责原则

就一个类而言,应该仅有一个引起它变化的原因。在 javascript 中,需要用到类的场景并不太多,单一职责原则更多地是被运用在对象或者方法级别上,因此本节我们的讨论大多基于对象和方法。

单一职责原则(SRP)的职责被定义为“引起变化的原因”。如果我们有两个动机去改写一个方法,那么这个方法就具有两个职责。每个职责都是变化的一个轴线,如果一个方法承担了过多的职责,那么在需求的变迁过程中,需要改写这个方法的可能性就越大。

此时,这个方法通常是一个不稳定的方法,修改代码总是一件危险的事情,特别是当两个职责耦合在一起的时候,一个职责发生变化可能会影响到其他职责的实现,造成意想不到的破坏,这种耦合性得到的是低内聚和脆弱的设计。

因此,SRP 原则体现为:一个对象(方法)只做一件事情。

设计模式中的SRP原则

SRP 原则在很多设计模式中都有着广泛的运用,例如代理模式、迭代器模式、单例模式和装饰者模式。

代理模式

通过增加虚拟代理的方式,把预加载图片的职责放到代理对象中,而本体仅仅负责往页面中添加 img 标签,这也是它最原始的职责。

myImage 负责往页面中添加 img 标签:

const myImage = (function () {
	const imgnode = document.createElement('img');
	document.body.appendChild(imgNode);
	return {
		setSrc: function (src) {
			imgNode.src = src;
		}
	}
})();

proxyImage 负责预加载图片,并在预加载完成之后把请求交给本体 myImage

const proxyImage = (function () {
	const img = new Image;
	img.onload = function () {
		myImage.setSrc(this.src);
	}
	return {
		setSrc: function (src) {
			myImage.setSrc('file:// /C:/Users/svenzeng/Desktop/loading.gif');
			img.src = src;
		}
	}
})();
proxyImage.setSrc('Http:// imGCache.qq.com/music/photo/000GGDys0yA0Nk.jpg');

把添加 img 标签的功能和预加载图片的职责分开放到两个对象中,这两个对象各自都只有一个被修改的动机。在它们各自发生改变的时候,也不会影响另外的对象。

迭代器模式

我们有这样一段代码,先遍历一个集合,然后往页面中添加一些 div,这些 divinnerhtml 分别对应集合里的元素:

const appendDiv = function (data) {
	for (let i = 0, l = data.length; i < l; i++) {
		const div = document.createElement('div');
		div.innerHTML = data[i];
		document.body.appendChild(div);
	}
};
appendDiv([1, 2, 3, 4, 5, 6]);

这其实是一段很常见的代码,经常用于 ajax 请求之后,在回调函数中遍历 ajax 请求返回的数据,然后在页面中渲染节点。

appendDiv 函数本来只是负责渲染数据,但是在这里它还承担了遍历聚合对象 data 的职责。 我们想象一下,如果有一天 api 返回的 data 数据格式从 array 变成了 object,那我们遍历 data 的代码就会出现问题,必须改成 for ( let i in data )的方式,这时候必须去修改 appendDiv 里的代码,否则因为遍历方式的改变,导致不能顺利往页面中添加 div 节点。

我们有必要把遍历 data 的职责提取出来,这正是迭代器模式的意义,迭代器模式提供了一种方法来访问聚合对象,而不用暴露这个对象的内部表示。

当把迭代聚合对象的职责单独封装在 each 函数中后,即使以后还要增加新的迭代方式,我们只需要修改 each 函数即可,appendDiv 函数不会受到牵连,代码如下:

const each = function (obj, callback) {
	let value,
		i = 0,
		length = obj.length,
		isArray = isArraylike(obj); // isArraylike 函数这里未实现
	if (isArray) { // 迭代类数组
		for (; i < length; i++) {
			callback.call(obj[i], i, obj[i]);
		}
	} else {
		for (i in obj) { // 迭代 object 对象
			value = callback.call(obj[i], i, obj[i]);
		}
	}
	return obj;
};
const appendDiv = function (data) {
	each(data, function (i, n) {
		const div = document.createElement('div');
		div.innerHTML = n;
		document.body.appendChild(div);
	});
};
appendDiv([1, 2, 3, 4, 5, 6]);
appendDiv({ a: 1, b: 2, c: 3, d: 4 });

单例模式

在JavaScript单例模式实现过一个惰性单例,最开始的代码是这样的:

const createLoginLayer = (function () {
	let div;
	return function () {
		if (!div) {
			div = document.createElement('div');
			div.innerHTML = '我是登录浮窗';
			div.style.display = 'none';
			document.body.appendChild(div);
		}
		return div;
	}
})();

现在我们把管理单例的职责和创建登录浮窗的职责分别封装在两个方法里,这两个方法可以独立变化而互不影响,当它们连接在一起的时候,就完成了创建唯一登录浮窗的功能,下面的代码显然是更好的做法:

const getSingle = function (fn) { // 获取单例
	let result;
	return function () {
		return result || (result = fn.apply(this, arguments));
	}
};
const createLoginLayer = function () { // 创建登录浮窗
	const div = document.createElement('div');
	div.innerHTML = '我是登录浮窗';
	document.body.appendChild(div);
	return div;
};
const createSingleLoginLayer = getSingle(createLoginLayer);
const loginLayer1 = createSingleLoginLayer();
const loginLayer2 = createSingleLoginLayer();
alert(loginLayer1 === loginLayer2); // 输出: true 

何时应该分离职责

SRP 原则是所有原则中最简单也是最难正确运用的原则之一。

要明确的是,并不是所有的职责都应该一一分离。

一方面,如果随着需求的变化,有两个职责总是同时变化,那就不必分离他们。比如在 ajax 请求的时候,创建 xhr 对象和发送 xhr 请求几乎总是在一起的,那么创建 xhr 对象的职责和发送 xhr 请求的职责就没有必要分开。

另一方面,职责的变化轴线仅当它们确定会发生变化时才具有意义,即使两个职责已经被耦合在一起,但它们还没有发生改变的征兆,那么也许没有必要主动分离它们,在代码需要重构的时候再进行分离也不迟。

违反 SRP 原则

在人的常规思维中,总是习惯性地把一组相关的行为放到一起,如何正确地分离职责不是一件容易的事情。

一方面,我们受设计原则的指导,另一方面,我们未必要在任何时候都一成不变地遵守原则。在实际开发中,因为种种原因违反 SRP 的情况并不少见。比如 Jqueryattr 等方法,就是明显违反 SRP 原则的做法。jQueryattr 是个非常庞大的方法,既负责赋值,又负责取值,这对于 jQuery 的维护者来说,会带来一些困难,但对于 jQuery 的用户来说,却简化了用户的使用。

在方便性与稳定性之间要有一些取舍。具体是选择方便性还是稳定性,并没有标准答案,而是要取决于具体的应用环境。

SRP 原则的优缺点

SRP 原则的优点是降低了单个类或者对象的复杂度,按照职责把对象分解成更小的粒度,这有助于代码的复用,也有利于进行单元测试。当一个职责需要变更的时候,不会影响到其他的职责。

但 SRP 原则也有一些缺点,最明显的是会增加编写代码的复杂度。当我们按照职责把对象分解成更小的粒度之后,实际上也增大了这些对象之间相互联系的难度。

到此这篇关于JavaScript单一职责原则深入分析的文章就介绍到这了,更多相关js单一职责原则内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript单一职责原则深入分析

本文链接: https://www.lsjlt.com/news/172209.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript单一职责原则深入分析
    目录单一职责原则设计模式中的SRP原则何时应该分离职责违反 SRP 原则SRP 原则的优缺点单一职责原则 就一个类而言,应该仅有一个引起它变化的原因。在 JavaScript 中,需...
    99+
    2022-11-13
    JavaScript单一职责原则 JavaScript单一职责 JavaScript设计模式
  • C++单一职责原则示例代码浅析
    单一职责原则: 就一个类而言,应该只有一个引起它变化的原因,如果一个类承担的职责过多就等于把这些职责耦合在一起,至少会造成以下两方面的问题: 我们要去修改该类中的一个职责可能会影响到...
    99+
    2023-02-27
    C++ 单一职责 C++ 单一职责原则
  • Java单一职责原则怎么实现
    这篇文章主要讲解了“Java单一职责原则怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java单一职责原则怎么实现”吧!1.什么是单一职责原则?首先我们可以对某个类来说,即一个类应该...
    99+
    2023-06-29
  • python的单一职责原则怎么实现
    今天小编给大家分享一下python的单一职责原则怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一,封装封装是面向对象...
    99+
    2023-06-29
  • 单一职责原则与PHP中的实践
    单一职责原则(Single Responsibility Principle,SRP)是面向对象设计中的一个重要概念,它指出一个类应该只有一个引起变化的原因。换句话说,一个类应该只负责完成一个单一的职责或功能。在PHP中,遵守单一职责原则有...
    99+
    2023-10-21
    单一职责原则(SRP) PHP编程实践 职责分离
  • C#实现六大设计原则之单一职责原则
    单一职责(SRP)定义: 不要存在多于一个导致类变更的原因,通俗的说,即一个类只负责一项职责。  问题由来: 类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求...
    99+
    2022-11-13
  • C#面向对象设计原则之单一职责原则
    单一职责原则(SRP) 定义:系统中的每一个类都应该只有一个职责。 好处:高内聚、低耦合。 解释说明: 单一职责也就是说我们应该让一个类或一个对象只做一件事情,每个类所要关注的就是自...
    99+
    2022-11-13
  • C++单一职责原则的代码怎么写
    今天小编给大家分享一下C++单一职责原则的代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。单一职责原则:就一个类而言...
    99+
    2023-07-05
  • Java设计模式之单一职责原则精解
    1.什么是单一职责原则? 首先我们可以对某个类来说,即一个类应该只负责一项职责。如类A负责两个不同职责: 职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要...
    99+
    2022-11-13
  • Java设计模式中单一职责原则详解
    目录前言一、介绍二、代码演示前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才...
    99+
    2023-05-20
    Java 设计模式 Java 单一职责原则
  • Java设计模式七大原则之单一职责原则详解
    目录定义案例需求方案一方案二对比分析总结如何遵守单一职责原则定义 单一职责原则(Single Responsibility Principle, SRP),有且仅有一个原因引起类的变...
    99+
    2022-11-13
  • 什么实现Java项目中的单一职责原则
    这期内容当中小编将会给大家带来有关什么实现Java项目中的单一职责原则,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。问题由来:类T...
    99+
    2023-05-31
    java 单一职责原则 ava
  • python面向对象编程设计原则之单一职责原则详解
    目录一,封装(一)什么是封装(二)封装与访问(三)私有化与访问控制1,属性与方法的私有化2,变量名压缩3,方法重载(四)属性引用:getter、setter 与 property二,...
    99+
    2022-11-13
  • java设计模式的单一职责原则怎么实现
    这篇“java设计模式的单一职责原则怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java设计模式的单一职责原则怎么...
    99+
    2023-06-17
  • java面向对象设计原则之单一职责与依赖倒置原则详解
    目录单一职责概念 实现 拓展 依赖倒置原则概念 示例 拓展 单一职责概念 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,否则就应该把类拆分。交杂不清的职责将使...
    99+
    2022-11-12
  • MySQL最左匹配原则深入分析
    目录前言全列匹配最左前缀匹配精确匹配查询条件没有指定索引第一列匹配某列的前缀字符串范围查询查询条件中含有函数或表达式前言 接下来我们通过几种情况来描述最左匹配原则的使用。首先如下所示,为userName、phone以及u...
    99+
    2022-11-01
  • MySQL索引设计原则深入分析讲解
    哪些情况适合创建索引? 字段的数值有唯一性的限制 索引本身可以起到约束的作用,比如唯一索引,主键索引都是可以起到唯一性约束的,因此在我们的数据表中如果某个字段是唯一性的,就可以直接创...
    99+
    2023-01-02
    MySQL索引设计原则 MySQL索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作