js设计原则学习笔记

185 阅读4分钟

本文参考自曾探老师的《JavaScript设计模式与开发实践》,为读后总结。

设计原则

我们不应该为了遵循设计原则而编码,应该为了实现功能或作代码优化来参考设计原则。

单一职责原则

一个对象只做一件事情

  • 代理模式:功能职责隔离 例:设计一个上传图片的功能,而上传之前需要对图片格式大小做校验。我们可以先封装上传图片功能作为单一职责,用格式大小校验的方法做代理模式
  • 迭代器代理:我们不关心循环如何执行,只关心循环执行时每一项如何操作。
  • 单例模式:单例功能应该和需要创建的对象分离
  • 装饰者模式:我们通常让类或者对象一开始只具有一些基础的职责,更多的职责在代码运行时被动态装饰到对象上面。装饰者模式可以为对象动态增加职责,从另一个角度来看,这也是分离职责的一种方式。

最小知识原则(迪米特法则)

  • 中介模式:以中介者的方式为多方进行通信,而不是多方直接通信,以达到低耦合

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

  • 外观模式:为多个子系统提供一个统一对外的接口,使外界能更方便的使用

例1:手机的照相功能,用户只需点击拍照,防抖、美图、柔光等功能相机内部都处理了。

例2:antd和ant pro的关系

开闭原则(核心原则)

当需要改变一个程序的功能或者给这个程序增加新功能的时候,可以使用增加代码的方式,但是不允许改动程序的源代码。

相比修改源程序,如果通过增加几行代码就能解决问题,那这显然更加简单和优雅,而且增加代码并不会影响原系统的稳定

书内故事:有一家生产肥皂的大企业,从欧洲花巨资引入了一条生产线。这条生产线可以自动完成从原材料加工到包装成箱的整个流程,但美中不足的是,生产出来的肥皂有一定的空盒几率。于是老板又从欧洲找来一支专家团队,花费数百万元改造这一生产线,终于解决了生产出空盒肥皂的问题。 另一家企业也引入了这条生产线,他们同样遇到了空盒肥皂的问题。但他们的解决办法很简单:用一个大风扇在生产线旁边吹,空盒肥皂就会被吹走。

例如vue的mixin内部实现,如果我们想在组件加载前做一些事情,而又不想破坏组件本身

  • 用对象的多态性消除分支(if else switch)

  • 找出变化的部分,将不变与可变分离。例如放置hook、使用callback

  • 发布订阅模式

发布订阅模式用来降低多个对象之间的依赖关系,它可以取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口。当有新的订阅者出现时,发布者的代码不需要进行任何修改;同样当发布者需要改变时,也不会影响到之前的订阅者。

例如document监听事件、mqtt监听事件等。

  • 模版方法模式 同接口和抽象类,需要新的实现时,只需增加子类

让程序一开始就尽量遵守开放封闭原则,并不是一件很容易的事情。一方面,我们需要尽快知道程序在哪些地方会发生变化,这要求我们有一些“未卜先知”的能力。另一方面,留给程序员的需求排期并不是无限的,所以我们可以说服自己去接受不合理的代码带来的第一次愚弄。在最初编写代码的时候,先假设变化永远不会发生,这有利于我们迅速完成需求。当变化发生并且对我们接下来的工作造成影响的时候,可以再回过头来封装这些变化的地方。然后确保我们不会掉进同一个坑里,这有点像星矢说的:“圣斗士不会被同样的招数击倒第二次。”