重修设计模式-设计原则

news2024/11/13 8:52:08

重修设计模式-设计原则

设计原则

设计原则是软件编码时所遵循的规则,旨在帮助开发者创建出既满足功能需求又易于维护、可扩展且美观的设计,理解设计原则可以提升代码质量、减少错误以及促进团队协作,但对设计原则的理解要灵活,不要拿原则当真理,生搬硬套会适得其反。

SOLID原则:

  • S单一职责原则(Single Responsibility Principle, SRP)

    A class or module should have a single responsibility.

    一个类或者模块只负责完成一个职责。

    这有助于降低系统的复杂性,提高代码的可读性和可维护性。当需求变更时,只需要修改负责该职责的类或模块即可。

  • O开闭原则(Open-Closed Principle, OCP)

    software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification.

    软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭。

    意味着软件应该通过添加新的代码来扩展,而不是通过修改现有的代码来实现,有助于保持系统的稳定性和可维护性。

  • L里式替换原则(Liskov Substitution Principle, LSP)

    Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it.

    子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。

    里式替换和多态有点类似,但它们关注的角度不一样:多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法,是一种代码实现的思路。而里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。

  • I接口隔离原则(Interface Segregation Principle, ISP)

    Clients should not be forced to depend upon interfaces that they do not use.

    客户端不应该被强迫依赖它不需要的接口。其中的“客户端”,可以理解为接口的调用者或者使用者。

    一个类对另一个类的依赖应该建立在最小的接口上。有助于减少接口的污染和不必要的依赖,提高系统的灵活性和可维护性。

  • D依赖倒置原则(Dependency Inversion Principle, DIP)

    High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.

    高层模块不要依赖低层模块,两者都应该依赖其抽象。

    抽象不应该依赖细节。

    细节应该依赖抽象。

    有助于减少模块间的耦合度,提高系统的灵活性和可维护性。

    在 Java 中的表现是:

    • 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;

    • 接口或抽象类不依赖于实现类;

    • 实现类依赖接口或抽象类。

    举例,不符合依赖导致原则的类依赖关系:
    在这里插入图片描述
    符合后:

迪米特法则(Law of Demeter, LoD)

Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.

每个模块只应该了解那些与它关系密切的模块的有限知识。或者说,每个模块只和自己的朋友“说话”,不和陌生人“说话”。

迪米特法则也叫最小知识原则:The Least Knowledge Principle。

不该有直接依赖关系的类之间,不要有依赖。有依赖关系的类之间,尽量只依赖必要的接口。迪米特法则希望减少类之间的耦合,让类越独立越好,缩小功能改动导致的代码改动范围,有助于代码“高内聚,低耦合”。

  • 高内聚:相近的功能应该放到同一个类中。

  • 低耦合:类与类之间的依赖关系简单清晰,即使两个类有依赖关系,一个类的代码改动也不会或者很少导致依赖类的代码改动

KISS原则

Keep It Simple and Stupid.

尽量保持简单。

强调设计应该保持简单,避免过度复杂。简单的设计更容易理解、维护和扩展。

YAGNI 原则

You Ain’t Gonna Need It.

你不会需要它。

在软件开发中,不要去设计当前用不到的功能;不要去编写当前用不到的代码。实际上,这条原则的核心思想就是:不要做过度设计。

DRY原则

Don’t Repeat Yourself.

不要重复你自己。

重复包括以下几种情况:

  1. 代码实现重复:两个方法中大部分代码相同,只有小部分差异。

    看是否能抽出通用方法,但也要注意“单一职责原则”和“接口隔离原则”。

  2. 功能语义重复:两个方法的实现不同,但方法名语义相同。

  3. 执行重复:代码执行时,某一代码块执行冗余。

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

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

相关文章

前端vue-父传子

父传子的话是在components中创建一个子组件MyTest.vue&#xff0c;并且在父组件中先导入(import MyTest from "./components/MyTest")&#xff0c;再注册&#xff08;在expo二default中写上 compnents:{MyTest}&#xff09;&#xff0c;再使用标签&#xff08;<My…

深度学习后门攻击分析与实现(一)

在计算机安全中&#xff0c;后门攻击是一种恶意软件攻击方式,攻击者通过在系统、应用程序或设备中植入未经授权的访问点,从而绕过正常的身份验证机制,获得对系统的隐蔽访问权限。这种"后门"允许攻击者在不被检测的情况下进入系统,执行各种恶意活动。 后门可以分为几种…

开源项目 GAN 漫画风格化 UGATIT

开源项目&#xff1a;DataBall / UGATIT GitCode * 数据集 * [该项目制作的训练集的数据集下载地址(百度网盘 Password: gxl1 )](https://pan.baidu.com/s/1683TRcv3r3o7jSitq3VyYA) * 预训练模型 * [预训练模型下载地址(百度网盘 Password: khbg )](https://pan.ba…

安卓实现导入Excel文件

使用简化版的jar包 api files(libs/poi-3.12-android-a.jar) api files(libs/poi-ooxml-schemas-3.12-a.jar) 导入遇到了两个兼容问题 1.build.gradle文件里面 android { 要添加 packagingOptions {exclude META-INF/INDEX.LIST } 2.加载大文件要在清单文件里面加androi…

2023年全国研究生数学建模竞赛华为杯B题DFT类矩阵的整数分解逼近求解全过程文档及程序

2023年全国研究生数学建模竞赛华为杯 B题 DFT类矩阵的整数分解逼近 原题再现&#xff1a; 一、问题背景   离散傅里叶变换&#xff08;Discrete Fourier Transform&#xff0c;DFT&#xff09;作为一种基本工具广泛应用于工程、科学以及数学领域。例如&#xff0c;通信信号…

YOLO交通目标识别数据集(红绿灯-汽车-自行车-卡车等)

YOLO交通目标识别 数据集 模型 ui界面 ✓图片数量15000&#xff0c;xml和txt标签都有&#xff1b; ✓class&#xff1a;biker&#xff0c;car&#xff0c;pedestrian&#xff0c;trafficLight&#xff0c;trafficLight-Green&#xff0c;trafficLight-GreenLeft&#xff0c; t…

java se 快速入门

文章目录 java se 快速入门Java 简介Java的优点jdk 和 jre安装jdk配置环境变量Java 语法快速入门程序入口文件名类规范 基本语法注释变量和常量输入输出条件语句循环语句 基本数据类型Java字符串常用方法字符串拼接java字节数组和字符串相互转化java字符数组和字符串相互转换ja…

美畅物联丨技术前沿探索:H.265编码与畅联云平台JS播放器的融合应用

一、H.265 编码&#xff1a;视频压缩技术的重大变革 H.265&#xff0c;即被熟知为高效视频编码&#xff08;HEVC&#xff0c;High Efficiency Video Coding&#xff09;&#xff0c;由国际电信联盟电信标准化部门视频编码专家组&#xff08;ITU-T VCEG&#xff09;与国际标准化…

去噪扩散隐式模型

dataset_name "datasets/oxford-102-flowers/" dataset_repetitions 2 # 数据集重复 num_epochs 25 image_size 64 # 模型训练和生成图像的大小 # KID 内核初始距离 kid_image_size 75 # 从噪声中逐步“去噪”或“扩散”到最终图像所需的步骤数。 kid_diffusi…

计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI

首先安装需要的python库&#xff0c; 安装完之后利用navicat导入数据库文件bili100.sql到mysql中&#xff0c; 再在pycharm编译器中连接mysql数据库&#xff0c;并在设置文件中将密码修改成你的数据库密码。最后运行app.py&#xff0c;打开链接&#xff0c;即可运行。 B站爬虫数…

VS code 创建与运行 task.json 文件

VS code 创建与运行 task.json 文件 引言正文创建 .json 文件第一步第二步第三步 运行 .json 文件 引言 之前在 VS code EXPLORER 中不显示指定文件及文件夹设置&#xff08;如.pyc, pycache, .vscode 文件&#xff09; 一文中我们介绍了 settings.json 文件&#xff0c;这里我…

商业终端架构技术-未来之窗行业应用跨平台架构

未来之窗行业应用跨平台架构 以下是对未来之窗行业应用跨平台架构中客户端的稳定优势和网页跨平台性质的扩展列举&#xff1a; 一、客户端的稳定优势&#xff1a; 1. 离线可用性 - 即使在没有网络连接的…

Redis的Key的过期策略是怎样实现的?

在学习Redis时&#xff0c;我们知道可以设置Key的过期时间&#xff0c;我们还知道&#xff0c;Redis一大特点–速度快。 那么当Redis中的数据量起来时&#xff0c;如果直接遍历所有的Key&#xff0c;那么对于Key过期时间的校验应该很费时间&#xff0c;那么Redis究竟是怎样做的…

前端vue-插值表达式和v-html的区别

创建vue实例的时候&#xff0c;可以有两种形式。 1.let appnew Vue({}) 2 const appnew Vue({}) 3 el是挂载点&#xff0c;是上面div的id值 4 data中的值可以展示在上面div中 5 v-html标签里面如果有内容&#xff0c;则我们的新内容会把标签里面的内容覆盖掉

2024 vue3入门教程:02 我的第一个vue页面

1.打开src下的App.vue&#xff0c;删除所有的默认代码 2.更换为自己写的代码&#xff0c; 变量msg&#xff1a;可以自定义为其他&#xff08;建议不要使用vue的关键字&#xff09; 我的的第一个vue&#xff1a;可以更换为其他自定义文字 3.运行命令两步走 下载依赖 cnpm i…

Java项目实战II基于Java+Spring Boot+MySQL的酒店客房管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在旅游与酒…

AI助力智慧农田作物病虫害监测,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建花田作物种植场景下棉花作物常见病虫害检测识别系统

智慧农业是一个很大的应用市场&#xff0c;将当下如火如荼的AI模型技术与现实的农业生产场景相结合能够有效提升生产效率&#xff0c;农作物在整个种植周期中有很多工作需要进行&#xff0c;如&#xff1a;浇水、施肥、除草除虫等等&#xff0c;传统的农业作物种植生产管理周期…

2024java高频面试-数据库相关

前言&#xff1a;趁着年轻&#xff0c;博主准备在拼一把&#xff0c;看能不能挑个可以干到退休的牛马工位&#xff01;&#xff01;&#xff01; 废话不多说&#xff0c;面试真题赶紧一股脑倒进我的脑袋瓜子里吧&#xff01;&#xff01;&#xff01; 事务四大特性&#xff1f…

268页PPT大型集团智慧工厂信息化顶层架构设计(2024版)

智能制造装备是高端制造业的关键&#xff0c;通过整合智能传感、控制、AI等技术&#xff0c;具备了信息感知、分析规划等智能化功能&#xff0c;能显著提升加工质量、效率和降低成本。该装备是先进制造、信息、智能技术的深度融合。其原理主要包括物联网集成、大数据分析与人工…

计算机毕业设计hadoop+spark知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习

《HadoopSpark知网文献论文推荐系统》开题报告 一、研究背景及意义 随着互联网技术的迅猛发展和大数据时代的到来&#xff0c;学术文献的数量呈爆炸式增长&#xff0c;用户面临着严重的信息过载问题。如何高效地从海量文献中筛选出用户感兴趣的论文&#xff0c;成为当前学术界…