迪米特原则|设计原则

简介: 本文是讲述 六大设计原则 的最后一篇,为大家讲述 迪米特原则

前置知识

  • 了解单一职责原则
  • 了解接口隔离原则
  • 了解封装特性

前言

本文是讲述 六大设计原则 的最后一篇,为大家讲述 迪米特原则

迪米特原则的英文释义如下

Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.

翻译出来,有点拗口,我们可以直接看百度的释义

迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。

总结出来就是:不该有直接依赖关系的模块不要有依赖。有依赖关系的模块之间,尽量只依赖必要的接口

这个原则和单一职责原则类似,也和接口隔离原则类似。

下面为大家简述迪米特原则的重点,以及与其他原则的不同所在

如何用好迪米特原则

我们总结的迪米特原则有两句话,事实上分别把这两句话用好,就可以用好迪米特原则了。

第一句话是:不该有直接依赖关系的模块不要有依赖

对于这一句话,我们需要分析大致有哪几种无需依赖关系的情况,我们却使用了依赖。

  1. A类需要B类相关的某些属性,却把B类全部传入
  2. 从业务含义上,A类无需依赖B类,只是依赖其它类的时候,借助了B类做一个工具
  3. 业务上,A需要依赖B的函数,但无需依赖属性

以上的两种情况,都是依赖了无直接关系模块,就是违背了迪米特原则。那我们要遵循好原则的第一句话,即把对应的错误情况解决即可。

  • 对于第一个错误,我们将传入的参数修改为对应的属性即可。
  • 第二个错误,我们借助其他例如工厂模式,让工厂类依赖B类,使用工程类创建好A类即可。
  • 而第三个错误,处理得很简单,把属性私有化即可,如此依赖B的时候,也就不会无意间调用到属性了。可见封装的特性也是迪米特原则的关键。

当然,违反迪米特原则的问题还有很多,我们需要善于 review 我们的代码,将违反对应原则的代码找出来,修复即可。

第二句话:有依赖关系的模块之间,尽量只依赖必要的接口

当模块之间,类之间确切有业务依赖关系的时候,最好只依赖当前需要的接口。我们在前文 继承和组合如何选择|设计模式基础 中有使用 组合+接口+委托 的方式让子类只依赖自身需要依赖的接口;在 接口隔离原则|设计原则 中,也把多余的接口独立开来。

本文继续引用 组合 一文中的demo,为大家展示如何减少不必要的依赖。

具体代码如下(From:《设计模式之美》):

public interface Flyable {
  void fly();
}
public class FlyAbility implements Flyable {
  @Override
  public void fly() { //... }
}
//省略Tweetable/TweetAbility/EggLayable/EggLayAbility
public class Ostrich implements Tweetable, EggLayable {//鸵鸟
  private TweetAbility tweetAbility = new TweetAbility(); //组合
  private EggLayAbility eggLayAbility = new EggLayAbility(); //组合
  //... 省略其他属性和方法...
  @Override
  public void tweet() {
    tweetAbility.tweet(); // 委托
  }
  @Override
  public void layEgg() {
    eggLayAbility.layEgg(); // 委托
  }
}
复制代码

当上述的 Ostrich 只需依赖 TweetableEggLayable  两个接口的时候,我们就只继承这两个接口,当然,前提是我们要把接口颗粒度降低、细化。

迪米特原则与其他原则的不同

迪米特原则与单一职责原则

迪米特注重 调用类与被调用类 之间的关系,主要让两者的联系最小,其重于实现低耦合;而单一职责更关系本身是否功能单一、涉及的业务单一,其重于实现高内聚

迪米特原则与接口隔离原则

迪米特原则与接口隔离原则之间,有两点的不同,一是涉及的范围不同,二是目的不同。

范围不同

迪米特原则的范围包括类,属性,接口等,所有拥有依赖关系的都涉及到迪米特原则。

而接口隔离原则只涉及到接口,要求接口符合单一即可。

目的不同

迪米特原则的目的是:让依赖的模块间低耦合,其涉及初衷就是降低模块间的关联。

而接口隔离原则的目的是:让接口功能单一,以提升复用性和拓展性。这也间接的使得模块间变得低耦合。


相关文章
|
2月前
|
人工智能 自然语言处理 数据可视化
一文带你看懂,火爆全网的Skills到底是个啥
Skills是AI智能体的“可插拔技能包”,类似工作手册库:按需加载、专业高效。它不同于Prompt(指令)和MCP(连接协议),而是封装了完整任务流程(如PDF处理、数据分析)的能力模块。GitHub已超8万Skills,正推动AI从“会聊天”迈向“会干活”的专家时代。
|
10月前
|
消息中间件 存储 数据采集
《数据中台隐性故障的排查逻辑与工程化避坑策略》
本文围绕数据中台建设中的三类隐性故障展开复盘,基于特定数据处理框架、分布式存储系统及混合计算环境,拆解故障排查与解决路径。首先解决用户活跃报表偶现数据缺失问题,通过优化任务调度与数据分区校验避免跨时段数据漏采;其次攻克实时推荐接口高峰期空数据难题,通过匹配计算并行度与缓存优化提升数据处理效率;最后修复离线仓库用户留存率重复统计故障,重构分区合并脚本并建立数据质量巡检机制。文中还提炼“现象锚定-链路拆解-根源验证”排查方法论,为数据中台开发者提供工程化避坑指南。
322 7
|
9月前
|
机器学习/深度学习 监控 算法
分布式光伏储能系统的优化配置方法(Matlab代码实现)
分布式光伏储能系统的优化配置方法(Matlab代码实现)
485 1
|
8月前
|
运维 Kubernetes 安全
Helm安装脚本:Kubernetes包管理工具的快速部署
这个过程提供一种快速、简单且自动化地方式去设置并开始使用Heml管理Kubernetes集群中资源。这个过程不涉及复杂操作,并且适合各种规模环境从小型测试环境到大型生产环境都适合采取此方法进行Heml工具链初始化操作。
348 5
|
10月前
|
敏捷开发 数据可视化 JavaScript
任务归类配置工具深度解析:核心逻辑、适配场景与最佳实践全揭示
在项目管理中,任务分配混乱常导致效率低下、责任不清。本文深入剖析任务管理痛点,提出“任务归类配置”机制,通过结构化分类、角色匹配、优先级设定等方式,帮助团队实现任务清晰归属、高效推进,提升整体协作效率。
|
存储 缓存 Linux
sysfs文件系统(1)
sysfs是一种虚拟文件系统,旨在提供一种访问内核数据结构的方法,从而允许用户空间程序查看和控制系统的设备和资源。sysfs文件系统通常被挂载在/sys目录下。sysfs提供了一种以树状结构组织的系统信息的方式,其中每个设备都有一个唯一的目录来表示它自己,其中包含有关设备的各种属性和状态信息的文件。这些文件通常是只读的,但有些也可以用于修改设备的某些设置。sysfs还提供了一个机制来通知用户空间程序有关设备状态更改的信息,从而使其能够对这些更改做出反应。sysfs文件系统被广泛用于Linux内核中,它为开发者提供了一种简单的方式来管理和控制系统中的各种设备和资源。
601 0
|
资源调度 自然语言处理 网络架构
RT-DETR改进策略【Neck】| 使用CARAFE轻量级通用上采样算子
RT-DETR改进策略【Neck】| 使用CARAFE轻量级通用上采样算子
401 11
RT-DETR改进策略【Neck】| 使用CARAFE轻量级通用上采样算子
|
JavaScript Java API
深入了解后端开发:从基础到进阶
【10月更文挑战第6天】深入了解后端开发:从基础到进阶
|
API 数据安全/隐私保护 开发者
京东商品评论数据接口(JD.item_review)丨京东API接口指南
京东商品评论数据接口(JD.item_review)让开发者获取京东商品的评论列表、内容、时间、买家昵称等详细信息,助力产品优化和市场研究。使用步骤包括注册京东开发者账号、创建应用并申请API权限、获取API密钥、阅读API文档,最后通过HTTP请求调用接口获取数据。示例代码展示了如何使用Python进行请求。
1349 9
|
Arthas 监控 数据可视化
jvm性能调优实战 - 61常用的JVM调优网站
jvm性能调优实战 - 61常用的JVM调优网站
920 0