跳至主要內容

迪米特法则

微信公众号:储凡2023/11/29大约 9 分钟

迪米特法则

又叫最少知道原则,一个实体应当尽量少的与其它实体发生相互作用,使得功能模块相互独立,要求一个对象应该对其他对象有尽可能少的了解,它应该只与紧密相关的对象进行交互。

换句话说,一个对象不应该直接与陌生对象通信,而是通过中间对象进行间接交互。这样可以**降低对象之间的耦合性,提高代码的可维护性和可测试性 **。

迪米特法则强调模块之间应该尽量减少彼此的依赖,一个对象应该对其他对象有尽可能少了解。迪米特法则 有助于降低系统的耦合性,提高模块的独立性和可维护性。

解释:

  • 从依赖者的角度来说,只依赖应该依赖的对象。
  • 从被依赖者的角度说,只暴露应该暴露的方法。
  • 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
  • 在类的结构设计上,尽量降低类成员的访问权限。
  • 在类的设计上,优先考虑将一个类设置成不变类。
  • 在对其他类的引用上,将引用其他对象的次数降到最低。
  • 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。

举例说明

这里通过一个例子对迪米特法则进行说明。例如:

有两个类:PersonTeam

  • Person 类表示一个人,具有一个私有的姓名属性和一个公有的 getName 方法用于获取人的姓名。
  • Team 类表示一个团队,具有一个私有的成员数组属性(类型为 Person[]),以及公有的 addMember 方法用于添加成员,和 printTeamMembers 方法用于打印团队成员的姓名。

创建两个 Person 对象:johnjane,创建一个 Team 对象 team,将 johnjane 添加为团队成员,并调用 printTeamMembers 方法打印团队成员的姓名。

Team 类中的 printTeamMembers 方法中,只通过调用 Person 对象的 getName 方法来获取人的姓名, 而不直接访问 Person 对象的私有属性。这样,Team 类只依赖于 Person 类提供的公共接口,降低了类之间的耦合性,符合迪米特法则。

/**
 * 迪米特法则Demo
 * 又叫最小知道原则
 */

class Person {
  private readonly name: string

  constructor(name: string) {
    this.name = name
  }

  getName(): string {
    return this.name
  }
}

class Team {
  private readonly members: Person[]

  constructor() {
    this.members = []
  }

  addMember(member: Person): void {
    this.members.push(member)
  }

  printTeamMembers(): void {
    for (const member of this.members) {
      console.log(member.getName())
    }
  }
}

// 使用示例
const john = new Person('John')
const jane = new Person('Jane')
const team = new Team()

team.addMember(john)
team.addMember(jane)

team.printTeamMembers()

迪米特法则的核心思想是要求模块之间尽量减少彼此的直接依赖,通过封装和合理设计接口,使得模块之间只依赖于最少的其他模块。 这样可以提高系统的可维护性、可扩展性和灵活性,减少模块之间的耦合性。

迪米特法则的目标是降低对象之间的耦合性,通过尽量减少依赖关系,使得系统的各个模块更加独立、可维护和可扩展。

迪米特法则鼓励开发人员设计出低耦合、高内聚的模块,让每个模块只关注自己的核心功能,尽量减少对其他模块的了解和依赖。这样的设计能够增强系统的灵活性、可维护性和可扩展性。

更新日志

2025/5/18 18:01
查看所有更新日志
  • 24657-feat: 基于@142vip/vuepress对站点升级,简化配置、优化整体结构 (#234)
  • c0f2d-refactor: 升级vuepress相关版本,优化项目结构 (#137)
  • 6b33b-feat(ES6): 新增2016新增特性和ts文档
  • e6a79-feat: 大幅新增设计模式、Linux命令、ORM框架教程文档