javascript原理_了解JavaScript中的SOLID原理

javascript原理

SOLID原理的发明始于80年代后期。 Robert C. Martin在争辩USENET(一种早期的Facebook)上的软件设计原理时就开始发展这些原理。 经过加减运算后,罗伯特·C·马丁(Robert C. Martin)在2000年代初制定了这些原则。 直到2004年,这些原则才被整理并称为SOLID原则。 它是代表五个特定设计原则的首字母缩写。

  • S代表单一责任原则
  • O代表开闭原则
  • L代表Liskov替代原理
  • 代表接口隔离原则
  • D表示依赖倒置原则

SOLID原理在构造单个模块或更大的体系结构时很有用。 因此,我们将探索每个原理以及JavaScript中的示例。

单一责任原则

TomDeMarco¹和MeilirPage-Jones²的著作中描述了这一原理。 他们称之为凝聚力。 他们将凝聚力定义为模块元素的功能相关性。

SRP有什么问题?

实际上,由于其名称特别不合适,因此可能对这一原理的了解最少。 许多开发人员了解每个模块都应该做一件事。 没错,有这样的原则。 但这不是SOLID原则之一,实际上不是SRP。

那么,什么是SRP?

描述如下:“ 每个软件模块只有一个更改理由 ”。 因为,为了满足用户需求和利益相关者而对软件系统进行了更改,所以我们可以改写这样的原则:“ 每个模块都应该对一个用户或利益相关者负责,而只能对一个用户或利益相关者负责 但是,可能会有不止一个用户或利益相关者希望系统以相同的方式进行更改,我们称他们为参与者或团体,因此最终版本是:“ 每个模块都应对一个模块负责,而只有一个模块负责,演员 ”。

我们看一些例子来了解什么是SRS

假设我们有一个Employee对象,它具有三个函数:calculatePay(),reportHours()和save()。

不幸的是,它违反了SRP,因为这三个功能负责三个不同的参与者。

  • calculatePay()函数负责会计部门。
  • reportHours()函数由人力资源部门使用。
  • save()函数由数据库管理员指定。

因此,避免此问题的方法是分离支持不同参与者的代码。

EmployData对象保存一个共享的简单数据结构,所有三个参与者都使用它。

PayCalculator对象具有calculatePay()方法。

HourReporter对象具有reportHours()方法。

EmployeeServer对象具有save()方法。

这就是我们使用SRS重构错误代码的方式。 每个职能负责一个特定的参与者。 SRP是最简单的原则之一,也是最难解决的原则之一。

开闭原则

伯特兰·迈耶(Bertrand Meyer)在1980年代使这一原理声名远播,并出现在他的《面向对象的软件构造》一书中。 软件系统设计为允许通过添加新代码而不是更改现有代码来更改那些系统的行为。

什么是开放式原则(OCP)?

OCP声明以下内容:“ 软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改” (作者:Meyer,Bertrand) 该原则建议我们重构系统,以使此类进一步更改不会引起更多修改。 大多数开发人员都将OCP视为指导他们设计类和模块的原则。

OCP中有两个主要属性。

  • 开放扩展-我们能够扩展模块的功能。
  • 已关闭进行修改-扩展模块的行为不会导致更改模块的源代码或二进制代码。

似乎这两个属性相互矛盾,因为扩展模块行为的正常方法是更改​​该模块的源代码。

那么,如何实施OCP?

假设每个员工都有角色并被授予特权。 但是,如果我们在系统中引入新角色并且不修改现有内容,该怎么办。 因此,我们可以像下面的示例一样使它通过OCP。

因此,如上例所示,我们不必修改现有代码,而可以对其进行扩展以添加新角色。 OCP是系统体系结构背后的驱动力之一。 目的是使系统易于扩展,而不会引起很大的变更影响。

里斯科夫替代原则

芭芭拉·李斯科夫(Barbara Liskov)著名的子类型定义,是从1988年在一次会议上的主题演讲中,题为数据抽象和层次结构。 简而言之,该原则表示,要从可互换的零件构建软件系统,这些零件必须遵守一项合同,该合同允许将这些零件彼此替换。

您可以通过以下方式理解它

此原理的经典示例之一是具有四个边的矩形。 矩形的高度可以是任何值,宽度可以是任何值。 正方形是宽度和高度相等的矩形。 因此,可以说我们可以将矩形类的属性扩展为正方形类。 为此,您需要将子类(正方形)与父类(矩形)交换,以适应具有四个相等边的正方形的定义,但是派生类不会影响父类的行为,因此如果您愿意它将违反《里斯科夫换人原则》。

看看出了什么问题?

考虑我们有一个使用如下矩形对象的应用程序。

基于正方形是边长相等的矩形的知识,我们决定创建一个正方形对象以代替矩形。

不幸的是,当应用程序尝试使用我们的正方形代替矩形时,发现了一个问题。 事实证明,其中一种方法可以像这样计算矩形的面积。

当使用正方形调用该方法时,乘积为16而不是期望值12。我们的正方形对象在面积函数方面违反了Liskov替换原理。 在这种情况下,length和width属性的存在提示我们的正方形可能最终不会与矩形100%兼容,但是我们并不总是有这样明显的提示。

接口隔离原理

该原则建议软件设计人员避免依赖于他们不使用的东西。

以一个简单的例子来理解ISP

假设您进入餐厅,并且您是纯素食主义者。 那家餐厅的服务员给了您菜单卡,其中包括素食,非素食,饮料和糖果。 在这种情况下,作为客户,您应该拥有一张菜单卡,其中仅包含素食,而不包含您不食用的所有食物。

在这里,针对不同类型的客户,菜单应该有所不同。 每个人的通用或通用菜单卡可以分为多个卡,而不是一个。 使用此原理有助于减少副作用和所需更改的频率。

如何在JavaScript中实现ISP?

因为我们默认情况下在JavaScript中没有接口。 但是我们所有人都会遇到想要在类的构造函数上做很多事情的情况。 那么,如何立即实施ISP?

假设我们必须在构造函数中进行一些设置。 我们所做的设置应与构造函数中其他不需要的设置区分开。

在这里,即使不是一直需要,validateUser()函数也将在initializeUser()构造函数调用中被调用。 我们可以使用以下代码将其引入ISP。

如上述代码所示,我们正在将不需要的逻辑与承包商函数隔离开。

依赖倒置原则

在讨论本主题之前,请记住,依赖倒置和依赖注入都是不同的概念。 大多数人对此感到困惑,并认为两者是相同的。 现在要牢记这一原则。

不要与依赖注入原理混淆

依赖倒置原则(DIP)告诉我们,最灵活的系统是其中源代码依赖项仅指抽象而不是指称的系统。 相反,细节应取决于政策。

看一个真实的例子

您可以考虑电视遥控器电池的真实示例。 您的遥控器需要电池,但不取决于电池品牌。 您可以使用任何想要的XYZ品牌,它将起作用。 因此,可以说电视遥控器与品牌名称是松散耦合的。 依赖倒置使您的代码更可重用。

如何在JavaScript中实现DIP?

在像Java这样的静态类型语言中,这意味着use,import和include语句应仅引用包含接口,抽象类或某种其他抽象声明的源模块。 没有什么应该依赖的。 如果使用JavaScript,我们如何实现DIP?

让我们举一个简单的例子来了解我们如何轻松地做到这一点。

我想联系服务器获取一些数据。 如果不应用DIP,则可能如下所示。

使用DIP,我可能会改为编写类似的代码。

fillFromServer("/address/to/data" , thingyView)

对于我们要使用jQuery的Ajax的特殊情况,抽象fillFromServer函数可以实现如下。

可以针对具有ID为Thingy1Thingy2的元素的视图的特定情况实现抽象视图,如下所示。

容易吧? 我希望这使您对如何在JavaScript中应用SOLID原理有基本的了解。

先前发布在 https://medium.com/javascript-in-plain-english/rethinking-solid-principles-in-javascript-7effdd4dc37d

翻译自: https://hackernoon.com/understanding-solid-principles-in-javascript-w1cx3yrv

javascript原理

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值