【设计模式】详细聊聊软件设计的七大原则

软件设计原则

在这里插入图片描述

软件设计原则是指在进行软件系统设计时所遵循的一系列指导原则,它们旨在帮助软件工程师设计出高质量易维护可扩展可重用的软件系统。这些原则是经过实践验证的,能够在软件开发的各个阶段提供指导和支持。七大软件设计原则,也被称为设计模式原则,是《设计模式:可复用面向对象软件的基础》一书中提出的。下面详细介绍这七大原则:

  1. 单一责任原则 (Single Responsibility Principle, SRP)
    记忆关键句:一个类只做好一件事!
    这个原则指出一个类或模块应该只有一个引起变化的原因。换句话说,一个类只应该有一个职责。如果一个类具有多个职责,那么当需求发生变化时,需要修改这个类的可能性就会增加,导致系统的不稳定性。单一责任原则有助于使代码更容易理解、维护和扩展。

    优点:

    1. 提高可维护性:当一个类只负责一个功能时,实现通常更简单,更直接,这使得理解和维护变的更加容易。
    2. 减少代码修改的影响:更改影响较小的部分,因此减少了对系统其他部分的潜在破坏。
  2. 开闭原则 (Open/Closed Principle, OCP)
    记忆关键句:对拓展开放,对修改关闭
    这个原则指出软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。简单来说,当需要改变一个软件系统的行为时,不应该修改已有的代码,而是应该通过扩展现有代码来实现新的功能。这可以通过使用抽象化、多态等技术来实现,从而降低修改现有代码可能引入的风险。
    在这里插入图片描述

    优点:

    1. 促进可扩展性:可以在不修改现有代码的情况下扩展功能,这意味着新的功能可以添加,而不会影响旧的功能。
    2. 降低风险:由于不需要修改现有代码,因此引入新错误的风险较低。
  3. 里氏替换原则 (Liskov Substitution Principle, LSP)
    记忆关键句:子类必须能够替换其基类
    里氏替换原则是关于继承多态的原则。它指出子类型必须能够替换基类型,而不破坏程序的正确性。换句话说,使用基类的地方应该能够透明地使用其子类,而不需要修改代码。如果一个类违反了里氏替换原则,那么在使用多态时可能会导致意外的行为。
    在这里插入图片描述

优点:

  1. 提高代码的可互换性:能够用派生类的实例替换基类的实例,使得代码更加模块化,提高了其灵活性。
  2. 增加代码的可重用性: 遵循LSP的类和组件更容易被重用于不同的上下文。
  1. 依赖倒置原则 (Dependency Inversion Principle, DIP)
    记忆关键句:程序要依赖于抽象接口而不是具体的实现
    依赖倒置原则强调了高层模块不应该依赖于低层模块,二者都应该依赖于抽象。具体来说,抽象不应该依赖于细节,细节应该依赖于抽象。这个原则通常通过依赖注入、依赖注入容器等技术来实现,从而实现模块之间的解耦合。
    在这里插入图片描述

优点:

  1. 提高代码的可测试性:通过依赖于抽象而不是具体实现,可以轻松的对代码进行单元测试。
  2. 减少系统的耦合:系统的高层模块不依赖于底层模块的具体实现,从而使得系统更加灵活和可维护。
  1. 接口隔离原则 (Interface Segregation Principle, ISP)
    记忆关键句:使用小的专门的接口而不要使用大的总接口
    接口隔离原则指出一个类不应该依赖于它不需要的接口。如果一个接口在一个类中的某个场景下没有用到,那么这个接口就不应该强加给这个类。相反,应该将接口分解为更小的、更具体的接口,从而使得客户端只需知道与其相关的方法即可,避免了对不必要方法的依赖。
    在这里插入图片描述

    优点:

    1. 减少系统的耦合:通过使用专门的接口而不是一个大而全的接口,系统中的不同部分之间的依赖性减少了。
    2. 提升灵活性和稳定性:更改一个小的接口比更改一个大的接口风险更低,更容易管理。
  2. 迪米特法则 (Law of Demeter, LoD)
    记忆关键句:只和你的直接朋友交谈,不和“陌生人”讲话
    迪米特法则也被称为最少知识原则。它指出一个对象应该对其他对象有尽可能少的了解,不要和陌生人说话。换句话说,一个对象应该只和其直接的朋友进行交流,而不是和朋友的朋友交流。这可以降低对象之间的耦合度,使得系统更加灵活、易维护。
    **记忆关键句:**==使用小的专门的接口而不要使用大的总接口==

  3. 合成复用原则 (Composite Reuse Principle, CRP)
    记忆关键句:优先使用组合或者聚合等关联关系实现,其次才考虑继承关系实现
    合成复用原则指出应该优先使用对象组合,而不是继承来实现代码的复用。通过将对象组合起来形成更大的对象,可以使得系统更加灵活、易于扩展。相比之下,继承关系的修改会牵一发而动全身,增加了系统的复杂度。
    在这里插入图片描述

这七大原则提供了软件设计的指导原则,有助于设计出易于理解、扩展和维护的高质量软件系统。在实际开发中,软件工程师应该根据具体情况灵活运用这些原则,以求达到最佳的设计效果。

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

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

相关文章

如何利用Idea创建一个Servlet项目(新手向)

💕"Echo"💕 作者:Mylvzi 文章主要内容:如何利用Idea创建一个Servlet项目(新手向) Servlet是tomcat的api,利用Servlet进行webapp开发很方便,本文将介绍如何通过Idea创建一个Servlet项目(一共分为七步,这可能是我们写过的…

C#使用MiniExcel导入导出数据到Excel/CSV文件

MiniExcel简介 简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB&#xff…

TCP如何保证传输可靠性?

文章目录 前言1、连接管理1.1、三次握手1.2、四次挥手 2、校验和3、序列号 确认应答4、重传机制4.1、超时重传4.2、快速重传 5、流量控制5.1、累计应答5.2、滑动窗口 6、拥塞控制6.1、慢启动6.2、拥塞避免6.3、拥塞发生6.4、快速恢复 前言 文章参考: 《网络是怎样…

「年后复工主题」app用户运营拉新,接入引爆用户增长的活动

随着春节假期的结束,人们重返工作岗位,各行各业也迎来了年后复工的高峰期。在这个时间节点,APP运营团队面临着一个绝佳的机遇——利用节日余温和复工活力,通过策划一系列相关主题的趣味活动来吸引新用户,实现用户增长的…

文件上传漏洞--Upload-labs--Pass06--空格绕过

一、什么是空格绕过 在Windows系统中,Windows特性会自动删除文件后缀名后的空格,这使我们看 .php 和 .php 二者没有任何区别,实际上二者是有区别的。若网页源码没有使用 trim()函数 来进行去除空格的操作,就会使网页存在 空格绕…

什么样的服务器是高性能服务器?

首先,高性能服务器应具备高处理能力。随着业务的不断扩展和数据量的爆炸性增长,高性能服务器需要具备强大的计算能力,能够快速处理各种复杂的业务和数据。这要求高性能服务器采用先进的处理器技术,如多核处理器、GPU加速等&#x…

IDEA中创建web项目(配置tomcat,tomcat启动报程序包javax.servlet.http不存在,tomcat控制台乱码问题)

文章目录 一、新建动态web项目1、新建项目2、选择创建动态web项目3、项目命名4、编辑index.jsp 二、配置Tomcat1、新增tomcat服务器配置2、选择服务器类型3、配置服务器参数4、部署项目5、完成配置6、启动运行7、访问web项目 三、tomcat启动报程序包javax.servlet.http不存在四…

个人简历补充

个人简历补充 1.对工作的认识2.八股文和知识面3.框架/架构角度深扒3.1 前端3.1.1 mPaaS(移动领域)3.1.2 普通前端项目框架3.1.3 微前端 3.2 后端 持续更新 1.对工作的认识 2.八股文和知识面 前端(基础知识 / 开发能力 / 总结输出能力&#xf…

vue-productionSourceMap作用

当其设置为false时(productionSourceMap: false) 当其设置为true时(productionSourceMap: true) 注:1.当设置为true时,打包后每个文件都有一个.map文件,其目的是为了精确定位代码错误 2.当设置为false时,可减少项目打包大小 3.正式环境禁止使用true,因为其可通过反编译.map文件…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-UART

目录 一、UART 概述二、UART 模块相关API三、UART 接口调用实例四、UART HDF驱动开发4.1、开发步骤(待续...) 坚持就有收获 一、UART 概述 UART 是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,是通用串行数据总…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华,女,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组。 研究方向:机器视觉与人工智能。 电子邮件:1078914066qq.com 一.文心AI作画API介绍 1. 文心AI作画 文…

阿基米德签证小程序管理系统功能清单

阿基米德签证小程序管理系统,底层架构采用当前国内最流行的php框架thinkphp8.0、采用广泛使用的MYSQL数据库,管理后台前后台分离,同时使用了当今最流行的基于VUE3和elementPlus前端框架,小程序采用了支持多端合一的UNI-APP开发&am…

Kernel 地图

前言 在 Linux Kernel 中,根据 Makefile 和 Kconfig,可以快速地了解一个小的内核子系统。所以我将这两个文件称之为 Kernel 地图。 Kernel 地图 基本上,Linux 内核中,每一个目录下面都有一个 Makefile 和一个 Kconfig 文件。这…

Day11-Linux系统iNode及链接知识及企业按哪里精讲

Day11-Linux系统iNode及链接知识及企业按哪里精讲 1. 文件核心 属性知识1.1 什么是索引节点(inode)。1.2 索引节点作用1.3 inode是怎么产生的?1.4 inode的特点?1.5 Linux系统读取文件的原理1.6 企业生产案例:No space …

行人重识别综述

Deep Learning for Person Re-identification: A Survey and Outlook 论文地址https://arxiv.org/pdf/2001.04193 1. 摘要 we categorize it into the closed-world and open-world settings. closed-world:学术环境下 open-world :实际应用场景下 2…

儿时游戏“红色警戒”之“AI警戒”

一、红色警戒里“警戒”命令背后的算法原理是什么 在《红色警戒》系列即时战略游戏中,“警戒”命令背后的算法原理相对简单但又实用,其核心目标是让单位能够自动检测并反击一定范围内的敌方单位。虽然具体的实现细节未公开,但可以推测其基本…

Slack 给平台加入了 AI 驱动的搜索和总结功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

有什么办法解决SQL注入问题

随着互联网的普及和数字化进程的加速,Web攻击已经成为网络安全领域的一大威胁。Web攻击不仅可能导致个人隐私泄露、财产损失,还可能对企业和国家的安全造成严重影响。下面德迅云安全就分享一种常见的web攻击方式-SQL注入,了解下什么是SQL注入…

123.买卖股票的最佳时机II

123.买卖股票的最佳时机II 原题链接:完成情况:参考代码:_122买卖股票的最佳时机II_可以多次买入卖出01_122买卖股票的最佳时机II_可以多次买入卖出02_122买卖股票的最佳时机II_常规dp_122买卖股票的最佳时机II_一维dp_122买卖股票的最佳时机…

leetcode(动态规划)53.最大子数组和(C++详细解释)DAY12

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 提示 2.解答思…