深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解

让我来详细讲解一下“深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解”的攻略。

1. 什么是接口隔离原则(ISP)

接口隔离原则(Interface Segregation Principle,简称ISP),是S.O.L.I.D设计原则中的第四个原则。
它指出“客户端不应该依赖于它不需要的接口”。
简单来说,一个类应该仅对它需要使用的方法进行依赖,而不是依赖于其它不需要的方法。

2. 为什么需要接口隔离原则(ISP)

在实际开发中,经常会遇到由一个接口提供多种方法的情况。如果一个类依赖于一个拥有多个方法的接口,而仅使用了其中的一部分方法,
那该类就会因为依赖无用的方法而被污染,从而使得这个类之间的函数耦合度变得更高。

当一个接口中包含的方法非常多,而我们的实现类中只需要使用其中的部分方法时,
如果我们不对这个接口进行一定的拆分,就会导致实现类实现接口中不需要的方法,这显然会造成一定的浪费。

3. 如何遵守接口隔离原则(ISP)

为了遵守接口隔离原则,在设计接口的时候,需要将类似的方法放到一起,避免接口中出现无关的方法,并将较细的接口拆分成更小的和更具体的接口,
让接口的使用者只需知道与其相关的方法即可。
这样做的好处在于更改接口时不会影响到不需要关注的类,而且在使用的时候也不需要关注不必要的方法,减少了耦合度。

例如下面是一个违反接口隔离原则的实现示例:

class UserService {
  constructor(database) {
    this.database = database;
  }

  getAllUsers() {
    // 返回所有用户的数据
  }

  getUserById() {
    // 返回指定id用户的数据
  }

  updateUser() {
    // 更新用户
  }

  deleteUser() {
    // 删除用户
  }

  createUser() {
    //创建用户
  }
}

在这个例子中,所有的用户数据都需要通过UserService这个类来进行读取、更新、删除和创建。
但是对于一些场景,我们可能只需要读取或创建用户而不需要更新或删除用户,如果我们使用UserService,就会因为依赖了无用的方法而被污染。

为了符合ISP原则,我们可以将其拆分为更具体的接口:

interface IUserReader {
  getAllUsers();
  getUserById();
}

interface IUserCreator {
  createUser();
}

interface IUserUpdater {
  updateUser();
}

interface IUserDeleter {
  deleteUser();
}

class UserService implements IUserReader, IUserCreator, IUserUpdater, IUserDeleter {
  constructor(database) {
    this.database = database;
  }

  getAllUsers() {
    // 返回所有用户的数据
  }

  getUserById() {
    // 返回指定id用户的数据
  }

  updateUser() {
    // 更新用户
  }

  deleteUser() {
    // 删除用户
  }

  createUser() {
    //创建用户
  }
}

通过拆分接口,我们就可以只依赖于需要使用的方法,而不会依赖不必要的方法。假设我们只需要读取用户信息,那么就只需要依赖IUserReader接口即可。

4. 拓展

除了单一职责原则、开闭原则和里式替换原则之外,接口隔离原则也是我们在实际开发中非常重要的一个设计原则。在大型的软件系统中,ISP原则可以使得代码的设计更加优美和可维护性更强。

一个优秀的设计模式应该是一个能够在需求更改时降低修改成本和工作量的系统架构,而接口隔离原则就是这种类型的优秀设计模式所必不可少的一部分。

我们需要在实际的工程项目中更加注重细节和拆分,不断提高对原则的理解和应用,从而能够更好的应对复杂的业务场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 教你javascript如何获取对象的key和value

    当需要遍历一个JavaScript对象时,我们可能需要获取其key和value。下面是获取JavaScript对象key和value的两种方式: 获取对象key的方法 我们可以使用 for…in 循环语句来获取JavaScript对象的所有key: for(let key in obj) { console.log(key); // 输出该对象的所有ke…

    JavaScript 2023年5月27日
    00
  • jQuery中ajax的get()方法用法实例

    下面是“jQuery中ajax的get()方法用法实例”的完整攻略。 简介 在 jQuery 中,我们可以使用 ajax 功能从服务器获取数据。而 get() 方法是 ajax 功能中常用的方法,它会向服务器发送一个 get 请求,获取指定的数据并返回它们。 get() 方法基本用法 $.get(url, [data], [callback], [type]…

    JavaScript 2023年6月11日
    00
  • layui多iframe页面控制定时器运行的方法

    下面是针对“layui多iframe页面控制定时器运行的方法”的完整攻略。 1. 创建iframe页面 首先,在需要嵌入控制定时器的页面中创建iframe页面,例如: <body> <div class="layui-container"> <div class="layui-row"&g…

    JavaScript 2023年6月11日
    00
  • JavaScript与C# Windows应用程序交互方法

    JavaScript与C# Windows应用程序交互方法 本文将介绍在 Windows 应用程序中如何实现 JavaScript 与 C# 相互通信的方法,主要包括以下内容: 通过 WebView 控件实现 JavaScript 与 C# 的通信 JavaScript 调用 C# 方法示例 C# 调用 JavaScript 方法示例 实现 JavaScri…

    JavaScript 2023年5月27日
    00
  • js正则格式化日期时间自动补0的两种解法

    下面是“js正则格式化日期时间自动补0的两种解法”的完整攻略。 步骤一:获取日期时间值 首先,我们需要获取日期时间的值,通常可以用 Date 对象。 const date = new Date(); 解法一:使用 String.prototype.padStart() String.prototype.padStart() 是 ES2017 中新增的方法,可…

    JavaScript 2023年5月27日
    00
  • 基于JS判断对象是否是数组

    判断对象是否是数组是前端开发中非常常见的操作。在Javascript中,可以使用Array.isArray()方法来判断对象是否是数组。 下面是使用Array.isArray()方法判断对象是否是数组的完整攻略: 方法一:使用Array.isArray()方法 Array.isArray()方法接受一个参数,如果该参数是数组则返回true,否则返回false…

    JavaScript 2023年5月27日
    00
  • threeJs实现波纹扩散及光标浮动效果详解

    Three.js实现波纹扩散及光标浮动效果详解 概述 本教程将介绍如何使用Three.js库实现波纹扩散效果及光标浮动效果。波纹扩散效果常见于网页设计中,而光标浮动效果则经常出现在用户交互的UI设计中。 本文主要分为以下三个部分: 前置知识 波纹扩散效果实现 光标浮动效果实现 本文中的所有代码都可在 codepen 中找到。 一、前置知识 要实现本教程中的效…

    JavaScript 2023年6月11日
    00
  • 前端实现字符串GBK与GB2312的编解码(小结)

    前端实现字符串GBK与GB2312的编解码是用JS实现编解码操作,它需要涉及到对二进制码的操作。在操作编解码之前,我们需要先了解一些概念和原理。 GBK和GB2312是中文编码标准,其中GBK支持繁体中文;GB2312仅支持简体中文。 GBK字符集的起始位置与GB2312相同,但GBK字符集支持更多的汉字,因此GBK兼容GB2312,但GB2312不兼容GB…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部