设计原则名称与缩写统计

在软件设计领域,有许多重要的设计原则,以下为你介绍常见的设计原则及其名称和缩写:

SRP - 单一职责原则(Single Responsibility Principle)

  • 定义:一个类应该有且仅有一个引起它变化的原因,也就是说一个类只负责一项职责。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。
  • 示例:在一个用户管理系统中,一个类专门负责用户信息的存储,另一个类负责用户信息的验证,这样当存储方式改变或者验证规则改变时,不会相互影响。

OCP - 开闭原则(Open Closed Principle)

  • 定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即可以在不必修改源代码的情况下改变这个模块的行为。
  • 示例:在一个图形绘制系统中,定义一个抽象的图形基类,各种具体的图形类(如圆形、矩形等)继承自这个基类。当需要添加新的图形类型时,只需要创建一个新的子类,而不需要修改现有的代码。

LSP - 里氏替换原则(Liskov Substitution Principle)

  • 定义:所有引用基类的地方必须能透明地使用其子类的对象。也就是说,子类可以扩展父类的功能,但不能改变父类原有的功能。
  • 示例:在一个动物类及其子类(如猫、狗)的系统中,任何使用动物类的地方,都可以用猫或狗的对象来替代,而不会影响系统的正确性。

ISP - 接口隔离原则(Interface Segregation Principle)

  • 定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。将一个庞大的接口拆分成多个小的、特定的接口,让不同的类实现不同的接口。
  • 示例:在一个系统中,有一个 “动物” 接口,包含 “飞行”“游泳”“奔跑” 等方法。但不是所有动物都会这些技能,因此可以将其拆分成 “飞行接口”“游泳接口”“奔跑接口”,让不同的动物类根据自身能力实现相应的接口。

DIP - 依赖倒置原则(Dependency Inversion Principle)

  • 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。即要针对接口编程,而不是针对实现编程。
  • 示例:在一个电商系统中,订单服务模块(高层模块)不应该直接依赖具体的数据库操作类(低层模块),而是依赖一个抽象的数据库操作接口,具体的数据库操作类实现这个接口。

CCP - 共同封闭原则(Common Closure Principle)

  • 定义:包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。
  • 示例:在一个电商系统中,与商品管理相关的类可以放在一个包中,当商品管理的业务规则发生变化时,只影响这个包中的类,而不影响其他与订单管理、用户管理等相关的包。

CRP - 共同重用原则(Common Reuse Principle)

  • 定义:一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。也就是说,包中的类之间应该有紧密的联系,它们共同完成一个特定的功能。
  • 示例:在一个图形处理库中,与图形绘制算法相关的类可以放在一个包中,当需要使用其中一个绘制算法类时,可能也需要使用该包中的其他相关类来完成整个图形绘制的功能。

=========================================================================

合成 / 聚合复用原则(Composite/Aggregate Reuse Principle,CARP)

  • 定义:尽量使用合成 / 聚合,而不是使用继承来达到复用的目的。合成和聚合是关联关系的两种特殊情况,合成表示一种强的 “拥有” 关系,部分和整体的生命周期一致;聚合表示一种弱的 “拥有” 关系,部分可以脱离整体而存在。通过合成 / 聚合复用,可以使系统更加灵活,降低类与类之间的耦合度。
  • 示例:在一个汽车系统中,汽车和发动机之间可以是合成关系(发动机是汽车不可分割的一部分),汽车和轮胎之间可以是聚合关系(轮胎可以独立生产和更换)。当需要复用发动机或轮胎的功能时,采用合成 / 聚合的方式,而不是让汽车类继承发动机类或轮胎类。

迪米特法则(Law of Demeter,LoD),也称为最少知识原则

  • 定义:一个对象应该对其他对象有最少的了解。也就是说,一个类应该只和它的直接朋友通信,而避免和陌生的类直接通信。直接朋友是指和该类有耦合关系的类,如成员变量、方法参数、方法返回值中的类。
  • 示例:在一个公司管理系统中,员工类只需要和其直接上级类(如部门经理类)进行交互,而不需要直接和其他部门的员工类进行交互。如果需要获取其他部门的信息,可以通过上级类进行间接沟通。

好莱坞原则(Hollywood Principle)

  • 定义:“Don't call us, we'll call you”(别调用我们,我们会调用你)。在软件设计中,这意味着高层组件控制如何以及何时调用低层组件,低层组件只负责实现具体的功能,而不主动调用高层组件。这种原则常用于框架设计中,框架提供了一个整体的控制流程,开发者编写的代码作为低层组件,在框架需要的时候被调用。
  • 示例:在一个 Web 开发框架中,框架负责处理请求的接收、路由等流程,开发者编写的控制器类和业务逻辑类作为低层组件,在框架需要执行具体业务时被调用。

无环依赖原则(Acyclic Dependencies Principle,ADP)

  • 定义:在包的依赖关系中,不应该存在循环依赖。即如果包 A 依赖包 B,包 B 依赖包 C,那么包 C 不应该再依赖包 A。循环依赖会导致系统的可维护性和可扩展性变差,因为一个包的修改可能会影响到多个相关的包。
  • 示例:在一个大型的软件项目中,将不同的功能模块划分成不同的包。如果存在包 A、包 B 和包 C,包 A 调用包 B 中的类,包 B 调用包 C 中的类,那么包 C 就不应该调用包 A 中的类,以避免形成循环依赖。

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

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

相关文章

自制游戏——斗罗大陆

很简陋&#xff0c;没有图&#xff0c;请见谅 // mine[0] 级数 // mine[1] 战力 //mine[2] 1 白虎 //mine[2] 2 昊天锤 //mine[2] 3 蓝银草 #include <bits/stdc.h> using namespace std; int mine[100],live3, dou 1, luo 1, da 1, bag[1000], huan 0, lia…

DeepSeek正重构人形机器人和具身大模型赛道!

中国人工智能公司DeepSeek&#xff08;深度求索&#xff09;以“低成本、高效率、强开放”的研发范式横空出世&#xff0c;火遍并震撼全球科技圈&#xff1b;DeepSeek展现出来的核心竞争力&#xff0c;除了低成本及推理能力&#xff0c;更重要的是开源模型能力追赶上了最新的闭…

oracle使用动态sql将多层级组织展平

ERP或者其他企业管理软件中都会有一张组织机构表&#xff0c;可以写固定sql的方式将其展平获取组织表中的字段信息&#xff0c;如负责人、上级组织负责人、分管领导、成立时间等。但是这种方式有个缺陷&#xff0c;就是如果只写到处理4个层级&#xff0c;那么后期层级增多就无法…

嵌入式硬件篇---原码、补码、反码

文章目录 前言简介八进制原码、反码、补码1. 原码规则示例问题 2. 反码规则示例问题 3. 补码规则示例优点 4. 补码的运算5. 总结 十六进制原码、反码、补码1. 十六进制的基本概念2. 十六进制的原码规则示例 3. 十六进制的反码规则示例 4. 十六进制的补码规则示例 5. 十六进制补…

分布式光纤传感:为生活编织“感知密网”

分布式光纤测温技术虽以工业场景为核心&#xff0c;但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术&#xff08;DTS&#xff09;作为一种先进的线型温度监测手段&#xff0c;近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…

本地基于GGUF部署的DeepSeek实现轻量级调优之二:检索增强生成(RAG)

前文&#xff0c;我们在本地windows电脑基于GGUF文件&#xff0c;部署了DeepSeek R1 1.5B模型&#xff0c;如果想在离线模式下加载本地的DeepSeek模型自行对进行训练时&#xff0c;是不能直接使用GGUF文件进行训练的&#xff0c;但是可以对模型进行微调&#xff0c;以下说的是第…

Java爬虫:按关键字搜索1688商品的实战案例指南

在电商领域&#xff0c;快速获取商品信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富的商品数据。虽然1688开放平台提供了官方API来获取商品信息&#xff0c;但有时使用爬虫技术来抓取数据也是一种有…

C++病毒(^_^|)(2)

第二期 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。损坏电脑&#xff0c;作者一律不负责。此作为作者原创&#xff0c;转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…

Python练习11-20

题目&#xff1a;古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 题目&#xff1a;判断101-200之间有多少…

C++ 设计模式-建造者模式

以下是一个完整的C建造者模式示例&#xff0c;包含产品类、建造者接口、具体建造者、指挥者以及测试代码&#xff1a; #include <iostream> #include <string> #include <memory>// 产品类&#xff1a;汽车 class Car { public:void setBody(const std::str…

Repo、manifest以及Gerrit分别是什么?

Repo‌&#xff1a; 定义‌&#xff1a;Repo是一个由Android开发的Python脚本工具&#xff0c;主要用于管理多个git仓库。它并不是为了取代git&#xff0c;而是为了简化对多个git仓库的管理&#xff0c;特别是对于包含数百个git库的大型项目&#xff0c;如Android开源项目(AOS…

Win10环境借助DockerDesktop部署最新MySQL9.2

Win10环境借助DockerDesktop部署最新MySQL9.2 前言 作为一杆主要撸Java的大数据平台开发攻城狮&#xff0c;必不可少要折腾各种组件&#xff0c;环境和版本一直是很头疼的事情。虽然可以借助Anaconda来托管Python的环境&#xff0c;也可以使用多个虚拟机来部署不同的环境&…

细说STM32F407单片机RTC的基本原理及闹钟和周期唤醒功能的使用方法

目录 一、RTC基础知识 1、 RTC的功能 2、RTC工作原理 &#xff08;1&#xff09;RTC的时钟信号源 &#xff08;2&#xff09;预分频器 &#xff08;3&#xff09;实时时钟和日历数据 &#xff08;4&#xff09;周期性自动唤醒 &#xff08;5&#xff09;可编程闹钟 &a…

Docker的深入浅出

目录 Docker引擎 Docker镜像 (镜像由多个层组成&#xff0c;每层叠加之后&#xff0c;从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统&#xff08;OS&#xff09;&#xff0c;同时还包含应用运行所必须的文件和依赖包) Docker容器 应用容器化--Docker化 最佳…

AUTOGPT:基于GPT模型开发的实验性开源应用程序; 目标设定与分解 ;;自主思考与决策 ;;信息交互与执行

目录 AUTOGPT是一款基于GPT模型开发的实验性开源应用程序目标设定与分解自主思考与决策信息交互与执行AUTOGPT是一款基于GPT模型开发的实验性开源应用程序 目标设定与分解 自主思考与决策 信息交互与执行 AUTOGPT是一款基于GPT模型开发的实验性开源应用程序,它能让大语言模…

Unity中自定义协程的简单实现

在 Unity 中&#xff0c;协程&#xff08;Coroutine&#xff09;是一种非常强大的工具&#xff0c;它允许我们在不阻塞主线程的情况下&#xff0c;将代码的执行分成多个步骤&#xff0c;在不同的帧中执行。 Unity中协程实现原理 迭代器与状态机&#xff1a;本质上是基于C#的迭…

Spring Boot过滤器链:从入门到精通

文章目录 一、过滤器链是什么&#xff1f;二、为什么需要过滤器链&#xff1f;三、Spring Boot中的过滤器链是如何工作的&#xff1f;&#xff08;一&#xff09;过滤器的生命周期&#xff08;二&#xff09;过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…

【博客之星】GIS老矣尚能饭否?WebGIS项目实战经验与成果展示

目录 一、最前面的话 二、前言 1、关于“夜郎king” 3、GIS的“老骥伏枥” 4、WebGIS的“新程启航” 三、WebGIS技术简介 1、前、后技术简介 2、系统功能架构 四、WebGIS项目应用效果 1、应急灾害 2、交通运输 3、智慧文旅 4、其它项目 五、未来与展望 1、云计算…

游戏内常见加密

加密只是增大破解难度&#xff0c;没法说绝对安全&#xff0c;避免过度加密导致性能消耗过大。 通用算法库 lua的加密算法库&#xff1a;https://github.com/somesocks/lua-lockbox/tree/master 比如通信协议就用到里面一些算法cry.encrypt 算法优劣&#xff1a;AES加解密-CBC…

C++中什么时候用. 什么时候用->

学了一年C今天出了一个大岔子&#xff0c;因为太久没有做链表类型题目了&#xff0c;并且STL用惯了今天遇到一题&#xff0c;写的时候发现完全不对劲&#xff0c;搞慌了&#xff0c;首先我们看题目 2. 两数相加 再看我第一次的解答&#xff0c;先不论结果对不对 错的行为有很多…