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

yizhihongxing

让我来详细讲解一下“深入理解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日

相关文章

  • AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】

    让我来详细讲解一下“AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】”的完整攻略。 什么是w5cValidator? w5cValidator是一个简单易用的AngularJS表单验证框架,可以通过自定义指令来验证表单元素的合法性,并且支持内置的一些常用验证规则。 如何使用w5cValidator? 步骤一:引入w5cVali…

    JavaScript 2023年6月10日
    00
  • thinkphp3.x中session方法的用法分析

    ThinkPHP3.x中Session方法的用法分析 什么是Session Session是Web 开发中常用的一种保持用户会话状态的技术,在服务器端保存用户数据,用于跨页面或跨请求访问这些数据,实现用户身份认证,数据的持久化等功能。 ThinkPHP3.x中的Session ThinkPHP3.x封装了Session操作类,使用时可通过以下实例化方法获取S…

    JavaScript 2023年6月11日
    00
  • 浅谈对于“不用setInterval,用setTimeout”的理解

    浅谈对于“不用setInterval,用setTimeout”的理解 对于JavaScript中定时器的使用,我们常常会听到这样一种建议:不要使用setInterval,而应该使用setTimeout。 为什么会这样说呢?这是因为使用setInterval存在一些风险,比如说多个定时器的执行时间可能会出现重叠,导致程序出现不可预料的异常。 相反,使用setT…

    JavaScript 2023年6月11日
    00
  • 弱类型语言javascript中 a,b 的运算实例小结

    为了理解“弱类型语言javascript中 a,b 的运算实例”,需先了解JS的数据类型。 JS的7种数据类型分为两种类型:原始类型和引用类型。- 原始类型:数字(Number)、字符串(String)、布尔(Boolean)、null、undefined、Symbol- 引用类型:对象(Object)、数组(Array)、函数(Function) JS中的…

    JavaScript 2023年6月10日
    00
  • Js 刷新框架页的代码

    要刷新网页的话可以使用JavaScript的location.reload()函数。该函数会重新加载当前网页,现在我们来分步骤说明如何实现这个功能: 步骤一:创建按钮 首先,在HTML中创建一个按钮(或其他适合的元素)。 <button onClick="refreshPage()">刷新页面</button> 步…

    JavaScript 2023年6月11日
    00
  • Javascript中正则表达式的使用及基本语法

    下面是Javascript中正则表达式的使用及基本语法的完整攻略。 一、什么是正则表达式 正则表达式,也称为正规表示式、regex或regexp,是用于匹配字符串中模式的一种表达式。正则表达式在大多数编程语言中都是支持的,它允许我们快速地检索和替换文本。 二、正则表达式的语法 Javascript中使用正则表达式时,需要通过RegExp对象来创建和使用。其基…

    JavaScript 2023年5月19日
    00
  • ASP.NET入门随想之检票的老太太

    ASP.NET入门随想之检票的老太太 检票的需求 假设我们有一个旅游景点,景点内有一个门口,游客需要向门口处的老太太出示购票凭证,才能被允许进入景区。我们需要一个简单的系统,记录每位游客的购票情况并实时更新,向老太太提供明确的验证结果。 解决方案 基于上述的需求,我们可以使用ASP.NET框架来开发一个Web应用程序,并利用ASP.NET的强大功能来实现检票…

    JavaScript 2023年6月11日
    00
  • js函数调用常用方法详解

    js函数调用常用方法详解 在JavaScript编程中,函数是最基础的概念之一。函数是一段可重复使用的代码,可以在不同的上下文中多次调用。在本文中,我们将详细讲解JavaScript函数调用的常用方法。 常规函数调用 通常,我们会使用以下语法来定义函数: function functionName(param1, param2, …) { // 函数体 …

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