当前位置: 首页 > news >正文

软件设计原则:迪米特法则

定义

迪米特法则(Law of Demeter, LoD),又称最少知识原则,它指导我们在设计软件时,应当尽量减少对象之间的交互,一个对象应该对其他对象有尽可能少的了解。具体来说,一个对象应该只调用属于以下范畴的方法:

  • 本对象自身的方法
  • 作为方法参数传入的对象的方法
  • 该方法内部创建或实例化的对象的方法
  • 对象的任何组件的方法

应用场景

  • 当软件系统中的类与类之间的关系过于复杂时,使用迪米特法则来降低耦合度。
  • 在面向对象的设计中,尤其是在分层架构中,用于降低层与层之间的依赖。

示例与反例

示例

class Paper {// Paper的功能实现
}class Printer {void print(Paper paper) {// 使用Paper对象的方法}
}class CopyMachine {private Printer printer = new Printer();void copy(Paper paper) {printer.print(paper); // 只和Printer交互,不需要了解Printer内部的实现细节}
}

反例:对象之间交互过多,违反了迪米特法则。

class Paper {// Paper的功能实现
}class Printer {void print(Paper paper) {// 使用Paper对象的方法}
}class CopyMachine {private Printer printer = new Printer();void copy(Paper paper) {// 这里直接调用了Paper的方法,增加了类之间的耦合度if (paper.ready()) {printer.print(paper);}}
}

原则间的权衡与冲突

迪米特法则有时可能与其他原则,如单一职责原则冲突。过于严格地遵循迪米特法则,可能会导致过多的委托和包装,这可能会导致系统中出现大量的中介类,增加系统的复杂性。

设计原则的局限性

  • 过度应用:过度遵循迪米特法则可能会导致系统中出现大量的中介类或过度的委托关系,反而使得系统结构变得复杂。
  • 可读性与复杂性:在某些情况下,为了减少类之间的交互,可能会牺牲代码的直观性和可读性。

总结与建议

迪米特法则是一种有助于降低类之间耦合度的设计原则,适当地应用可以提高模块的独立性。在实际开发中,应当根据具体情况权衡使用,避免过度设计。设计时应该关注系统的易维护性和清晰性,同时考虑到迪米特法则带来的好处和潜在的复杂性。合理地运用迪米特法则,可以帮助我们构建松耦合、高内聚的系统。

相关文章:

软件设计原则:迪米特法则

定义 迪米特法则(Law of Demeter, LoD),又称最少知识原则,它指导我们在设计软件时,应当尽量减少对象之间的交互,一个对象应该对其他对象有尽可能少的了解。具体来说,一个对象应该只调用属于以下…...

MongoDB聚合运算符:$max

文章目录 语法使用空值和缺失值的处理数组操作数的处理 举例在$group阶段使用在$setWindowFields阶段使用在$project阶段使用 $max聚合运算符用于返回最大值。 $max对于不同的类型的值使用BSON的比较顺序。 $max可以用于下面的这些阶段: $addFields$bucket$bucket…...

神经网络学习笔记10——RNN、ELMo、Transformer、GPT、BERT

系列文章目录 参考博客1 参考博客2 文章目录 系列文章目录前言一、RNN1、简介2、模型结构3、RNN公式分析4、RNN的优缺点及优化1)LSTM是RNN的优化结构2)GRU是LSTM的简化结构 二、ELMo1、简介2、模型结构1)输入2)左右双向上下文信…...

Java23种设计模式

本文主要是对Java中一些常用的设计模式进行讲解 后期会进行不断的更新,欢迎浏览 23种设计模式 创建型模式,共五种:工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。结构型模式,共七种:适配器模式、桥接…...

pieces of cake concerning torchtorchvision

1. version match torchvision的版本对应关系 2. utilize tqdm to present process bar lay a pbar from tqdm import tqdm pbar tqdm(unit"batch", filesys.stdout,totallen(self.training_dataloader)) #处理单位为batch pbar2 tqdm(range(20), descIt\s a t…...

如何在Python中处理JSON数据?

如何在Python中处理JSON数据? 在Python中处理JSON数据是一个常见的任务,因为JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。Python的内置库…...

站群服务器如何提高搜索引擎排名

站群服务器是一种专门为多个相关联的网站提供支持的服务器,旨在通过网站集合的形式提高搜索引擎排名和曝光度。那么站群服务器如何提高搜索引擎排名呢?Rak部落小编为您整理发布。 站群服务器提高搜索引擎排名的原理主要在于以下几个方面: - **提高网站…...

Redis安装-Docker

安装redis的docker容器 1、创建redis挂载目录 mkdir -p /liuchaoxu/redis/{data,conf}2、复制配置文件 在 /liuchaoxu/redis/conf 目录中创建文件 redis.conf,文件从 redis-6.2.7.tar.gz 中解压获取 修改默认配置(从上至下依次): #bind 127.0.0.1 …...

day16-二叉树part03

104.二叉树的最大深度 (优先掌握递归) 根节点的高度就是二叉树的最大深度,后序遍历到叶子节点,对遍历高度取最小 class solution {/*** 递归法*/public int maxDepth(TreeNode root) {if (root null) {return 0;}int leftDepth maxDepth(ro…...

上位机图像处理和嵌入式模块部署(qmacvisual亮度检测)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,在机器视觉当中,对于光源的处理要非常小心。这里面不仅包括了选择什么样的光源,还取决于怎样使用…...

防止推特Twitter账号被冻结,应该选什么代理类型IP?

在处理多个 Twitter 帐号时,选择合适的代理IP对于避免大规模帐户暂停至关重要。现在,问题出现了:哪种类型的代理是满足您需求的最佳选择?下面文章将为你具体讲解推特账号冻结原因以及重点介绍如何选择代理IP。 一、推特账号被冻结…...

【二叉树】Leetcode 114. 二叉树展开为链表【中等】

二叉树展开为链表 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…...

2024年150道高频Java面试题(二十)

39. 说一下 HashMap 的实现原理? HashMap 是 Java 中使用非常普遍的一种基于散列的映射数据结构,主要用于存储键值对。它允许使用任何非空对象作为键和值,主要实现原理如下: 数组 链表 红黑树:HashMap 内部主要由一…...

Docker-Compose容器编排

​ 基本介绍 使用一个Dockerfile模板文件,可以很方便的定义一个适合自己使用的自定义镜像。但在工作中经常会碰到需要多个容器相互配合来完成某项任务或运行某个项目的情况。例如要运行一个django项目,除了django容器本身,往往还需要再加上…...

nvm 安装多个版本的Node npm

先安装nvm 管理工具 git安装地址 找到安装包 下载然后安装 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11nvm常用命令 命令说明nvm version查看nvm版本nvm ls查看所有已经安装的Nodejs版本nvm list installed查看所有已经安装的Nodejs版本nvm ls availab…...

RisingWave 在品高股份 Bingo IAM 中的应用

背景介绍 公司背景 品高股份,是国内专业的云计算及行业信息化服务提供商。公司成立于 2003 年,总部位于广州,下设多家子公司和分公司,目前员工总数近 900 人,其中 80 %以上是专业技术人员。 品高股份在 2008 年便开…...

.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置

.Net Core/.Net6/.Net8 &#xff0c;启动配置/Program.cs 配置 没有废话&#xff0c;直接上代码调用 没有废话&#xff0c;直接上代码 /// <summary>/// 启动类/// </summary>public static class Mains{static IServiceCollection _services;static IMvcBuilder _…...

尚硅谷2024最新Git企业实战教程 | Git与GitLab的企业实战

这篇博客是尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab的完整笔记。 这不仅仅是一套Git的入门教程&#xff0c;更是全方位的极狐GitLab企业任务流开发实战&#xff01;作为一应俱全的一站式DevOps平台&#xff0c;极狐GitLab的高阶功能全面覆盖&#xff0…...

2024阿里云老用户服务器优惠价格99元和199元

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…...

【前端webpack5高级优化】提升打包构建速度几种优化方案

HotModuleReplacement&#xff08;HMR/热模块替换&#xff09; 开发时我们修改了其中一个模块代码&#xff0c;Webpack 默认会将所有模块全部重新打包编译&#xff0c;速度很慢 所以我们需要做到修改某个模块代码&#xff0c;就只有这个模块代码需要重新打包编译&#xff0c;…...

手把手教你搞定Sx1262射频前端:从天线匹配到LPF滤波的完整电路设计(附PCB布局建议)

手把手教你搞定Sx1262射频前端&#xff1a;从天线匹配到LPF滤波的完整电路设计&#xff08;附PCB布局建议&#xff09; 在物联网设备开发中&#xff0c;射频前端设计往往是硬件工程师最头疼的环节之一。特别是使用Semtech的Sx1262这类LoRa芯片时&#xff0c;一个设计不当的射频…...

从行业会议议程到个人技能地图:嵌入式工程师系统化成长指南

1. 从行业盛会到个人技能地图&#xff1a;如何将MASTERs会议的精髓转化为你的嵌入式成长引擎又到了一年一度技术人“充电”的季节。如果你在工业自动化、电机控制或者机器人领域深耕&#xff0c;那么对Microchip Technology这家公司及其产品线一定不会陌生。每年夏天&#xff0…...

Gemini Deep Research调用失败?5类报错代码详解+官方未公开的API绕过方案(限时技术内参)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini Deep Research功能怎么用 Gemini Deep Research 是 Google 推出的面向专业研究者的增强型推理能力模块&#xff0c;专为长上下文分析、跨文档信息整合与假设验证设计。启用该功能需通过 Gemini …...

Simplefolio数据库集成终极指南:5步搭建动态内容管理系统

Simplefolio数据库集成终极指南&#xff1a;5步搭建动态内容管理系统 【免费下载链接】simplefolio ⚡️ A minimal portfolio template for Developers 项目地址: https://gitcode.com/gh_mirrors/si/simplefolio Simplefolio是一款专为开发者设计的极简作品集模板&…...

探索One-Language/One:统一编程范式如何重塑全栈开发体验

1. 项目概述&#xff1a;从“One”到“One-Language/One”的深度解构最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“One-Language/One”。光看这个名字&#xff0c;可能很多人会有点懵&#xff0c;这到底是个啥&#xff1f;是又一个编程语言&#xff1f;还是一个框架&a…...

为什么你的Perplexity Science搜索总错过最新预印本?——基于arXiv/medRxiv/SSRN实时源的3层校验机制(含Python自动化脚本)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的Perplexity Science搜索总错过最新预印本&#xff1f;——基于arXiv/medRxiv/SSRN实时源的3层校验机制&#xff08;含Python自动化脚本&#xff09; Perplexity Science 依赖第三方索引快照…...

从HEX到芯片:使用J-Flash实现高效固件烧录与生产级加密

1. 认识J-Flash&#xff1a;你的芯片烧录好帮手 第一次接触J-Flash时&#xff0c;我正为一个量产项目发愁——需要给500片GD32F103烧录固件。手动用IDE一个个烧&#xff1f;效率太低&#xff1b;找代工厂&#xff1f;成本太高。直到同事推荐了J-Flash&#xff0c;我才发现原来烧…...

加州DMV十年自动驾驶报告深度解析:从测试数据看行业格局与技术演进

1. 项目概述&#xff1a;一份数据&#xff0c;十年自动驾驶风云如果你关注自动驾驶&#xff0c;那你一定听说过加州车管局&#xff08;DMV&#xff09;的年度测试报告。这玩意儿&#xff0c;可以说是全球自动驾驶行业的“晴雨表”和“成绩单”。从2015年开始&#xff0c;加州就…...

技能图谱探索器:从数据建模到交互可视化的全栈实现

1. 项目概述&#xff1a;一个技能图谱的探索工具最近在GitHub上看到一个挺有意思的项目&#xff0c;叫nitzzzu/openclaw-skills-explorer。光看名字&#xff0c;openclaw和skills-explorer这两个词就挺有画面感的。我第一反应是&#xff0c;这应该是一个用来探索、梳理或可视化…...

别再只搜WOL教程了!华硕/微星主板BIOS里这两个隐藏选项没开,魔术包收到也白搭

华硕/微星主板WOL终极配置指南&#xff1a;破解BIOS隐藏选项的实战手册 深夜加班后想远程唤醒家里的台式机渲染视频&#xff0c;却发现魔术包石沉大海&#xff1f;你可能已经按照无数教程配置了网卡唤醒选项&#xff0c;却忽略了主板BIOS里那两个致命的隐藏开关。本文将用实验室…...