JavaScript 中的 SOLID 原则(四):“I”代表什么

简介: JavaScript 中的 SOLID 原则(四):“I”代表什么

本篇是SOLID原则的第四部分,建议先阅读前三部分:

JavaScript 中的 SOLID 原则(一):“S”代表什么

JavaScript 中的 SOLID 原则(二):“O”代表什么

JavaScript 中的 SOLID 原则(三):“L”代表什么

这是SOLID的第四篇文章(原文一共五篇),作者是serhiirubets,欢迎持续关注。

接口隔离原则(Interface Segregation Principle)

I - 接口隔离原则。这个原则是指:客户端不应该依赖他们不使用的接口(接口应该是精简的,拥有尽可能少的行为)。

这是什么意思? 这个原则是关于接口的,但是在JavaScript中没有接口,不过有类似的东西,那就是类。虽然两者不一样,但是这个原则可以应用到JS类上。

对于JS类来说,这个原则是指当我们创建一个基础类,需要在其中定义所有子类都会用到的方法,并且避免只有部分子类会用到的方法。举个简单的例子,当我们创建一个Transport的基础类并添加以下方法:move,stop,fly和sail。示例中的方法只添加了console.log,实际应用中对应的应该是真正的业务逻辑。

classTransport {

 move() {

   console.log('move');

 }

 stop() {

   console.log('stop');

 }

 fly() {

   console.log('fly');

 }

 sail() {

   console.log('sail');  

 }

}

我们再创建三个子类:Plane, Car 和 Ship。

classPlaneextendsTransport {

 sail() {

   returnnull;

 }

}

classCarextendsTransport {

 fly() {

   returnnull ;

 }

 sail() {

   returnnull;

 }

}

classShipextendsTransport {

 fly() {

   returnnull ;

 }

}

你可能注意到了,每个子类中重写了继承的方法,并返回了null。为什么这么做呢,拿Plane举例,飞机可以fly和move,但是不能sail(船类航行)。

我们的基类包含了sail逻辑,但是飞机不能sail。我们应该做一些事情,因为有人可能会调用plane实例上的sail方法,我们可以抛出错误或者像现在一样重写sail方法。其他两个类也是同样的处理方式,Car重写了fly和sail,ship重写了fly。

所以问题在于:我们创建的基类包含的方法,有的子类可以使用,但其他的子类不能。这就是接口隔离原则所指的:我们不应该在基类中创建子类不会使用到的逻辑。

当然,这个和多态没有关系,如果我们创建了一个通用的方法,但是每个子类都会重写这个方法逻辑,是可以的。

举个例子:我们有一个Animal基类,包含一个breathe方法,它的子类也可以breathe但是使用了不同的方式,我们可以使用多态:

classAnimal {

 breath() {

   console.log('common breath')

 }

}

classHumanextendsAnimal {

 breath() {

   console.log('lung breath')

 }

}

classFishextendsAnimal {

 breath() {

   console.log('gills breath')

 }

}

再重温一下接口隔离原则:正确的在基类中创建方法,这些方法应该被继承的子类所使用。

那么我们怎么解决Transport类中的问题呢?我们可以创建更具体的子类,子类中包含只有自身会使用到的方法:

classTransport {

 move() {

   console.log('move')

 }

 stop() {

   console.log('stop')

 }

}

classFlyingTransportextendsTransport {

 fly() {

   console.log('fly')

 }

}

classSailingTransportextendsTransport {

 sail() {

   console.log('sail')

 }

}

classCarextendsTransport {}

classPlaneextendsFlyingTransport {}

classShipextendsSailingTransport {}

现在我们的Transport基类包含了move和stop两个方法,这两个方法可以用在所有的子类。我们还创建了两个具体的子类,plane可以继承FlyingTransport,轮船可以继承SailingTransport。

这就是“SOLID”原则中“I”的含义:这个原则主要的目的是让代码拥有良好的层次结构,尽量不要在基类中创建子类不需要的方法。

欢迎关注微信公众号”混沌前端“

推荐阅读:

基于TypeScript理解程序设计的SOLID原则

clean-code-javascript: SOLID

相关文章
|
设计模式 缓存 JavaScript
你不知道的javascript设计模式(十七) ----编程设计原则和设计规则
你不知道的javascript设计模式(十七) ----编程设计原则和设计规则
105 0
|
存储 SQL 缓存
JavaScript 中的 SOLID 原则(五):“D”代表什么
JavaScript 中的 SOLID 原则(五):“D”代表什么
|
JavaScript 前端开发
JavaScript 中的 SOLID 原则(三):“L”代表什么
JavaScript 中的 SOLID 原则:“L”代表什么
|
设计模式 前端开发 JavaScript
JavaScript 中的 SOLID 原则(二):“O”代表什么
JavaScript 中的 SOLID 原则:“O”代表什么
|
设计模式 JavaScript 前端开发
JavaScript 中的 SOLID 原则(一):“S”代表什么
JavaScript 中的 SOLID 原则:“S”代表什么
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
100 2
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
134 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
85 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
76 4