Article
迪米特法则:黄药师的独来独往
· 6 分钟阅读
黄药师以神秘莫测著称,他很少与外界过多接触,保持着一种神秘的距离感。迪米特法则就如同黄药师的性格,一个对象应该对其他对象保持最少的了解,减少对象之间的交互。这就像黄药师在江湖中独来独往,不会轻易与他人产生过多的联系。通过迪米特法则,我们可以降低对象之间的耦合度,提高代码的可维护性和可扩展性。

只和直接的朋友说话
迪米特法则强调:一个对象应该对其他对象有最少的了解。即每一个单位对其他单位的信息只限于那些与本单位密切相关的单位。这意味着对象之间的交互应尽可能少,并且只限于直接的朋友。
示例:汽车和引擎的交互
通过将汽车和引擎的交互封装在汽车类内部,使得客户端只需与汽车类交互,而不直接与引擎类交互,降低了客户端与引擎类的耦合。
类和实现
// 类:引擎
class Engine {
start(): void {
console.log("Engine started");
}
}
// 类:汽车,只与自己直接工作的对象通信
class Car {
private engine: Engine;
constructor() {
this.engine = new Engine();
}
startCar(): void {
this.engine.start();
console.log("Car started");
}
}
让汽车自己启动引擎
const car = new Car()
car.startCar()
// 输出:
// Engine started
// Car started
类图

体现迪米特法则的设计模式
- 外观模式(Facade Pattern):它提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更容易使用,客户端通过外观类与子系统的内部复杂性隔离。
- 中介者模式(Mediator Pattern):通过创建一个中介对象,减少了各个对象之间的相互作用,使得对象之间紧密耦合变为松散耦合,中介者知道所有的具体类,并负责转发调用,从而实现了迪米特法则。
- 观察者模式(Observer Pattern):在此模式中,对象(被观察者)维持一系列依赖于它们的对象(观察者),将有关状态的任何变更自动通知给观察者对象。观察者和被观察者之间的耦合被最小化,观察者不需要了解被观察者内部的细节。
组件之间该隔多远
- 组件与组件库:在使用Vue.js、React等现代前端框架时,组件内部逻辑被封装,外界通过Props(React)或Props/Events(Vue)与组件交互。开发者在使用组件时不需要了解其内部实现,体现了迪米特法则原则。
- 状态管理库(Redux/Vuex):在大型前端应用中,状态管理变得复杂。通过使用像Redux这样的库,可以将状态管理逻辑集中在一处,组件只需要知道如何发送动作(actions)和订阅到状态(state),而不需要了解状态是如何被更新和管理的。
- Ajax请求封装:前端应用中发起网络请求是常见需求,通过封装HTTP请求的逻辑(例如使用Axios库),组件或者页面只需要调用封装好的函数即可发起请求,无需了解底层网络请求的细节。
Axios:把网络细节封在身后
- Axios:作为一个基于Promise的HTTP客户端,为浏览器和node.js提供简单的API,让上层代码不需要直接处理XMLHttpRequest或是Node的http模块,屏蔽了底层细节。
- Redux(及类似的Vuex):这些状态管理库让状态的操作和变更逻辑集中管理,组件只需要通过简单的接口进行交互,比如触发action或订阅状态变更,而不需要关心状态是如何变更的,减少了组件对状态变更逻辑的依赖。
Keep Reading