设计模式学习笔记 - 回顾总结:在实际软件开发中常用的设计思想、原则和模式

news2024/11/26 10:46:58

概述

本章,先来回顾下整个专栏的知识体系,主要包括面向对象、设计原则、编码规范、重构技巧、设计模式五个部分。

在这里插入图片描述


面向对象

相对于面向过程、函数式编程,面向对象是现在最主流的编程范式。纯面向过程的编程方法,现在已经不多见了,而新的函数式编程,因为它的应用场景比较局限,所以大多作为面向对象编程的一种补充,用在科学技术、大数据处理等特殊领域。

面向对象提供了丰富的特性,比如封装、抽象、继承、多态,有助于实现复杂的设计思路,是很多设计原则、设计模式等编程实现的基础。

在面向对象第一部分,需重点掌握面向对象的四大特性:封装、抽象、继承、多态,以及面向对象编程与面向过程编程的区别。需要特别注意的是,在平时的面向对象编程开发中,我们要尽量避免写出面向过程风格的代码

此外,还重点学习了面向对象分析(OOA)、设计(OOD)、编程(OOP)。其中,面向对象分析就是需求分析,面向对象设计就是代码层面设计,输出的设计结果是类。面向对象编程就是将设计的结果翻译成代码的过程

在专栏中,重点讲解了面向对象设计这一部分。我们可以把面向对象设计分为四个环节:划分职责并识别出有哪些类、定义类的属性和方法、定义类之间的交互关系、组装类并提供执行入口。通过几个案例,带你实战了一下设计过程,希望你能面向开发需求时,不会无从下手,做到有章可循,按照我们给出的步骤,有条不紊地完成设计。

在面向对象这一部分,还额外讲到两个思想:基于接口而非实现编程设计思想多用组合少用继承的设计思想。这两个设计思想虽然简单,但非常实用,应用它们能让代码更加灵活,更加容易扩展,所以,这两个设计思想几乎贯穿在我们整个专栏的代码中。

设计原则

在专栏的开始,我们总结了一套评判代码质量的标准,比如可读性、可维护性、可扩展性、复用性等,这是自从代码整理质量的角度来评判的。但是,落实到具体细节,我们往往是从是否符合设计原则,来对代码进行评判。比如,我们说这段代码的可扩展性比较差,主要原因是违背了开闭原则。也就是说,相对于可读性、可维护性、可扩展性等代码整体质量的评判标准,设计原则更加具体,能够更加明确地指出代码存在的问题

在专栏中讲解的设计原则包括:SOLID 原则、DRY 原则、KISS 原则、YAGNI 原则、LOD 原则。这些原则的定义都很简单,看似很好理解,但也都比较抽象,比较难落地指导具体的编程。所以,学习的重点是透彻理解它们的设计初衷,找你给我它们能解决哪些编程问题,有哪些常用的应用场景

SOLID 原则并非一个原则。它包含:单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)。其中,里氏替换和接口隔离这两设计原则并不那么常用,稍微了解即可。我们重点学习了单一职责、开闭、依赖倒置这三个原则。

单一职责原则是类职责划分的重要参考依据,是保证 “高内聚” 的有效手段,是面向对象设计前两步(划分职责并识别出有哪些类、定义类及其属性和方法)的主要指导原则。单一职责原则的难点在于,对代码职责是否足够单一的判定。这要根据具体的场景来具体分析。同一个类的设计,在不同的场景下,对职责是否单一的判定,可能是不同的。

开闭原则是保证代码扩展性的重要指导原则,是对代码扩展性的具体解读。很多设计模式诞生的初衷都是为了提高代码的扩展性,都是以满足开闭原则为设计目的。实际上,尽管开闭原则的描述为对扩展开放、对修改关闭,但也并不是说杜绝一切代码修改,正确的理解是以最小化修改代价来完成新功能的添加。实际上,在平时的开发中,我们要时刻思考,目前的设计在以后应对新功能扩展时,是否能做到不需要大的修改(比如调整代码接口)就能完成。

依赖倒置原则主要用来指导框架层面的设计。高层模块不依赖低层模块,它们共同依赖一个抽象。深挖一下的话,我们要把它和控制反转、依赖注入、依赖注入框架做区分。实际上,比依赖倒置原则更加常用的是依赖注入。它用来指导如何编写可测试性代码,换句话说,编写可测试代码的诀窍就是依赖注入

KISS、YAGNI 可以说是两个万金油原则,小到代码、大到架构、产品,很多场景都能套用这两条原则。其中,YAGNI 原则表示暂时不需要的就不要做,KISS 原则表示要做就要尽量保持简单。跟单一职责原则类似,掌握这两个原则的难点在于,对代码是否符合 KISS、YAGNI 原则的判断,也需要根据具体的场景来具体分析,在某个时间点、某个场景下,某段代码符合 KISS、YAGNI 原则,换个时间、换个场景可能就不符合了。

DRY 原则主要是体现你不要写重复代码,这个倒不难掌握。LOD 原则又叫最小知道原则,不该有直接依赖关系的类不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。如果说单一职责原则是为了实现 “高内聚”,那这个原则就是为了实现 “松耦合”。

编码规范

编码规范很重要,特别是对于开发经验不多的程序员,遵从哈ode编码规范,能让你写出来的代码至少不会太烂。而且,编码规范都比较具体,不像设计原则、模式、思想那样比较抽象,需要融入很多个人的理解和思考。所以,它落地执行起来更加容易。

虽然我们讲了很多设计思想、原则、模式,但是,大部分代码都不需要用到这么复杂的设计,即便用到,可能也就是用到极个别的知识点,而且用的也不会很频繁。但是,编码规范就不一样了。编码规范影响到你写的每个类、函数、变量。你编写每行代码的时候都要思考是否符合编码规范。

此外,编码规范主要解决代码的可读性问题。在编写代码时,我们要把可读性放到首位。只有在代码可读性比较好的情况下,再去思考代码的扩展性、灵活性等。一般来说,一个可读性比较好的代码,对它修改、扩展、重构都不是难事,因为这些工作的前提都是先读懂代码。

不过,专栏只是总结了一些最常用的、最能明显改善代码质量的编码规范。你可以自己参考其他学习资料,比如《重构》、《代码大全》、《代码整洁之道》等书籍。

重构技巧

重构作为保证代码质量不腐化的有效手段,利用的是面向对象、设计原则、设计模式、编码规范这些理论。在重构过程中:

  • 我们用到代码质量评判标准来评判代码的整体质量,
  • 然后对照设计原则来发现代码存在的具体问题,
  • 最后用设计模式或者编码规范对存在的问题进行改善。

持续重构除了能保证代码质量不腐化之外,还能有效地避免过度设计。有了持续重构意识,我们就不会因为担心设计不足和过度设计。我们先按照最简单的设计思路来设计,然后在后续的开发过程中逐步迭代重构。

我们还对重构进行了粗略的分类,分为大规模高层次的重构和小规模低层次的重构。不管哪种重构,保证重构不出错,除了熟悉代码之外,还有就是完善的单元测试

设计模式

如果说设计原则相当于编程心法,那设计模式就相当于具体的招式。设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。我们用设计原则来评判代码设计有哪些问题,然后再通过具体的设计模式来改善。相对于其他部分来讲,设计模式时最容易学习的,但也是最容易被滥用的。所以,在《实际开发中如何避免过度设计,如何避免设计不足》章节,专门讲解了如何避免过度设计。

经典的设计模式有 23 中,分为三种类型:创建型、结构型和行为型。

  • 创建型设计模式主要解决 “对象的创建” 问题,
  • 结构型设计模式主要解决 “类或对象的组合” 问题,
  • 行为型设计模式主要解决 “类或对象之间的交互” 问题。

虽然专栏中讲到的设计模式有很多,但常用的并不多,主要有:单例、工厂、建造者、代理、装饰器、适配器、观察者、模板、策略、职责链、迭代器这 11 种,所以,你只要集中精力,把这 11 种搞明白就可以了,剩下的那 12 种稍微了解,等到真正用到时,再深入地去研究学习就可以了

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

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

相关文章

网络网络层之(4)IPv4协议

网络网络层之(1)IPv4协议 Author: Once Day Date: 2024年4月4日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文档可参考专栏:通信网络技术_Once-Day的…

设置 kafka offset 消费者位移

文章目录 1.重设kafka消费者位移2.示例2.1 通过 offset 位置2.2 通过时间2.3 设置到最早 1.重设kafka消费者位移 维度策略含义位移Earliest把位移调整到当前最早位移处位移Latest把位移调整到当前最新位移处位移Current把位移调整到当前最新提交位移处位移Specified-Offset把位…

奥威-金蝶BI现金流量表模板,可借鉴、可套用

企业现金流一旦出了问题都是大问题,会直接影响到企业的日常运作,甚至直接关系到企业能不能继续存活,因此现金流量表是企业财务分析中重要报表之一,也是企业监控财务监控情况的重要手段之一。那么这么重要的一份现金流量表该怎么做…

Angular中创建和使用服务

Angular中的服务 文章目录 Angular中的服务前言一、创建服务二、使用服务 前言 Angular 服务是 Angular 应用程序中用于封装可重用逻辑的类。服务在应用程序的多个组件之间共享数据和功能,而不依赖于应用程序的UI。服务可以用于诸如数据处理、与后端通信、用户身份…

Verilog中4位数值比较器电路

某4位数值比较器的功能表如下。 请用Verilog语言采用门级描述方式,实现此4位数值比较器 参考代码如下: (CSDN代码块不支持Verilog,代码复制到notepad编辑器中,语言选择Verilog,看得更清楚) t…

芸众商城电商专业版400+插件源码+搭建教程

介绍: 芸众商城社交电商系统SAAS平台前端基于vue开发,后端基于研发积分商城系统源码 php,本文安装芸众商城全插件(400多个)商业版平台源码,可同时支持多端口部署运行;使用宝塔面板一键部署的形…

Linux:进程等待 进程替换

Linux:进程等待 & 进程替换 进程等待wait接口statuswaitpid接口 进程替换exec系列接口 当一个进程死亡后,会变成僵尸进程,此时进程的PCB被保留,等待父进程将该PCB回收。那么父进程要如何回收这个僵尸进程的PCB呢?父…

bfs之八数码

文章目录 八数码解题思路图解举例算法思路 代码CPP代码Java代码 八数码 在一个 33的网格中,1∼8这 8个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如: 1 2 3 x 4 6 7 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一…

学成在线 - 第3章任务补偿机制实现 + 分块文件清理

7.9 额外实现 7.9.1 任务补偿机制 问题:如果有线程抢占了某个视频的处理任务,如果线程处理过程中挂掉了,该视频的状态将会一直是处理中,其它线程将无法处理,这个问题需要用补偿机制。 单独启动一个任务找到待处理任…

scikit-learn实现单因子线性回归模型

1.是什么: 针对机器学习提供了数据预处理,分类,回归等常见算法的框架 2.基于scikit-learn求解线性回归的问题: 2.1.求解a,b对新数据进行预测: 2.2评估模型表现(y和y’的方差MSE)…

论文查重率高,有什么办法降重吗?

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下,延毕的威胁可能就在眼前。对于即将告别校园的学子们,这无疑是个噩梦。四年磨一剑,谁也不想在最后关头功亏一篑。 查重率过高,无非以下两种原因。要么是作为“…

小程序搜索排名优化 三步操作提升

搜索排名优化最直接的一个目的就是为了提升小程序的排名和流量,获取用户的信任度。当用户在搜索关键词的时候,能让用户看到小程序,增加被发现和点击的机会。 一、关键词优化: 1.选择合适的关键词:选择与小程序内容高…

解决Gitlab集成Jira时报SSL证书问题

1. 问题描述 在gitlab中集成jira的时候,由于jira是企业内部网址,并使用自己签名的SSL证书,一直会报证书验证不过的问题,报错信息如下: Connection failed. Check your integration settings. SSL_connect returned1 …

odoo实施之各种导航设计

odoo各种基础能力:活动、讨论 玩转odoo,真有玩的体验 odoo消息提醒能力 odoo 讨论模块 odoo 通过new message触发任务 安装odoo studio进行拖拉拽设计 查阅官方文档,向官方提issue 欧洲和美国,虽然都是英语,但日期格式…

win10下,svn上传.so文件失败

问题:win10下使用TortoiseSVN,svn上传.so文件失败 解决:右键,选择Settings,Global ignore pattern中删除*.so,保存即可。

Verilog中4bit超前进位加法器

4bit超前进位加法器的逻辑表达式如下: 中间变量GiAiBi,PiAi⊕BiGi​Ai​Bi​,Pi​Ai​⊕Bi​ 和:SiPi⊕Ci−1Si​Pi​⊕Ci−1​,进位:CiGiPiCi−1Ci​Gi​Pi​Ci−1​ 用Verilog语言采用门级描述方式&am…

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?

UIOTOS可以了解下,uiotos.net,通过连线来代替脚本逻辑开发,复杂的交互界面,通过页面嵌套轻松解决,是个很新颖的思路,前端零代码! 蓝图连线尤其是独创的页面嵌套和属性继承技术,好家…

如何使用dockerfile文件将项目打包成镜像

要根据Dockerfile文件来打包一个Docker镜像,你需要遵循以下步骤。这里假设你已经安装了Docker环境。 1. 准备Dockerfile 确保你的Dockerfile文件已经准备就绪,并且位于你希望构建上下文的目录中。Dockerfile是一个文本文件,包含了用户可以调…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目,是一个类似知乎的网站,可以展示专栏和文章的详情,可以登录、注册用户,可以创建、删除、修改文章,可以上传图片等等。 这个项目全部采用Composition API 编写,并且使用了TypeScript&#…

【k8s多集群管理平台开发实践】八、client-go实现service读取列表、创建service、读取yaml配置并更新

文章目录 简介 一.k8s的service列表1.1.controllers控制器代码1.2.models模型代码 二.创建service2.1.controllers控制器代码2.2.models模分代码 三.读取和更新service的yaml配置3.1.controllers控制器代码3.2.models模型代码 四.路由设置4.1.路由设置 五.前端代码5.1.列表部分…