【6大设计原则】迪米特法则:解密软件设计中的“最少知识原则”

在这里插入图片描述

引言

在软件设计中,设计原则是指导我们构建高质量、可维护系统的基石。迪米特法则(Law of Demeter,LoD),也被称为“最少知识原则”,是六大设计原则之一。它强调对象之间的松耦合,确保系统的各个部分之间的依赖关系尽可能少,从而提高系统的灵活性和可维护性。本文将深入探讨迪米特法则的核心思想、应用场景以及如何在实际开发中有效运用这一原则。

迪米特法则的核心思想

迪米特法则的核心思想可以用一句话概括:一个对象应当对其他对象有尽可能少的了解。具体来说,一个对象应当只与其直接的朋友通信,而不应当与朋友的朋友通信。这里的“朋友”通常指的是对象的成员变量、方法参数或返回值。

迪米特法则的定义

在这里插入图片描述

迪米特法则可以进一步细化为以下几点:

  1. 只与直接的朋友通信:一个对象的方法只能调用以下几种对象的方法:

    • 该对象本身
    • 作为方法参数传入的对象
    • 该对象的成员变量
    • 该方法创建的局部对象
  2. 避免与“陌生人”通信:一个对象不应调用由另一个对象的方法返回的对象的方法。

迪米特法则的优点

  • 降低耦合度:通过限制对象之间的通信,迪米特法则减少了对象之间的依赖关系,使得系统更容易维护和扩展。
  • 提高模块化:遵循迪米特法则可以使系统中的各个模块更加独立,从而提高系统的模块化程度。
  • 增强可测试性:松耦合的系统更容易进行单元测试,因为每个模块都可以独立测试。

迪米特法则的应用场景

场景一:避免链式调用

链式调用是指通过多个对象的方法调用链来完成一个操作。例如:

customer.getOrder().getOrderItem().getProduct().getName();

在这个例子中,customer对象通过链式调用获取product的名称。这种调用方式违反了迪米特法则,因为它要求customer对象了解orderorderItemproduct的内部结构。

改进方案

可以通过在customer对象中添加一个方法来封装链式调用:

public String getProductName() {return this.order.getOrderItem().getProduct().getName();
}

这样,customer对象只需要了解order对象,而不需要了解orderItemproduct的内部结构。

场景二:封装内部细节

假设有一个ShoppingCart类,它包含一个List<Product>来存储购物车中的商品。如果直接暴露List<Product>,可能会导致外部对象直接操作购物车中的商品,从而破坏封装性。

public class ShoppingCart {private List<Product> products;public List<Product> getProducts() {return products;}
}

改进方案

可以通过提供只读的方法来封装内部细节:

public class ShoppingCart {private List<Product> products;public List<Product> getProducts() {return Collections.unmodifiableList(products);}public void addProduct(Product product) {products.add(product);}public void removeProduct(Product product) {products.remove(product);}
}

这样,外部对象只能通过ShoppingCart提供的方法来操作商品,而不需要了解List<Product>的内部结构。

如何在实际开发中应用迪米特法则

1. 识别对象的边界

在设计类时,首先要明确类的职责和边界。一个类应当只负责自己的职责,而不应当涉及其他类的内部细节。通过识别对象的边界,可以有效地应用迪米特法则。

2. 使用中介模式

当多个对象之间存在复杂的依赖关系时,可以引入中介对象来管理这些依赖关系。中介对象充当了各个对象之间的协调者,从而减少了对象之间的直接依赖。

3. 封装内部状态

在设计类时,应当尽量封装内部状态,避免将内部状态直接暴露给外部对象。通过提供只读的方法或只读的接口,可以有效地保护内部状态,从而遵循迪米特法则。

4. 遵循“最少知识”原则

在编写代码时,始终牢记“最少知识”原则。一个对象应当只与直接的朋友通信,而不应当与朋友的朋友通信。通过遵循这一原则,可以减少对象之间的依赖关系,从而提高系统的灵活性和可维护性。

总结

迪米特法则作为六大设计原则之一,强调对象之间的松耦合,通过限制对象之间的通信来降低系统的复杂性。遵循迪米特法则可以提高系统的模块化程度、降低耦合度、增强可测试性。在实际开发中,通过识别对象的边界、使用中介模式、封装内部状态以及遵循“最少知识”原则,可以有效地应用迪米特法则,构建高质量、可维护的软件系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/140725.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

8. Transforms的使用(三)-- Resize

Transforms的使用(三) 1. 为什么要使用Resize 在模型的训练过程中往往需要图片数据的维度相同,才能适应深度学习模型中的相关神经网络结构,这时候就需要使用Resize保证所有的图片保持相同的尺寸2. 使用Resize调整图片的尺寸 在pytorch2.3的版本上,Resize()支持对Tensor类…

1405 问题 E: 世界杯

废话 这个题&#xff0c;我估计 22 22 22 年的时候写过一次&#xff0c;当时应该是搞明白了&#xff0c;现在重新写还是不会写&#xff0c;有点无奈 题目 问题 E: 世界杯&#xff1a;现在的 OJ 把题目加到一个活动里面去之后&#xff0c;感觉之后这个链接就访问不了了。题目…

CSS—4

1.定位 1.相对定位 2.绝对定位 3.固定定位 4.粘性定位 5.定位的特殊应用 2.布局-版心 3.布局-常用布局名词 4.布局-重置默认样式

321. 拼接最大数

1. 题目 321. 拼接最大数 2. 解题思路 题目精简一下&#xff1a; 给你两个数组&#xff0c;从每个数组选取N个元素&#xff08;需要保持相对顺序&#xff0c;比如从数组[4,8,2]选取两个元素&#xff0c;选取出来后必须保持顺序&#xff0c;比如选4和2&#xff0c;那么组成新…

对操作系统(OS)管理和进程的理解

文章目录 从冯诺依曼体系入手来了解计算机硬件部分操作系统操作系统的概念设计操作系统&#xff08;OS&#xff09;的目的对下&#xff08;硬件&#xff09;OS的管理对上如何理解系统调用 进程 在计算机系统中&#xff0c;硬件、操作系统和进程是三个至关重要的概念。它们相互协…

C# 反射之动态生成dll/exe

这个可能应该属于反射的高级使用范围了&#xff0c;平常在项目中使用的人估计也不是很多。由于使用反射的话会降低性能&#xff0c;比如之前用到的GetValue、SetValue等之类&#xff0c;但是使用这种方式会大大提高效率&#xff0c;在这里我只想说&#xff0c;都直接写IL指令了…

C++八股文之面向对象篇

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 思维导图链接&#xff1a;面向对象的性质 持续更新中…… &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 …

【CSS in Depth 2 精译_031】5.3 Grid 网格布局的两种替代语法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

【VSCode】VSCode Background 背景插件辅助窗口程序

前排贴上Github项目链接 GitHub窗口项目链接 这是一个基于VSCode上由shalldie上传的background扩展制作的windows窗口程序。 该程序旨在通过窗口程序尽可能的完善该扩展原有的功能。 background - shalldie 的最大优势是我目前仅在其扩展上发现了UseFront的选项&#xff0c;这…

2011年全国硕士研究生入学统一考试计算机科学与技术

1. 试卷背景&#xff1a; 试题&#xff1a;2011年全国硕士研究生入学统一考试计算机科学与技术学科联考中的计算机学科专业基础综合试题。难点&#xff1a;该问题的研究难点在于试题涵盖了计算机科学与技术的多个方面&#xff0c;包括数据结构、算法、计算机组成原理、操作系统…

text2sql(NL2Sql)综述《The Dawn of Natural Language to SQL: Are We Fully Ready?》

《The Dawn of Natural Language to SQL: Are We Fully Ready?》(github)出自2024年6月的NL2SQL(Natural language to SQL )综述论文。这篇论文尝试回答如下三个问题&#xff1a; 问题1:NL2SQL的现状是什么&#xff1f;(Q1:Where Are we Now?) 论文图1总结了近20年NL2SQL方法…

Qt:懒汉单例(附带单例使用和内存管理)

前言 本文主要写懒汉单例以及单例的释放&#xff0c;网上很多教程只有单例的创建&#xff0c;但是并没有告诉我们单例的内存管理&#xff0c;这就很头疼。 正文 以下是两种懒汉单例的写法 1. 懒汉式单例&#xff08;多线程不安全&#xff0c;但是在单线程里面是安全的&…

protobuf中c、c++、python使用

文章目录 protobuf实例&#xff1a;例题1&#xff1a;[CISCN 2023 初赛]StrangeTalkBot分析&#xff1a;思路&#xff1a;利用&#xff1a; 例题2&#xff1a;[CISCN 2024]protoverflow分析&#xff1a; protobuf Protocol Buffers&#xff0c;是Google公司开发的一种数据描述语…

二十三种设计模式之原型模式

一.什么是原型模式 ‌‌原型模式是一种创建型对象设计模式&#xff0c;它通过复制一个已经创建的实例&#xff08;即原型对象&#xff09;来创建一个和原型对象相同的新对象。‌ 这种模式在面向对象软件设计中非常有用&#xff0c;因为它允许通过复制现有对象来快速生成多个相似…

新160个crackme - 057-bbbs-crackme04

运行分析 因软件版本老旧&#xff0c;需使用windows XP虚拟机运行有个SystemID&#xff0c;值为12345678需破解User ID和Password PE分析 yC壳&#xff0c;32位 OD手动脱壳 使用windows XP虚拟机&#xff0c;将程序拖入OD按一下F8&#xff0c;ESP变红&#xff0c;根据ESP定律设…

子比主题美化 - 可移动悬浮窗 弹窗功能代码教程

移动页面演示效果 这个功能完全适配子比主题使用&#xff0c;代码开源&#xff0c;可以做其它功能弹窗或者菜单栏等等&#xff0c;后期有时间在做成桌面页面也可以鼠标移动&#xff0c;点击参考&#xff1a;移动悬浮窗详细代码教程

黑马十天精通MySQL知识点

一. MySQL概述 安装使用 MySQL安装完成之后&#xff0c;在系统启动时&#xff0c;会自动启动MySQL服务&#xff0c;无需手动启动。 也可以手动的通过指令启动停止&#xff0c;以管理员身份运行cmd&#xff0c;进入命令行执行如下指令&#xff1a; 1 、 net start mysql80…

SpringBoot父子工程搭建

SpringBoot父子工程搭建 1、父工程 1.1、创建父工程 1.2、移除无用文件 1.3、修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

秋韵虫趣.

文章目录 虫鸣概览虫坛文化蟀种纷呈中华蟋蟀宁阳蟋蟀刻点铁蟋长颚斗蟋 油葫芦棺头蟋中华灶蟋小素蟋树皮蟋蟀 花生大蟋斑腿针蟋其他鸣虫树蟋&#xff0c;又名竹蛉、邯郸梨片蟋&#xff0c;又名金钟、天蛉、绿蛣蛉、银琵琶凯纳奥蟋&#xff0c;又名石蛉&#xff0c;鳞蟋黄蛉蟋&am…

NarratoAI利用AI大模型,一键解说并剪辑视频

测试视频: 字幕/配乐后期添加的,视频由NarratoAI自动生成的 雪迷宫-NarratoAI利用AI大模型剪辑解说视频测试 WIN整合包 下载链接&#xff1a;https://pan.quark.cn/s/8f54ef99e3fb 使用前先更新&#xff0c;运行update.bat Gemini API Key 访问 https://aistudio.google.c…