当前位置: 首页 > news >正文

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

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

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

单一职责原则(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)

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

相关文章:

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

本文是阅读《设计模式之美》的总结和心得,跳过了书中对面试和工作用处不大或不多的知识点,总结总共分为三章,分别是面对对象编程范式、设计原则和设计模式。 设计模式是代码设计时的一些经验总结。相比于设计模式,设计原则更抽象。…...

Day16-蜗牛影城后端开发

蜗牛影城后端开发 一 多表关联查询 电影集合movie的type(类别)字段关联到电影类别movieType表的_id(主键) 二 蜗牛影城后端开发 1 数据的导入导出 2 用户模块 UserModel.js //导入mongoose,并解构出Schema(类)和model(对象) const {Schema,model} =...

axios / fetch 实现 stream 流式请求

axios 是一个支持node端和浏览器端的易用、简洁且高效的http库。本文主要介绍 axios 如何实现 stream 流式请求,注意这里需要区分 node 环境和浏览器环境。 一、node端 代码演示: const axios require(axios);axios({method: get,url: http://tiven.c…...

Pytorch学习:torchvison.transforms常用包(ToTensor、Resize、Compose和RandomCrop)

torchvision.transforms常用包 1. torchvision.transforms.ToTensor2. torchvision.transforms.Resize3. torchvision.transforms.Compose4. torchvision.transforms.Normalize5. torchvision.transforms.RandomCrop 1. torchvision.transforms.ToTensor 将PIL Image或ndarray…...

算法通关村十二关 | 字符串转换

1. 转换小写字母 LeetCode709:给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 每个字母都是有确定的ASCII的,可以根据码表操作子字符串,常见的ASCII范围是: a-z: 97-122, …...

前端进阶Html+css09----BFC模型

1.什么是BFC模型 全称是:Block formatting context(块级格式化上下文),是一个独立的布局环境,不受外界的影响。 2.FC,BFC,IFC 元素在标准流里都属于一个FC(Formatting Context)。 块级元素的布…...

重排链表(C语言)

题目: 示例: 思路: 这题我们将使用栈解决这个问题,利用栈先进后出的特点,从链表的中间位置进行入栈,寻找链表的中间位置参考:删除链表的中间节点,之后从头开始进行连接。 本题使用…...

el-table动态合并单元格

el-table使用这个方法合并单元格&#xff0c;:span-method“hbcell” <el-table size"small" :data"table.data" border empty-text"暂无数据" :cell-style"cellStyle" :header-cell-style"tableHeaderColor":span-meth…...

html元素

文章目录 html基本结构属性语义化为什么要语义化 示例head中属性样式一些概念块级元素与行级元素空白折叠 html编程没有css的html显示逻辑 html基本结构 html基本单元就是元素&#xff0c;每个元素有标记和属性&#xff0c;如&#xff1a; <a href"...">www&…...

push github

一、生成密钥 打开git bash执行下面指令&#xff0c;Enter下一步Enter下一步..生成ssh key 密钥&#xff1b; ssh-keygen -t rsa 二、 复制公共密钥到git hub 登录github&#xff0c;在选项setting >> SSH and GPG key >> add new ssh添加刚才的公钥地址即可 验证…...

iFluor 594 Styramide是一种荧光染料,常用于生物分子标记和成像

试剂 | 基础知识概述&#xff08;部分&#xff09;: 中文名称&#xff1a;Alexa Fluor 594酪Styramide 分子量&#xff1a;1341.71 胺的优异替代品 100 Slides 英文名称&#xff1a;iFluor 594 Ex (nm)&#xff1a;588 Em (nm)&#xff1a;604 规格标准&#xff1a;1g&am…...

动态规划入门之01背包变形嗑药

P1802 5 倍经验日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 嗑药固然可耻&#xff0c;但是能让你快速变强 --鲁迅 手动滑稽&#xff0c;话归正题 动态规划之背包入门01背包模板_爱莉我老婆的博客-CSDN博客 这是01背包的模板&#xff0c;没看的可以去看看。 我们把…...

数据结构——栈和队列OJ题

栈和队列小提升&#xff01; 前言一、用队列实现栈队列接口实现&#xff08;1&#xff09;栈的接口定义&#xff08;2&#xff09;栈的初始化&#xff08;3&#xff09;入栈函数的定义&#xff08;4&#xff09;出栈函数的定义&#xff08;5&#xff09;查找栈顶元素&#xff0…...

同态排序算法

参考文献&#xff1a; [Batcher68] Batcher K E. Sorting networks and their applications[C]//Proceedings of the April 30–May 2, 1968, spring joint computer conference. 1968: 307-314. [SV11] Smart, N.P., Vercauteren, F.: Fully homomorphic SIMD operations. IA…...

“深入探索JVM内部机制:解析Java虚拟机的工作原理“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解析Java虚拟机的工作原理 摘要&#xff1a;本文将介绍Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括类加载、内存管理、垃圾回收和字节码执行等方面。通过深入理解JVM的内部机制&#xff0c;开发人员可以…...

为应用程序接入阿里云CDN优化网站访问速度

文章目录 1.KodCloud云盘系统接入CDN之前的效果2.配置KodCloud云盘接入CDN加速器2.1.添加CDN域名2.2.配置域名信息2.3.CDN推荐配置设置2.4.CDN加速器配置完成 3.配置云解析DNS增加CDN域名的解析4.为CDN加速器配置HTTPS5.验证网站是否接入CDN6.访问应用程序观察请求速度7.观察CD…...

索引设计规范

索引是帮助数据库高效获取数据的数据结构。索引是加速查询的常用技术手段。在设计索引时&#xff0c;要遵循索引设计规范&#xff0c;避免不必要的踩坑。 【推荐】索引存储结构推荐BTREE InnoDB和MyISAM存储引擎表&#xff0c;索引类型必须为BTRER&#xff0c;MEMORY表可以根…...

Appium 2安装与使用java对Android进行自动化测试

文章目录 1、Appium 2.1安装1.1、系统要求1.2、安装Appium2.1服务1.3、安装UiAutomator2驱动1.4、安装Android SDK platform tools1.5、下载OpenJDK 2、Android自动代码例子2.1、安装Android自动化测试元素定位工具Appium Inspector2.2、编写android app自动化测试代码和使用ex…...

小程序运营方式有哪些?如何构建小程序运营框架?

​如今&#xff0c;每个企业基本都做过至少一个小程序&#xff0c;但由于小程序本身不具备流量、也很少有自然流量&#xff0c;因此并不是每个企业都懂如何运营小程序。想了解小程序运营方式方法有哪些&#xff1f; 在正式运营小程序前&#xff0c;了解小程序的功能与企业实际经…...

【golang】for语句和switch语句

使用携带range子句的for语句时需要注意哪些细节&#xff1f; numbers1 : []int{1, 2, 3, 4, 5, 6} for i : range numbers1 {if i 3 {numbers1[i] | i} } fmt.Println(numbers1)这段代码执行后会打印出什么内容&#xff1f; 答案&#xff1a;[1 2 3 7 5 6] 当for语句被执行…...

Neeshck-Z-lmage_LYX_v2实战教程:异常友好提示机制与错误定位指南

Neeshck-Z-lmage_LYX_v2实战教程&#xff1a;异常友好提示机制与错误定位指南 1. 引言&#xff1a;当绘画工具变得“会说话” 想象一下&#xff0c;你兴致勃勃地打开一个AI绘画工具&#xff0c;输入了一段精心构思的描述&#xff0c;点击生成&#xff0c;然后……页面卡住了。…...

实战解析:基于防火墙与三层交换机的企业多业务VLAN安全组网

1. 企业多业务VLAN组网的核心价值 对于200-500人规模的中型企业来说&#xff0c;网络架构就像城市的交通系统。当办公区、研发中心、视频监控、服务器集群等业务单元都挤在同一个"马路"上时&#xff0c;网络拥堵和安全风险就会成为日常噩梦。我去年就遇到过一家制造…...

LabVIEW与TCP远程实验监测

后疫情时代线上教学的普及&#xff0c;让理工类实验课的远程开展成为行业研究重点。传统线上教学工具仅适用于理论知识传播&#xff0c;针对需要动手实操的实验课程&#xff0c;存在实践操作不便、课堂监管弱化、成果验收困难等问题。国内现有远程实验系统多以虚拟仿真为主&…...

Qwen3-VL多模态检索系统:跨模态搜索部署实战案例

Qwen3-VL多模态检索系统&#xff1a;跨模态搜索部署实战案例 用图文对话技术构建智能搜索系统&#xff0c;让AI看懂图片内容并精准回答你的问题 1. 项目介绍与环境准备 Qwen3-VL是阿里最新开源的视觉-语言模型&#xff0c;可以说是目前最强大的多模态AI系统之一。这个模型不仅…...

Windows 10下Cesium Terrain Builder编译踩坑实录(VS2015+GDAL环境配置)

Windows 10下Cesium Terrain Builder编译实战指南&#xff08;VS2015GDAL环境配置&#xff09; 在三维GIS开发领域&#xff0c;Cesium Terrain Builder&#xff08;CTB&#xff09;作为生成量化网格地形瓦片的核心工具&#xff0c;其编译过程却常让开发者望而生畏。特别是在Win…...

AD7606模数转换器的FPGA驱动设计与实现(串行/并行双模式解析)

1. AD7606模数转换器核心特性解析 AD7606这颗16位模数转换芯片在工业现场堪称"数据捕手"&#xff0c;我经手过的电力监控、振动分析项目中都能看到它的身影。与普通ADC不同&#xff0c;它最吸引工程师的特性是双模数据输出——就像高速公路的ETC和人工通道可以并行运…...

Z-Image-Turbo-rinaiqiao-huiyewunv 复杂场景生成挑战赛获奖作品赏析

Z-Image-Turbo-rinaiqiao-huiyewunv 复杂场景生成挑战赛获奖作品赏析 最近&#xff0c;我花了不少时间研究社区里的一场AI图像生成挑战赛&#xff0c;主题是“复杂场景生成”。参赛者们用的是一个叫Z-Image-Turbo-rinaiqiao-huiyewunv的模型&#xff0c;名字有点长&#xff0c…...

VMware硬件兼容性自查避坑指南:收购后这些查询细节变了

VMware硬件兼容性自查避坑指南&#xff1a;收购后这些查询细节变了 当企业虚拟化平台的稳定性悬于一线&#xff0c;硬件兼容性往往成为最容易被忽视的致命环节。博通收购VMware后&#xff0c;那些曾经熟悉的兼容性查询路径和规则正在发生微妙却关键的变化——就像手术器械消毒流…...

Llama-3.2V-11B-cot多轮对话效果展示:复杂技术问题拆解与解答

Llama-3.2V-11B-cot多轮对话效果展示&#xff1a;复杂技术问题拆解与解答 最近在测试各种大模型时&#xff0c;我特意找了一个比较“刁钻”的场景&#xff1a;让模型来解答一个复杂的系统设计问题。这类问题通常不是一两句话能说清的&#xff0c;它需要模型有很强的逻辑推理能…...

NanoPC-T6开发板实战:手把手教你为RK3588编译并烧录Recovery镜像

NanoPC-T6开发板实战&#xff1a;从零构建RK3588 Recovery镜像的完整指南 当你的NanoPC-T6开发板因系统崩溃变成"砖头"时&#xff0c;一个可靠的Recovery镜像就是救命稻草。本文将带你深入Rockchip RK3588平台的恢复系统构建全流程&#xff0c;从工具链准备到最终烧录…...