设计原则 --《设计模式之美》总结篇

本文是阅读《设计模式之美》的总结和心得,跳过了书中对面试和工作用处不大或不多的知识点,总结总共分为三章,分别是面对对象编程范式、设计原则和设计模式。

设计模式是代码设计时的一些经验总结。相比于设计模式,设计原则更抽象。

单一职责原则(SRP)

一个类或模块只负责完成一个职责。
例如,某个类既包含对订单的一些操作,又包含对用户的一些操作。而订单和用户是两个独立的业务领域模型,将两个不相干的功能放到同一个类中,就违反了单一职责原则。

开闭原则(OCP)

开闭原则告诉我们在设计功能模块的时候要留扩展点,在未来进行需求变更时,不需要改动代码的整体结构,新的代码能够灵活地插入到扩展点,完成需求变更,从而实现代码的最小化改动。
同时,新增代码要比修改原有代码引入新 bug 的概率更小,基本所有的行为型设计模式都提供了扩展点。

里氏替换原则(LSP)

子类对象能够替换到程序中父类对象出现的任何地方,并且保证程序原有的逻辑行为不变和正确性不被破坏。
里氏替换原则乍一看好像和多态特性没有什么区别,因为多态的定义就是在程序运行的过程中,我们可以用子类替换父类,并调用子类的方法。里氏替换原则规定子类除了可以替换父类之外,子类不能违反父类对输入、输出和异常的约定,比如父类中的方法注释中注明方法不会抛出异常,返回值不会为 null,而子类重写父类方法后会抛出 RuntimeException 异常并且返回值可能为 null。这就违反了里氏替换原则,子类替换父类后可能给程序引入错误。还有一种场景,子类完全改变了父类的代码逻辑,如父类中是按时间排序,子类中却按大小排序。这也是违反里氏替换原则的。

接口隔离原则(ISP)

客户端不应该被强迫依赖它不需要的接口。
接口隔离原则和单一职责原则关系密切,满足单一职责原则的类不一定满足接口隔离原则,因为单一职责原则关注类自身实现的业务职责是否单一,而接口隔离原则关注客户端,如果客户端依赖的接口可以访问到它不需要的方法,说明客户端被强迫依赖了它不需要的接口,此时我们需要继续对接口细分,让接口满足接口隔离原则。

依赖反转原则(DIP)

高层模块不要依赖底层模块,高层模块和底层模块应该通过抽象互相依赖。
提到依赖反转,我们会联想到控制反转(IOC)和依赖注入(DI)。控制反转讲的是原来由程序员手动控制的模板代码变成由框架控制,这里说的模板代码可以是程序流程的控制、对象的创建等。因此,控制反转并不是一种具体的实现技巧,而是一种比较笼统的设计想法,一般用来指导框架的设计。依赖注入是指不通过 new 的方式在类内部创建依赖的类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递给类使用。

KISS原则

KISS原则的英文描述是:Keep It Simple and Stupid。中文释义是保持代码简单和愚蠢。
我们知道,代码的可读性是衡量代码质量的两个重要标准。而 KISS 原则就是保持代码可读和可维护的重要手段。代码足够简单,也就意味着容易读懂,bug 比较难隐藏,即使出现 bug,修复也比较简单。
对于如何写出满足 KISS 原则的代码,有两个方面:

  1. 不要重复造轮子,首先考虑使用已有类库。
  2. 不要过度设计。尽量避免使用一些 “奇技淫巧”,比如位运算,复杂的条件语法等。

DRY 原则

DRY 原则(Don’t Repeat Yourself)翻译成中文是:不要编写重复的代码。
满足 DRY 原则其实间接让我们提高了代码的复用性,因为代码复用性高,重复的代码自然就少了。

迪米特原则(LoD)

迪米特原则又称为最少知识原则。它规定不应该存在直接依赖关系的类之间不要有依赖,有依赖关系的类之间尽量只依赖必要的接口。
迪米特原则表述的后半部分其实就是接口隔离原则。这条原则能够帮助我们实现代码的 “高内聚,低耦合”。
“高内聚” 用来指导类本身的设计,指的是相近的功能应该放在同一个类中,不相近的功能不要放在同一个类中。
“低耦合” 用来指导类之间依赖关系的设计。指的是在代码中,类之间的依赖关系要简单、清晰。即使两个类有依赖关系,一个类的代码的改动不会或很少导致依赖类的代码的改动。

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

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

相关文章

Java请求Http接口-OkHttp(超详细-附带工具类)

简介:OkHttp是一个默认有效的HTTP客户端,有效地执行HTTP可以加快您的负载并节省带宽,如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试备用地址。这对于IPv4 IPv6和冗余数据中心中托管的服务是必需的。OkHt…

C++11并发与多线程笔记(6) unique_lock(类模板)

C11并发与多线程笔记(6) unique_lock(类模板) 1、unique_lock取代lock_guard2、unique_lock的第二个参数2.1 std::adopt_lock:2.2 std::try_to_lock:2.3 std::defer_lock: 3、unique_lock的成员…

LVS 负载均衡集群

集群 集群(Cluster)是一组相互连接的计算机或服务器,它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作,提高计算能力、可用性、性能和可伸缩性,适用于大量高并发的场景。 集群…

【HBZ分享】java中的BitSet 与 Redis中的BitMap 与 布隆过滤器

BitMap的存储原理 bitMap他会标识出某个整数是否存在,存在即为1,不存在对应位即为0bitMap是存储int类型的,int 4byte, 1byte 8bit,因此bitMap数组中的每个下标可以标识出32个数字是否存在bitMap相当于一个个小格子&…

马哈鱼数据血缘工具背后的项目: gsp_demo_java 项目简单介绍与使用

0.背景 马哈鱼数据血缘工具(https://www.sqlflow.cn/)是SQLflow工具的中文译名,实际就是sqlflow. 对于SQL flow来说,底层调用的是General SQL Parser(GSP https://sqlparser.com) 的库. 这个gsp有开源的java demo项目:https://github.com/sqlparser/gsp_demo_java 1.快速使用…

第6章:支持向量机

间隔与支持向量 w为法向量,决定的是超平面的方向。b是偏移项,决定了超平面与原点之间的距离。 为什么最大化间隔,得到的就是最优平面呢? 当超平面没有正确划分正负样本时,几何间隔为负数。几何间隔,各个…

网络编程基础(1)

目录 网络编程解决是跨主机的进程间通讯 1、网络 2、互联网 3、ip地址 (1)ipv4: (2)ipV6:1 (3)IP地址的组成: (4)Linux查看IP地址:ifconfig 4、mac地址 5、ping Ip地址 6…

【python最大公因数、最小公倍数】

文章目录 最大公约数/最小公倍数辗转相除法求最大公约数/公倍数—暴力穷举求最大公约数/公倍数—辗转相除 最大公约数/最小公倍数 最大公约数(GCD): 最大公约数是指两个或多个整数中能够同时整除的最大的正整数。也就是说,如果 a …

VisualVM(All-in-One Java Troubleshooting Tool)多合-故障处理工具

VisualVM:多合-故障处理工具 VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的 运行监视 和 故障处理 程序之一,曾经在很长一段时间内是Oracle官方主力发展的虚拟机故障处理工具。Oracle曾在VisualVM的软件说明中写…

数据结构--最短路径 Floyd算法

数据结构–最短路径 Floyd算法 F l o y d 算法:求出每⼀对顶点之间的最短路径 \color{red}Floyd算法:求出每⼀对顶点之间的最短路径 Floyd算法:求出每⼀对顶点之间的最短路径 使⽤动态规划思想,将问题的求解分为多个阶段 对于n个顶…

JRE、JDK、JVM及JIT之间有什么不同?_java基础知识总结

当涉及Java编程和执行时,以下术语具有不同的含义: 1.JRE (Java Runtime Environment) JRE是Java运行时环境的缩写。它是一个包含用于在计算机上运行Java应用程序所需的组件集合。JRE包括了以下几个主要部分: Java虚拟机(JVM):用…

【开源三方库】bignumber.js:一个大数数学库

OpenHarmony(OpenAtom OpenHarmony简称“OpenHarmony”)三方库,是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开发OpenHarmony应用。如果是发布到开源社区,称为开源三方库,开发者…

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库

QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库 0、背景1、基本环境2、搭建交叉编译环境3、在交叉编译服务器上交叉编译安装unixODBC3.1 下载unixODBC3.2 交叉编译unixODBC3.2.1 基本编译说明3.2.2 交叉编译说明3.2.3 ./configure -build,-host,-target…

设计模式8:代理模式-静态代理

我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。 本文目录 静态代理的实例1. 售票代理2. 明星代理 静态代理的实例 1. 售票代理 售票服务 public interface TicketService {…

不知道开黑语音哪个软件好?

黑盒语音官方网站:https://chat.top 免费支持AI降噪免费支持高品质立体声免费支持码率128Kbps,192Kbps免费支持上传100M文件免费支持动态房间头像和横幅支持更多自定义动态表情即将支持更多免费功能

IP 地址监控工具

地址监控实用程序是一套 IP 工具,包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器,用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控,用于管理 DNS 名称、网络的 IP 和 MAC 地址,并跟踪 IP 地址。 IP…

博冠光电8K事业部招聘研发工程师及产品经理

一、高级结构工程师 工作职责:1、负责公司产品的机械结构设计、模具开发和量产导入;2、负责机械结构方向的技术预研,包括技术专题研究,技术难题攻关; 3、负责结构组的技术管理工作,包括带新人,…

字符串拼接操作的面试题讲解

1、字符串拼接操作 常量与常量的拼接结果在常量池,原理是编译期优化。String s1"a""b""c";常量池中不会存在相同内容的常量。只要其中有一个是变量,结果就在 堆 中。变量拼接的原理是StringBuilder。如果拼接符号的前后出…

JavaScript中的this关键字的作用,以及它如何确定其值

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ this关键字的作用⭐ this的值取决于执行上下文⭐ 示例⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这…

MySQL数据库第十四课--------sql优化---------层层递进

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…