JavaScript最少知识原则介绍与体现

目录
  • 1. 减少对象之间的联系
  • 2. 设计模式中的最少知识原则
  • 3. 封装在最少知识原则中的体现

1. 减少对象之间的联系

单一职责原则指导我们把对象划分成较小的粒度,这可以提高对象的可复用性。但越来越多的对象之间可能会产生错综复杂的联系,如果修改了其中一个对象,很可能会影响到跟它相互引用的其他对象。对象和对象耦合在一起,有可能会降低它们的可复用性。在程序中,对象的“朋友”太多并不是一件好事,“城门失火,殃及池鱼”和“一人犯法,株连九族”的故事时有发生。

最少知识原则要求我们在设计程序时,应当尽量减少对象之间的交互。如果两个对象之间不必彼此直接通信,那么这两个对象就不要发生直接的相互联系。常见的做法是引入一个第三者对象,来承担这些对象之间的通信作用。如果一些对象需要向另一些对象发起请求,可以通过第三者对象来转发这些请求。

2. 设计模式中的最少知识原则

最少知识原则在设计模式中体现得最多的地方是中介者模式和外观模式,下面我们分别进行介绍。

中介者模式

在世界杯期间购买足球彩票,如果没有博彩公司作为中介,上千万的人一起计算赔率和输赢绝对是不可能的事情。博彩公司作为中介,每个人都只和博彩公司发生关联,博彩公司会根据所有人的投注情况计算好赔率,彩民们赢了钱就从博彩公司拿,输了钱就赔给博彩公司。

中介者模式很好地体现了最少知识原则。通过增加一个中介者对象,让所有的相关对象都通过中介者对象来通信,而不是互相引用。所以,当一个对象发生改变时,只需要通知中介者对象即可。

外观模式

外观模式在 JavaScript 中的使用场景并不多。外观模式主要是为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使子系统更加容易使用。

外观模式的作用是对客户屏蔽一组子系统的复杂性。外观模式对客户提供一个简单易用的高层接口,高层接口会把客户的请求转发给子系统来完成具体的功能实现。大多数客户都可以通过请求外观接口来达到访问子系统的目的。但在一段使用了外观模式的程序中,请求外观并不是强制的。如果外观不能满足客户的个性化需求,那么客户也可以选择越过外观来直接访问子系统。

拿全自动洗衣机的一键洗衣按钮举例,这个一键洗衣按钮就是一个外观。如果是老式洗衣机,客户要手动选择浸泡、洗衣、漂洗、脱水这 4 个步骤。如果这种洗衣机被淘汰了,新式洗衣机的漂洗方式发生了改变,那我们还得学习新的漂洗方式。而全自动洗衣机的好处很明显,不管洗衣机内部如何进化,客户要操作的,始终只是一个一键洗衣的按钮。这个按钮就是为一组子系统所创建的外观。但如果一键洗衣程序设定的默认漂洗时间是 20 分钟,而客户希望这个漂洗时间是 30 分钟,那么客户自然可以选择越过一键洗衣程序,自己手动来控制这些“子系统”运转。

外观模式容易跟普通的封装实现混淆。这两者都封装了一些事物,但外观模式的关键是定义一个高层接口去封装一组“子系统”。子系统在 C++或者 Java 中指的是一组类的集合,这些类相互协作可以组成系统中一个相对独立的部分。在 JavaScript 中我们通常不会过多地考虑“类”,如果将外观模式映射到 JavaScript 中,这个子系统至少应该指的是一组函数的集合。

最简单的外观模式应该是类似下面的代码:

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

现在再来看看外观模式和最少知识原则之间的关系。外观模式的作用主要有两点。

  • 为一组子系统提供一个简单便利的访问入口。
  • 隔离客户与复杂子系统之间的联系,客户不用去了解子系统的细节。

从第二点来,外观模式是符合最少知识原则的。比如全自动洗衣机的一键洗衣按钮,隔开了客户和浸泡、洗衣、漂洗、脱水这些子系统的直接联系,客户不用去了解这些子系统的具体实现。

假设我们在编写这个老式洗衣机的程序,客户至少要和浸泡、洗衣、漂洗、脱水这 4 个子系统打交道。如果其中的一个子系统发生了改变,那么客户的调用代码就得发生改变。而通过外观将客户和这些子系统隔开之后,如果修改子系统内部,只要外观不变,就不会影响客户的调用。同样,对外观的修改也不会影响到子系统,它们可以分别变化而互不影响。

3. 封装在最少知识原则中的体现

封装在很大程度上表达的是数据的隐藏。一个模块或者对象可以将内部的数据或者实现细节隐藏起来,只暴露必要的接口 API 供外界访问。对象之间难免产生联系,当一个对象必须引用另外一个对象的时候,我们可以让对象只暴露必要的接口,让对象之间的联系限制在最小的范围之内。

同时,封装也用来限制变量的作用域。在 JavaScript 中对变量作用域的规定是:

  • 变量在全局声明,或者在代码的任何位置隐式申明(不用 var),则该变量在全局可见;
  • 变量在函数内显式申明(使用 var),则在函数内可见。

把变量的可见性限制在一个尽可能小的范围内,这个变量对其他不相关模块的影响就越小,变量被改写和发生冲突的机会也越小。这也是广义的最少知识原则的一种体现。

假设我们要编写一个具有缓存效果的计算乘积的函数 function mult (){},我们需要一个对象 const cache = {}来保存已经计算过的结果。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 

虽然遵守最小知识原则减少了对象之间的依赖,但也有可能增加一些庞大到难以维护的第三者对象。跟单一职责原则一样,在实际开发中,是否选择让代码符合最少知识原则,要根据具体的环境来定。

到此这篇关于JavaScript最少知识原则介绍与体现的文章就介绍到这了,更多相关JS最少知识原则内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript面向对象之七大基本原则实例详解

    本文实例讲述了JavaScript面向对象之七大基本原则.分享给大家供大家参考,具体如下: 面向对象编程有自己的特性与原则,如果对于面向对象有一些了解的话,面向对象三大特征,封装.继承.多态,如果对面向对这三个概念不太了解,请参考面向对象之三个基本特征(javaScript) 单一职责 如果我们在编写程序的时候,一类或者一个方法里面包含了太多方法,对于代码的可读性来说,无非是一场灾难,对于我们来说.所以为了解决这个问题,出现了单一职责. 什么是单一职责 单一职责:又称单一功能原则,面向对象五个基

  • 深入浅析JavaScript的API设计原则

    一.接口的流畅性 好的接口是流畅易懂的,他主要体现如下几个方面: 1.简单 操作某个元素的css属性,下面是原生的方法: document.querySelectorAll('#id').style.color = 'red'; 封装之后 function a(selector, color) { document.querySelectorAll(selector)[].style.color = color } a('#a', 'red'); 从几十个字母长长的一行到简简单单的一个函数调用,

  • JavaScript的数据类型转换原则(干货)

    我们都知道JavaScript是一门弱类型(或称动态类型)的语言,即变量的类型是不确定的. var num = 123 ; //123 var num = 'HAHAHA' + num ; // "HAHAHA123" 上面的代码中,变量num起初是一个数值,后来又变成一个字符串.变量类型完全由当前值决定.这种类型就叫弱类型. 我们知道,在编程语言中,数据本身和运算之间都是有类型的. 在强类型的编程语言中,不同类型的变量是不能直接进行运算的. 但是在弱类型语言中不同类型的变量却是可以直

  • JavaScript最少知识原则介绍与体现

    目录 1. 减少对象之间的联系 2. 设计模式中的最少知识原则 3. 封装在最少知识原则中的体现 1. 减少对象之间的联系 单一职责原则指导我们把对象划分成较小的粒度,这可以提高对象的可复用性.但越来越多的对象之间可能会产生错综复杂的联系,如果修改了其中一个对象,很可能会影响到跟它相互引用的其他对象.对象和对象耦合在一起,有可能会降低它们的可复用性.在程序中,对象的“朋友”太多并不是一件好事,“城门失火,殃及池鱼”和“一人犯法,株连九族”的故事时有发生. 最少知识原则要求我们在设计程序时,应当尽

  • JavaScript Date 知识浅析

    Date函数 new Date() Date 对象会自动把当前日期和时间保存为其初始值. date.getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31). date.getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6).周日是0. date.getMonth() 从 Date 对象返回月份 (0 ~ 11). date.getFullYear() 从 Date 对象以四位数字返回年份 date.getHours() 返回 Date 对象的小时 (0 ~

  • Javascript基础知识盲点总结之函数

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.本文重点给大家介绍js基础知识盲点总结之函数. 一.函数中的arguments对象 每个函数内部都有一个arguments,它能返回函数所接受的所有参数 注意:argumens接收的是实参 如下是利一个利用arguments特性编写的求和函数: function sumOnSteroids(){ var I, res = 0; var number_of_params = arguments.length; for(I = 0; I <

  • Javascript基础知识中关于内置对象的知识

    目录 1.内置对象介绍 1.1 Math对象 1.2 Math中的方法 1.3 Date对象 2.Date中的方法 3.经典案例:倒计时效果: 4.Array数组对象 4.1 数组的创建 4.2 数组中的常用方法 5.字符串String 1.内置对象介绍 JavaScript组成: ECMAScript | DOM | BOM ECMAScript: 变量 , 函数, 数据类型 ,流程控制,内置对象 js中的对象: 自定义对象 , 内置对象 , 浏览器对象(不属于ECMAScript) 1.1

  • 四十九个javascript小知识实用技巧

    目录 一.js整数的操作 二.重写原生alert,记录弹框次数 三.数字交换不声明中间变量的方法 四.万物皆对象 五.If语句的变形 六.使用===,而不是== 七.使用闭包实现私有变量 八.创建对象的构造函数 九.小心使用typeof.instanceof和constructor 十.创建一个自调用函数(Self-calling Funtion) 十一.从数组中获取一个随机项 十二.在特定范围内获取一个随机数 十三.在0和设定的最大值之间生成一个数字数组 十四.生成一个随机的数字字母字符串 十

  • JavaScript执行机制详细介绍

    目录 1.进程与线程的概念 2.浏览器原理 3.同步与异步 4.执行栈与任务队列 5.事件循环(Event-Loop) 6.定时器 前言: 不论是工作还是面试,我们可能都经常会碰到需要知道代码的执行顺序的场景,所以打算花点时间彻底搞懂JavaScript的执行机制. 想要搞懂JavaScript执行机制,你需要清楚下面这些知识: (以浏览器环境为例,与Node环境不同) 1.进程与线程的概念 浏览器原理 事件循环(Event-Loop),任务队列(同步任务,异步任务,微任务,宏任务) 进程与线程

  • JavaScript 与 Java 区别介绍 学java怎么样

    java和javascript长得是如此地相像,那么它们是一回事儿吗?现在让我来揭晓答案吧! JavaScript 是一种嵌入式脚本文件,直接插入网页,有浏览器一边解释一边执行. java 语言不一样,他必须在JAVA虚拟机上运行.而且事先需要进行编译. JAVA的语法规则比JavaScript要严格的多,功能要强大的多. 首先,这两个家伙没有任何的血缘关系,java是是由Sun 公司于1995年5月推出的,而javascript是于1995年由Netscape公司设计实现而成的,由于Netsc

  • JavaScript内置对象介绍

    目录 一.内置对象 二.Math对象 1.Math对象的使用 2.生成指定范围的随机数 三.日期对象 1.Date()方法的使用 2.日期对象的使用 3.获取时间戳 四.数组对象 1.数组对象的创建 2.检测是否为数组 3.添加删除数组元素的方法 4.数组排序 5. 数组索引方法 6.数组转换为字符串 五.字符串对象 1.根据字符返回位置 2. 根据位置返回字符 3. 字符串操作方法 4.split()方法 一.内置对象 内置对象就是指 JS 语言自带的一些对象,这些对象供开发者使用,并提供了一

  • java多态中的就近原则介绍

    直接上题: 题目补充: class A { int m; //-10 int getM() { return m; } int seeM() { return m; } } class B extends A { int m ; //10 int getM() { // System.out.println(this.m+"............"+super.m); return m+10; } } public class Test { public static void ma

  • JavaScript 与 Java 区别介绍  学java怎么样

    java和javascript长得是如此地相像,那么它们是一回事儿吗?现在让我来揭晓答案吧! JavaScript 是一种嵌入式脚本文件,直接插入网页,有浏览器一边解释一边执行. java 语言不一样,他必须在JAVA虚拟机上运行.而且事先需要进行编译. JAVA的语法规则比JavaScript要严格的多,功能要强大的多. 首先,这两个家伙没有任何的血缘关系,java是是由Sun 公司于1995年5月推出的,而javascript是于1995年由Netscape公司设计实现而成的,由于Netsc

随机推荐