软件设计原则:依赖倒置

定义

依赖倒置原则(Dependency Inversion Principle, DIP)是面向对象设计原则之一,其核心是高层模块(如业务逻辑)不应当依赖于低层模块(如具体的数据访问或设备控制实现),而是双方都应依赖于抽象接口。抽象不应依赖细节,细节应依赖抽象。

应用场景

  • 软件系统的架构设计,尤其是在构建可扩展、可维护的大型系统时。
  • 在系统的模块化过程中,需要模块之间解耦合。
  • 当系统需要进行测试时,依赖倒置原则可以使得代码更容易进行单元测试。

示例与反例

示例

// 抽象类或接口
interface Switchable {void turnOn();void turnOff();
}// 高层模块
class Lamp implements Switchable {public void turnOn() {System.out.println("灯开了");}public void turnOff() {System.out.println("灯关了");}
}// 低层模块
class Switch {private Switchable device;public Switch(Switchable device) {this.device = device;}public void operate() {// ...device.turnOn();// ...}
}

反例:高层模块直接依赖低层模块的具体实现,不通过抽象。

class Lamp {public void turnOn() {System.out.println("灯开了");}public void turnOff() {System.out.println("灯关了");}
}class Switch {private Lamp lamp;public Switch(Lamp lamp) {this.lamp = lamp;}public void operate() {// ...lamp.turnOn();// ...}
}

原则间的权衡与冲突

依赖倒置原则可能与其他原则(如KISS原则,即“保持简单和愚蠢”)发生冲突。在追求解耦和抽象的同时,可能会带来不必要的系统复杂性和理解难度。

设计原则的局限性

  • 过度设计:在某些情况下,过度使用依赖倒置原则可能导致系统过于复杂。
  • 学习曲线:正确理解和应用依赖倒置原则需要一定的设计经验。
  • 性能开销:过多的抽象层可能会引入性能损耗。

总结与建议

依赖倒置原则有助于提高软件的可维护性和可扩展性,特别是在大型软件项目中。然而,它也应该适度使用,避免不必要的复杂性。在实际开发中,应根据具体情况来平衡依赖倒置原则与其他设计原则之间的关系,避免过度设计,同时确保代码的模块性和可测试性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch7.8的下载与安装和Kibana 7.8.0工具使用安装

1、ElasticSearch7.8.0下载 elasticsearch: 官方下载地址:https://www.elastic.co/cn/downloads/elasticsearch 链接: https://pan.baidu.com/s/1wAKQoB3nhLhcnBlPfVOLxQ 提取码: t83n kibana: 链接: https://pan.baidu.com/s/156aD9zDdvUv8LFgDEIPoSw 提取码:…

PSCAD的使用

1. Canvas Settings中设置母线电压监测和虚拟连线十分重要。 2. Project Settings中snapshot可以实现分段仿真。 3. .out文献导出数据

操作系统—读者-写者问题及Peterson算法实现

文章目录 I.读者-写者问题1.读者-写者问题和分析2.读者—写者问题基本解法3.饥饿现象和解决方案总结 II.Peterson算法实现1.Peterson算法问题与分析(1).如何无锁访问临界区呢?(2).Peterson算法的基本逻辑(3).写对方/自己进程号的区别是? 2.只包含意向的解…

开发Vue组件库

使用脚手架新建vue项目&#xff08;以button 组件为例&#xff09; 1.新建package 文件夹&#xff0c;添加index.js 、custombutton 文件夹&#xff0c;custombutton 中 添加 custombutton .vue index.js <template><div>button</div> </template><…

图神经网络实战(7)——图卷积网络(Graph Convolutional Network, GCN)详解与实现

图神经网络实战&#xff08;7&#xff09;——图卷积网络详解与实现 前言1. 图卷积层2. 比较 GCN 和 GNN2.1 数据集分析2.2 实现 GCN 架构 小结系列链接 前言 图卷积网络 (Graph Convolutional Network, GCN) 架构由 Kipf 和 Welling 于 2017 年提出&#xff0c;其理念是创建一…

基于springboot+vue+Mysql的教学视频点播系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

idea使用docker将Java项目生成镜像并使用

1&#xff1a;开启docker 远程访问 使用 vim 编辑docker服务配置文件 vim /lib/systemd/system/docker.service [Service] Typenotify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not suppor…

软件设计SOLID原则

单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09; 每个类应该只有一个改变的理由&#xff0c;即一个类只负责一个功能领域中的相应职责。 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09; 软件实体&#xff08;类、模块、函数等&#…

pip/conda导出或导入环境

目录 一、pip Option1: pip freeze 导出环境 导入环境 Option2: pipreqs工具 导出环境 导入环境 二、conda Option1: requirements.txt 导出环境 导入环境 Option2: myenv.yml 导出环境 导入环境 Python提供了强大的模块功能&#xff0c;能够方便开发者更加易于…

redis-cli通过DUMP和SADD进行redis set数据类型迁移

1、DUMP指定key导出 redis-cli -h redis1.aliyuncs.com -n 1 -a abc DUMP SOL_addresses Warning: Using a password with -a or -u option on the command line interface may not be safe. "\x02A#,7tC9xSy8FZ9idnDb3e8DaXH6mQYLDWzaDovvQmYESjCQ,DCbNevBcwToUArdEDx3Q7…

思科交换机配置指引(包含安全配置部分)以 Cisco WS-C3850-48T 配置为例

思科Catalyst 3850系列交换机: 型号: Cisco WS-C3850-48T端口数: 48个10/100/1000Mbps数据端口供电方式:AC电源(支持PoE+)堆叠技术:Cisco StackWise-480,提供480Gbps的堆叠吞吐量网络模块:支持多种可选上行链路模块,包括千兆位以太网、万兆位以太网和40千兆位以太网端口…

操作系统内功篇:内存管理之虚拟内存

一 虚拟内存 在这种情况下&#xff0c;要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值&#xff0c;将会擦掉第二个程序存放在相同位置上的所有内容&#xff0c;所以同时运行两个程序是根本行不通的&#xff0c;这两个程序会立刻崩溃。 …

如何在 Ubuntu 12.04 上添加交换空间

本文涵盖的 Ubuntu 版本已不再受支持。如果您目前正在运行 Ubuntu 12.04 服务器&#xff0c;我们强烈建议升级或迁移到受支持的 Ubuntu 版本&#xff1a; 升级到 Ubuntu 14.04从 Ubuntu 14.04 升级到 Ubuntu 16.04将服务器数据迁移到受支持的版本 原因&#xff1a; Ubuntu 12…

亚远景科技-ASPICE评估目的

ASPICE评估是在特定目的的各种案例中进行的。一般来说&#xff0c;过程评估的目的是了解与评估组织单位实施的过程。 具体来说&#xff0c;根据 [ISO/IEC 33001-3.2.6] 中的定义&#xff0c;评估目的是&#xff1a; “一种声明&#xff0c;它作为评估输入信息中的一部分&#…

最简单的 AAC 音频码流解析程序

最简单的 AAC 音频码流解析程序 最简单的 AAC 音频码流解析程序原理源程序运行结果下载链接参考 最简单的 AAC 音频码流解析程序 参考雷霄骅博士的文章&#xff1a;视音频数据处理入门&#xff1a;AAC音频码流解析 本文中的程序是一个AAC码流解析程序。该程序可以从AAC码流中…

企业产品网络安全建设日志0402

文章目录 全面评估了引入短链接组件带来的风险以及替代方案301安全升级正当时 全面评估了引入短链接组件带来的风险以及替代方案 引入比较关键的组件&#xff0c;要全面评估它的安全风险和维护成本。包括它有没有公开的漏洞&#xff0c;它选用的依赖是否有缺陷&#xff0c;它的…

Linux(05) Debian 系统修改主机名

查看主机名 方法1&#xff1a;hostname hostname 方法2&#xff1a;cat etc/hostname cat /etc/hostname 如果在创建Linux系统的时候忘记修改主机名&#xff0c;可以采用以下的方式来修改主机名称。 修改主机名 注意&#xff0c;在linux中下划线“_”可能是无效的字符&…

数据结构(初阶)第一节:数据结构概论

本篇文章是对数据结构概念的纯理论介绍&#xff0c;希望系统了解数据结构概念的友友可以看看&#xff0c;对概念要求不高的友友稍做了解后移步下一节&#xff1a; 数据结构&#xff08;初阶&#xff09;第二节&#xff1a;顺序表-CSDN博客 正文 目录 正文 1.数据结构的相关概…

qqqqqqq

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Polardb MySQL 产品架构及特性

一、产品概述; 1、产品族 参考&#xff1a;https://edu.aliyun.com/course/3121700/lesson/341900000?spma2cwt.28120015.3121700.6.166d71c1wwp2px 2、polardb mysql架构优势 1&#xff09;大容量高弹性&#xff1a;最大支持存储100T&#xff0c;最高超1000核CPU&#xff0…