《设计模式之美》第三章 总结

《设计模式之美》总结

在这里插入图片描述

第三章 设计原则

3.1 单一职责原则:如何判定某个类的职责是否单一

3.1.1 单一职责原则的定义和解读
定义:一个类或模块只负责完成一个职责(功能)
含义:不要设计功能大而全的类或模块,否则要拆成粒度小的类或模块;
3.1.2 如何判断类的职责是否单一
在不同的应用场景和不同阶段的需求背景下,同一个类的职责是否单一的判定可能不一样
在不同业务场景下,同一个类的职责是否单一的判定可能不一样
判定原则:
1. 如果类中的代码行数、函数或属性过多,影响代码的**可读性和可维护性**,就需要考虑对类进行拆分;
2. 如果某个类依赖的其他类过多,或者依赖某个类的其他类过多,不符合**高内聚、低耦合**的代码设计思想,就要考虑拆分;
3. 如果类中的私有方法过多,就需要将私有方法独立到新的类中,并设置为public方法,供更多的类使用,从而**提高代码的复用性**;
4. 如果类很难准确命名(很难用一个业务名词概括),或者只能**笼统命名**,就说明类的职责定义不够清晰;
5. 如果类中的大量方法**集中操作其中的几个属性**,可以考虑将这些属性和对应的方法拆分出来;
3.1.3 类的职责是否越细化越好
设计原则和设计模式的最终目的都是为了提高代码的可读性、可扩展性、复用性和可维护性等。判断使用某一设计原则是否合理时,可以以此作为最高的评价标准。

3.2 开闭原则:只要修改代码,就一定违反开闭原则吗

3.2.1 如何理解“对扩展开放,对修改关闭”
开闭原则是最难理解最难把握的原则,又是最有用的;
大部分设计模式都是为了解决代码的扩展性问题而产生的,它们主要遵守的设计原则就是开闭原则;
定义:添加一个新功能时应该是在已有代码基础上扩展代码(新增模块、类和方法等),而非修改已有的代码(模块、类、方法等)
3.2.2 修改代码就意味着违反开闭原则吗
添加一个新功能时,不可能做到任何模块、类和方法的代码都不“修改”;
原则:尽量让修改操作集中在上层代码中,尽量让核心、复杂、通用、底层的那部分代码满足开闭原则;
3.2.3 如何做到“对扩展开放,对修改关闭”
方法:
1. 需要具备扩展意识、抽象意识和封装意识,这些意识可能比任何技巧都重要;
2. 编码前多花时间思考:未来可能有哪些需求的变更;设计代码结构,预留扩展点;
3. 善于识别代码中可变部分和不可变部分:将可变部分封装,达到隔离的效果,并提供抽象化的不可变接口给上层系统调用;当实现变化时,只需要基于相同的抽象接口扩展新的实现,替换旧的实现,上层系统的代码几乎不需要修改;
4. 大部分设计模式都是为了解决扩展性问题,以开闭原则作为指导原则而设计的;
5. 具体包括:多态、依赖注入、基于接口而非实现编程、大多数设计模式;
3.2.4 如何在项目中灵活应用开闭原则
如何识别代码的扩展点:
1. 对于短期可能实现的扩展,需求改动对代码结构影响比较大的扩展,或实现成本不太大的扩展,可以事先进行可扩展性设计,反之等到有需求驱动时通过重构方式来实现扩展的需求
2. 扩展性会影响可读性;

3.3 里氏替换原则:什么样的代码才是违背里氏替换原则

3.3.1 里氏替换原则的定义
定义:子类对象能投替换到程序中父类对象出现的任何地方,并且保证程序原有的逻辑行为不变和正确性不被破坏;
3.3.2 里氏替换原则与多态的区别
多态是一种代码实现思路,里氏替换原则是一种设计原则,用来指导继承关系中子类的设计:在替换父类时,确保不改变程序原有的逻辑行为,以及不破坏程序的正确性;
3.3.3 违反里氏替换原则的反模式
在设计子类时,需要遵守父类的行为约定(或称为协议),子类可以改变函数内部实现逻辑,但不能改变函数原有的行为约定,包括:函数要实现的功能、对输入、输出和异常的约定,以及对注释中罗列的任何特殊情况的说明等,反之则违反里氏替换原则;
这里的继承也可以替换成接口
测试是否违反里氏替换原则:用父类的单元测试验证子类的代码,看是否运行失败;

3.4 接口隔离原则:如何理解该原则中的“接口”

定义:客户端不应该被强迫依赖它不需要的接口;
3.4.1 把接口理解为一组API或函数
如果部分接口或函数只被部分调用者使用,就需要将这部分接口或函数隔离出来,并单独提供给对应的调用者使用,而不是强迫其他调用者也依赖这部分不会被用到的接口或函数;
3.4.2 把接口理解为单一API或函数
和单一职责原则有点类似,使用接口隔离原则判断接口职责是否单一:通过调用者如何使用接口来间接地判定接口是否职责单一,
3.4.3 把接口理解为OOP中的接口概念

3.5 依赖反转原则:依赖反转与控制反转、依赖注入有何关系

3.5.1 控制反转(IOC)
“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己编写代码控制整个程序的执行流程。在使用框架之后,整个程序的执行流程由框架控制,流程的控制权从程序员“反转”给了框架;
实现方式:模板设计模式、依赖注入等
是一种比较笼统的设计思想,一般用来指导框架的设计;
3.5.2 依赖注入(DI)
依赖注入是一种具体的编程技巧;
定义:不通过new的方式在类内部创建依赖的类对象,将依赖的类对象在外部创建好之后,通过构造函数、参数等方式传递(或称注入)给类使用;
是编写可测试性代码的有效手段;
3.5.3 依赖注入框架(DI Framework)
依赖注入框架提供扩展点,简单配置所有需要创建的类对象、类之间的依赖关系,就可以实现框架自动创建对象、管理对象生命周期、依赖注入等功能;
3.5.4 依赖反转原则(DIP)
用好比较简单,理解比较难
也叫依赖倒置原则:高层模块不要依赖低层模块,高层模块和低层模块应该通过抽象互相依赖,以及抽象不要依赖具体实现细节,具体实现细节依赖抽象;
高层模块:调用者;
低层模块:被调用者;
Tomcat和应用程序之间的关系举例:tomcat是调用者,属于高层;应用程序是被调用者,属于低层;二者之间没有直接的依赖,二者之间依赖于Servlet规范;Servlet规范不依赖于Tomcat容器和应用程序的实现细节;
用处:用例指导框架设计;

3.6 KISS原则和YAGNI原则:二者是一回事吗

3.6.1 KISS原则的定义和解读
定义:尽量保持简单;
KISS原则是保持代码可读性、可维护性的重要手段;
3.6.2 代码并非行数越少越简单
3.6.3 代码复杂不一定违反KISS原则
3.6.4 如何写出满足KISS原则的代码
1. 慎重使用过于复杂的技术来实现代码,如复杂的正则表达式、编程语言中过于高级的语法等;
2. 不要“重复造轮子”,首先考虑使用已有类库;
3. 不要过度优化,尽量避免使用一些“奇技淫巧”;
3.6.5 YAGNI原则和KISS原则的区别
含义:不要去设计当前用不到的功能,不要去编写当前用不到的代码;核心是:不要过度设计;

3.7 DRY原则:相同的两段代码就一定违反DRY原则吗

定义:不要编写重复的代码
3.7.1 代码逻辑重复
可以通过抽取更细粒度的函数的方式来解决;
3.7.2 功能(语义)重复
3.7.3 代码执行重复
3.7.4 代码的复用性
提高复用性的方法:
1. 降低代码的耦合度;
2. 满足单一职责原则:代码的粒度越细,其通用性越好,越容易复用;
3. 将代码模块化;
4. 业务逻辑和非业务逻辑分离;
5. 通用代码“下沉”;
6. 继承、封装、抽象、多态:越抽象的代码越容易被复用;
7. 应用模板等设计模式;
8. 具备复用的意思最重要;
9. “Rule of Three”原则:第一次编写代码时,不考虑复用性,在之后遇到复用场景时,在重构,使其可以复用;

3.8 LoD: 如何实现代码的“高内聚,低耦合”

迪米特法则
3.8.1 何为“高内聚,低耦合”
高内聚、低耦合是一个非常重要的设计思想,一个通用的设计思想;
作用:有效提高代码的可读性和可维护性,缩小功能改动引起的代码改动范围;
实现原则:单一职责原则、基于接口而非实现编程;
使用范围:指导系统、模块、类、函数的设计开发,以及微服务、框架、组件和类库等的设计开发;
举例:在类设计中,高内聚:用来指导类本身的设计,相近功能放到同一个类中,不相近的不要放到同一个类中;低耦合:用来指导类之间依赖关系的设计,类之间的依赖关系要简单清晰;
关联:高内聚有助于低耦合,低内聚会导致高耦合;
3.8.2 LoD的定义描述
定义:最少知识原则,每个模块只应该了解那些与它关系密切的模块的有限知识;
3.8.3 定义解读
解读:不应该存在直接依赖关系的类之间不要有依赖,有依赖关系的类之间尽量只依赖必要的接口;

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

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

相关文章

汽车纵染压制专用液压机比例阀放大器

汽车纵染压制专用液压机比例阀放大器是一种专门用于汽车纵梁拉伸工艺的设备,它也可以用于其他金属薄板的压制成型及校正工艺。该类型的液压机通常具备独立的动力机构和电气系统,采用PLC技术进行控制,以确保操作的准确性和稳定性。除了纵梁拉伸…

【随想录】Day31—第八章 贪心算法 part01

目录 题目1: 455. 分发饼干1- 思路2- 题解⭐分发饼干 ——题解思路 题目2: 摆动序列1- 思路2- 题解⭐摆动序列 ——题解思路 题目3: 最大子数组和1- 思路2- 题解⭐ 最大子数组和 ——题解思路 题目1: 455. 分发饼干 题目链接:455. 分发饼干 1- 思路 贪心的思路&am…

Linux多进程(二)进程通信方式二 消息队列

消息队列是在两个进程之间传递二进制块数据的一种简单有效的方式。每个数据块都有一个特定的类型,接收方可以根据类型来有选择地接收数据,而不一定像管道和命名管道那样必须以先进先出的方式接收数据。 一、创建消息队列 创建一个消息队列或者获取一个…

Linux多进程(二)进程通信方式一 管道

管道的是进程间通信(IPC - InterProcess Communication)的一种方式,管道的本质其实就是内核中的一块内存(或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接…

Go语言并发赋值的安全性

struct并发赋值 type Test struct {X intY int }func main() {var g Testfor i : 0; i < 1000000; i {var wg sync.WaitGroup// 协程 1wg.Add(1)go func() {defer wg.Done()g Test{1, 2}}()// 协程 2wg.Add(1)go func() {defer wg.Done()g Test{3, 4}}()wg.Wait()// 赋值…

全氟己酮灭火绳的用法早知道:灭火绳多少钱一米?

全氟己酮灭火装置作为一种高效、安全、环保的灭火技术&#xff0c;已经成为了备受青睐的新型灭火选择之一。伴随着市场需求不断增长&#xff0c;在全氟己酮厂家的努力下&#xff0c;各式各样的全氟己酮自动灭火装置不断涌现&#xff0c;包括自动灭火贴、灭火片、灭火毯、灭火绳…

直播报名 | 科技出海新势力,遥感+AI助力一带一路

遥感技术的出海之路顺畅吗&#xff1f; 国内外遥感应用的关注点相同吗&#xff1f; 目前珈和主要辐射哪些海外国家&#xff1f; … 上周数据赋农季第三期《科技出海&#xff0c;遥感AI赋能“一带一路”提升种植园规模效益》直播预告一出&#xff0c;小伙伴们纷纷来咨询珈和的海…

《S32G3系列芯片——Boot详解》持续更新中...

总目录&#xff1a;《S32G3系列芯片——Boot详解》持续更新中... ... 一、前言二、启动时序概述&#xff08;Boot Sequence&#xff09;三、启动特性&#xff08;Boot Features&#xff09;四、启动模式&#xff08;Boot Mode&#xff09;五、《S32G3系列芯片——Boot详解》系列…

Centos之yum安装好玩的命令

1.会动的小火车 我在root下使用的 yum install sl.x86_64sl2.figlet yum install figlet.x86_64figlet 55553.cowsay会说话 yum install cowsay

力扣数据库题库学习(4.23日)

610. 判断三角形 问题链接 解题思路 题目要求&#xff1a;对每三个线段报告它们是否可以形成一个三角形。以 任意顺序 返回结果表。 对于三个线段能否组成三角形的判定&#xff1a;任意两边之和大于第三边&#xff0c;对于这个表内的记录&#xff0c;要求就是&#xff08;x…

一看就会,uni-app打包运行成微信小程序,部署

前言 这篇文章主要针对刚开始接触混合开发的小伙伴&#xff0c;全文使用uniapp框架&#xff0c;使用HBuilderX结合微信小程序开发工具作为开发环境。搭建一个简单的入手项目&#xff0c;主要是对搭建项目的流程做一个简单介绍 提示&#xff1a;以下是本篇文章正文内容&#xff…

【GEE】优雅地实现年度、季度、月度甚至旬度影像合成(附完整代码)

以下文章来源于GEE学习室 &#xff0c;作者GEEStudyRoom 光学影像由于受到天气因素&#xff08;云、雨和雾等&#xff09;影响&#xff0c;导致单张影像数据存在大量坏死像元。此处&#xff0c;坏死像元指由于受到云遮挡等导致下垫面地物覆盖不能准确被卫星信息捕捉从而不能正…

【Linux系统编程】第八弹---权限管理操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、修改文件权限的做法(二) 2、文件类型 3、可执行权限 4、创建文件/目录的默认权限 4.1、权限掩码 总结 前面一弹我们学…

git 重命名文件,提交后,此文件的提交记录丢失

零、问题现象&#xff1a; 文件重命名后&#xff0c;提交到 git 仓库&#xff0c;发现重命名操作 变成 删除旧文件&#xff0c;新增一个新文件&#xff0c;原来文件的提交记录丢失&#xff0c;看不到了。 一、正确的重命名提交方法 1.1、 先执行add命令来将修改内容后的文件…

校园论坛圈子,校园跑腿小程序,2024 一款功能强大校园综合服务小程序开源源码

目的 本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统&#xff0c;前台用户使用小程序发布跑腿任何和接跑腿任务&#xff0c;系统基于TP6uni-app框架开发;客户移动端采用uni-app开发&#xff0c;管理后台TH6开发&#xff1b;通过后台管理跑腿的用户、查看跑腿信…

2024年最佳软件测试工具40强清单

什么是测试工具 软件测试工具是指那些支持从计划、需求收集、构建创建、测试执行、缺陷记录到测试分析等各种测试活动的产品。这些工具主要用于检测软件的稳定性、彻底性以及其他性能参数。 市场上有大量的软件测试工具&#xff0c;众多选择使得难以确定最适合你项目的测试工具…

前端css中table表格的属性使用

前端css中table表格的属性使用 一、前言二、常见的表格属性1.边框的样式2.布局和对齐3.间距和填充4.背景和颜色5.字体的样式6.边框的圆角 三、简单的表格&#xff0c;例子11.源码12.源码1效果截图 四、给表格添加动画效果&#xff0c;例子21.源码22.源码2的运行效果 五、结语六…

备考2024年小学生古诗文大会:吃透10道历年真题和知识点(持续)

对上海小学生的小升初和各种评优争章来说&#xff0c;语文、数学、英语的含金量较高的证书还是很有价值和帮助的。对于语文类的竞赛&#xff0c;小学生古诗文大会和汉字小达人通常是必不可少的&#xff0c;因为这两个针对性强&#xff0c;而且具有很强的上海本地特色。 根据往…

基于智能推荐的校园兼职招聘平台

3协同过滤算法简介 目前&#xff0c;推荐算法有很多种&#xff0c;可以应用于日常生活的许多领域&#xff0c;对大量数据进行处理和分析&#xff0c;然后进行分类。它将显示用户可能感兴趣的内容&#xff0c;这是推荐算法的主要功能之一[1]。 协同过滤算法通常包括两类&#…

ARP 攻击神器:ARP Spoof 保姆级教程

一、介绍 arpspoof是一种网络工具&#xff0c;用于进行ARP欺骗攻击。它允许攻击者伪造网络设备的MAC地址&#xff0c;以欺骗其他设备&#xff0c;并截获其通信。arpspoof工具通常用于网络渗透测试和安全评估&#xff0c;以测试网络的安全性和漏洞。 以下是arpspoof工具的一些…