设计模式学习笔记 - 学前简述

1.为什么学习设计模式?

学习设计模式的原因:

  1. 应对面试中的设计模式相关问题;
  2. 写出高质量代码,告别让人吐槽的烂代码;
  3. 提高复杂代码的设计和开发能力
  4. 让读源码、学习框架爱事半功倍;
  5. 为职场发展铺垫。

设计模式作为一门与编码、开发有着直接关系的基础知识,是你现在就要开始学习的。早点学习,以后的项目就都可以拿来锻炼,每写一行代码都是对内功的利用和加深,是可以收益整个事业生涯的一个技能。

2.如何写出高质量代码,如何评价代码质量的好坏?

2.1 如何评价代码质量的高低?

代码质量的评价有很强的主观性,描述代码质量的词汇也有很多,比如可读性、可维护性、灵活、优雅、简洁等,这些是从不同的维度去评价代码质量的。它们之间相互关联,并不是独立的,比如代码的可读性好、可扩展性好就意味着代码的可维护性好。代码质量的高低是一个综合各种因素得到的结论。所以,不能通过单一的维度去评价一段代码的好坏。

2.2 常量的评价标准有哪几个?

一般,常用到的几个评价代码质量的标准是:

  • 可维护性
  • 可读性
  • 可扩展性
  • 灵活性
  • 简洁性
  • 可复用性
  • 可测试性。

其中,可维护性、可读性、可扩展性又是使用最多、最重要的三个评价标准。

2.3 如何写出高质量的代码?

要写出高质量的代码,我们就要掌握一些更加细化、更加能落地的编程方法论,这就包含面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等,这就是后面学习的重点。

3.面向对象、设计原则、设计模式、编码规范、重构的关系

面向对象

目前主流的编程风格有三种,分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是其中最主流的。

关于面向对象,你需要掌握下面这 7 大知识点:

  • 面向对象的四大特性:封装、抽象、继承、多态。
  • 面向对象编码与面向过程的区别和联系
  • 面向对象分析、面向对象设计和面向对象编程
  • 接口和抽象类的区别以及各自的应用场景
  • 基于接口而非实现类编程的设计思想
  • 多用组合,少用继承的设计思想
  • 面向过程的贫血模式和面向对象的充血模型

设计原则

设计原则是知道我们代码设计的一些经验总结。有如下几种常用的设计原则:

  • SOLID 原则 - SRP 单一职责
  • SOLID 原则 - OCP 开闭原则
  • SOLID 原则 - LSP 里氏替换原则
  • SOLID 原则 - ISP 接口隔离原则
  • SOLID 原则 - DIP 依赖倒置原则
  • DRY 原则、KISS 原则、YAGNI 原则、LOD 原则

设计模式

设计模式是针对软件开发中经常遇到的一些涉及问题,总结出来的一套解决方案或设计思想。设计模式的学习难点是了解他们都能解决哪些问题,掌握典型的应用常见,并懂得不过度应用。

设计模式一共有 23 种,可分为三大类:创建型、结构性和行为型。对于这 23 种设计模式的学习,我们要有侧重点,因为有些模式比较常用,有些模式是很少被用到。对于常用的设计模式,我们要多花时间掌握;对于不常用的设计模式,只需要稍微了解即可。

1. 创建型

常用的有:

  • 单例模式
  • 工厂模式(工厂方法和抽象工厂)
  • 建造者模式

不常用的有:

  • 原型模式

2. 结构型

常用的有:

  • 代理模式
  • 桥接模式
  • 装饰者模式
  • 适配器模式

不常用的有:

  • 门面模式
  • 组合模式
  • 享元模式

3.行为型

常用的有:

  • 观察者模式
  • 模板模式
  • 策略模式
  • 职责链模式
  • 迭代器模式
  • 状态模式

不常用的有:

  • 访问者模式
  • 备忘录模式
  • 命令模式
  • 解释器模式
  • 中介模式

编程规范

编程规范主要解决代码的可读性问题。编程规范相对于设计原则、设计模式,更加具体、更加侧重代码细节。即使,你对设计原则不熟悉、对设计模式不了解,但你最起码要掌握基本的编码规范,比如给变量、类、函数命名、如何写代码注释、函数不宜过长、参数不能过多等等。

对于编码规范,有很多书籍以及讲得很好了(比如《重构》《代码大全》《代码整洁之道》等)。而且,每条编码规范都非常简单、非常明确,比较偏向记忆,只需要照着来就可以了。

持续地小重构依赖的理论基础主要就是编程规范。

除了编码规范,后面还会介绍一些代码的坏味道,让你知道什么样的代码是不符合规范的,应如何优化。

参照编码规范,可以写出可读性好的代码;参照代码的坏味道,你可以找出代码存在的可读性问题。

代码重构

在软件开发中,只要软件在不停地迭代,就没有一劳永逸的设计。随着需求的变化,代码的不停堆砌,原有的设计必定会存在这样那样的问题。针对这些问题,我们就需要进行代码重构。重构是软件开发过程中非常重要的环节,持续重构是保持代码质量不下降的有效手段,能有效避免代码腐化到无可救药的地步。

而重构就是根据前面提到的面向对象设计思想、设计原则、设计模式、编码规范,来进行的。实际上,设计思想、设计原则、设计模式一个最重要的应用常见就是在重构的时候。

虽然设计模式可以提高代码的可扩展性,但过度不恰当的使用,也会增加代码的复杂度,影响代码的可读性。在开发初期,除非必须,我们一定不要过度设计,应用复杂的设计模式。而是当代码出现问题的时候,我们再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计。

对于重构,你需要掌握以下几个知识点:

  • 重构的目的(why)、对象(what)、时机(when)、方法(how)。
  • 保证重构不出错的技术手段:单元测试和代码的可测试性。
  • 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模、低层次)。

五者之间的联系

关于面向对象、设计原则、设计模式、编程规范和重构,这五者的关系,我们梳理下:

  • 面向对象编程因为其丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
  • 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如“开闭原则”是很多设计模式(策略、模板等)的指导原则。
  • 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提供代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。
  • 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续地小重构依赖的理论基础主要就是编程规范。
  • 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。

实际上,面向对象、设计原则、设计模式、编程规范、代码重构,这五者都是保持或提高代码质量的方法,本质上都是服务于编写高质量代码这一件事的。

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

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

相关文章

LNMP搭建discuz论坛

discuz论坛是一种网络论坛软件,也称bbs,它是一种用于在互联网上建立论坛社区的程序系统。只哟中功能强大的论坛软件,可以帮助用户建立一个专业、完善的论坛社区,并且可以实现多种功能,如搭建用户注册、登录、查看主题、…

vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据

文章目录 一、按需引入自定义组件:unplugin-vue-components1. 安装[unplugin-vue-components]2. 在vite中使用 二、自动导入依赖包:unplugin-auto-import1.安装2.vite.config.js配置3.使用效果 三、自动生成路由:vite-plugin-pages1、安装2、…

任务处理 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 在某个项目中有多个任务(用tasks数组表示)需要您进行处理&#xff0c;其中tasks[i][si,ei], 你可以在si < day < ei 中的任意一天处理该任务&#xff0c;请…

代码随想录day25--回溯的应用4

LeetCode491.非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;…

【目标跟踪】提供一种简单跟踪测距方法(c++)

文章目录 一、前言二、c代码2.1、Tracking2.2、KalmanTracking2.3、Hungarian2.4、TrackingInfo 三、调用示例四、结果 一、前言 在许多目标检测应用场景中&#xff0c;完完全全依赖目标检测对下游是很难做出有效判断&#xff0c;如漏检。检测后都会加入跟踪进行一些判断或者说…

中科星图——Landsat8_C2_ST数据集是经大气校正的地表温度数据

数据名称&#xff1a; Landsat8_C2_ST 数据来源&#xff1a; USGS 时空范围&#xff1a; 2020年1月-2023年3月 空间范围&#xff1a; 全国 数据简介&#xff1a; Landsat8_C2_ST数据集是经大气校正的地表温度数据&#xff0c;属于Collection2的二级数据产品&#xff0…

nginx 日志改为json格式

nginx 日志改为json格式 场景描述 正常使用nginx时&#xff0c;使用默认的日志输出格式&#xff0c;对于后续日志接入其他第三方日志收集、清洗环节&#xff0c;因分隔符问题可能不是很友好。 xxxx - - [19/Feb/2024:11:16:48 0800] "GET /time_feed HTTP/1.1" 20…

虚拟和现实的界限不存在了吗

Sora是美国人工智能公司OpenAI最新发布的“文生视频”大模型。与之前的模型相比&#xff0c;Sora能够一次性生成长达一分钟的高清视频&#xff0c;这是目前业内主流的数秒钟版本所无法比拟的。Sora的发布在市场上引起了极大的关注&#xff0c;并被认为是人工智能领域的一次重大…

Spring boot 实现监听 Redis key 失效事件

一. 开启Redis key过期提醒 方式一&#xff1a;修改配置文件 redis.conf # 默认 notify-keyspace-events "" notify-keyspace-events Ex方式二&#xff1a;命令行开启 CONFIG SET notify-keyspace-events Ex CONFIG GET notify-keyspace-events二. notify-keyspace-e…

【Java EE初阶十三】网络初识

1. 网络发展史 网络发展的几个主要时期&#xff1a; 单机时代->局域网时代->广域网时代->移动互联网时代 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同工作来完成 业务&#xff0c;就有了网络互…

行人重识别

&#xfeff;在人的感知系统所获得的信息中&#xff0c;视觉信息大约占到80%&#xff5e;85%。行人重识别&#xff08;person re-identification&#xff09;是近几年智能视频分析领域兴起的一项新技术&#xff0c;属于在复杂视频环境下的图像处理和分析范畴&#xff0c;是许多…

300分钟吃透分布式缓存-02讲:如何根据业务来选择缓存模式和组件?

缓存读写模式 如下图&#xff0c;业务系统读写缓存有 3 种模式&#xff1a; & Cache Aside&#xff08;旁路缓存&#xff09; & Read/Write Through&#xff08;读写穿透&#xff09; & Write Behind Caching&#xff08;异步缓存写入&#xff09; Cache Asid…

redis 值中文显示乱码

问题&#xff1a; 解决办法&#xff1a; exit退出 进入时添加 --raw参数

【软件设计师】程序猿需掌握的技能——数据流图

作为一个程序员&#xff0c;不仅要具备高水平的程序编码能力&#xff0c;还要是熟练掌握软件设计的方法和技术&#xff0c;具有一定的软件设计能力&#xff0c;一般包括软件分析设计图&#xff08;常见的有数据流图&#xff0c;程序流程图&#xff0c;系统流程图&#xff0c;E-…

面试官:能不能给 Promise 增加取消功能和进度通知功能... 我:???

扯皮 这段时间闲着没事就去翻翻红宝书&#xff0c;已经看到 Promise 篇了&#xff0c;今天又让我翻到两个陌生的知识点。 因为 Promise 业务场景太多了自我感觉掌握的也比较透彻&#xff0c;之前也跟着 Promise A 的规范手写过完整的 Promise&#xff0c;所以这部分内容基本上…

常用的图像大小进行操作

一&#xff1a;在图像读取时&#xff0c;常用的读取方式包括PIL和CV2。 1&#xff1a;用PIL读取 首先载入PIL&#xff0c;接着用Image打开图片。 from PIL import Image image Image.open("D:/PycharmProjects/python function/0005.png") print(type(image)) imag…

每日一练:LeeCode-501、二叉搜索树中的众数【二叉搜索树+pre辅助节点+DFS】

本文是力扣LeeCode-LeeCode-501、二叉搜索树中的众数【二叉搜索树pre辅助节点DFS】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;…

个性签名大全

只许一生浮世清欢愿我以孤独作为铠甲&#xff0c;自此不再受伤愿我是阳光&#xff0c;明媚而不忧伤我不敢太勇敢太执着太骄傲&#xff0c;我怕失去开始你是我的天使&#xff0c;最后你是我的唯一姐的霸气&#xff0c;无人能比&#xff0c;哥的傲气&#xff0c;无人能朋唯有万事…

Unity面试手册:初中级面试题

1.请简述ArrayList和List的主要区别&#xff1f; ArrayList存在不安全类型&#xff08;ArrayList会把所有插入其中的数据都当做Object来处理&#xff09;&#xff0c;装箱拆箱的操作&#xff08;费时&#xff09;&#xff0c;List是泛型类&#xff0c;功能跟ArrayList相似&…

ASUS华硕枪神8笔记本电脑G614JIR,G814JVR,G634JYR,G834JZR工厂模式出厂Windows11系统 带重置还原功能

适用ROG枪神8系列笔记本型号&#xff1a; G614JIR、G614JVR、G634JYR、G634JZR G814JIR、G814JVR、G834JYR、G834JZR 链接&#xff1a;https://pan.baidu.com/s/1tYZt6XFNC2d6YmwTbtFN7A?pwd3kp8 提取码&#xff1a;3kp8 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主…