软件架构设计的七大原则

news2024/11/15 17:20:49

学习设计原则是学习设计模式的基础。千万不能形成强迫症。当碰到业务复杂的场景时,需要随机应变。

在实际开发过程中,并不是一定要求所有代码都遵循设计原则,而是要在适当的场景遵循设计原则,就可以帮助开发者设计出更加优雅的代码结构。

七大原则一句话总结:
在这里插入图片描述

一、开闭原则

1、定义

开闭原则(Open-Closed Principle, OCP),是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

所谓开闭,也正是对扩展和修改两个行为的一个原则,开闭原则是面向对象设计中最基础的设计原则。

实现开闭原则的核心思想就是面向抽象编程。

2、作用

调用抽象构建框架,用实现扩展细节,可以提高代码的可复用性和软件系统的可维护性。

二、依赖倒置原则

1、定义

依赖倒置原则(Dependence Inversion Principle,DIP),是指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。

抽象不应该依赖细节,细节应该依赖抽象。

2、作用

通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并降低修改程序所造成的风险。

注意:以抽象为基准比以细节为基准搭建起来的架构要稳定得多。

三、单一职责原则

1、定义

单一职责(Simple Responsibility Pinciple,SRP),是指不要存在一个以上导致类变更的原因。

比如:一个 Class负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能会导致另一个职责的功能发生故障。于是可以给两个职责分别用两个 Class来实现,进行解耦,即使以后需求变更维护也互不影响。

单一职责原则就是一个 Class/Interface/Method只负责一项职责。

在实际开发中,尽可能地让接口和方法保持单一职责,对项目后期的维护是有很大帮助的。

2、作用

单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。

具体来说,其作用如下:

  • 降低类的复杂度。
  • 提高类的可读性。
  • 提高系统的可维护性。
  • 变更引起的风险降低。

四、接口隔离原则

1、定义

接口隔离原则(Interface Segregation Principle, ISP),是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。

这个原则指导我们在设计接口时,应当注意一下几点:

  • 一个类对一类的依赖应该建立在最小的接口之上
  • 建立单一接口,不要建立庞大臃肿的接口
  • 尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)

2、作用

接口隔离原则符合“高内聚,低耦合”的设计思想,使得类具有很好的可读性、可扩展性和可维护性。

五、迪米特法则

1、定义

迪米特原则(Law of Demeter LoD)又称作最少知道原则(Least Knowledge Principle,LKP),是指一个对象应该对其他对象保持最少的了解,尽量降低类与类之间的耦合。

迪米特原则主要强调只和朋友交流,不和陌生人说话。

  • 朋友的定义:
    出现在成员变量、方法的输入和输出参数中的类都可以称之为成员朋友类
  • 陌生人的定义:
    出现在方法体内部的类不属于朋友类

2、作用

  • 提高模块的相对独立性,降低类之间的耦合度。
  • 亲合度降低,从而提高了类的可复用率和系统的扩展性。

六、里氏替换原则

1、定义

里氏替换原则(Liskov Substitution Principle,LSP),是指一个软件实体如果适用于一个父类,则一定适用于其子类,所有引用父类的地方必须能透明地使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。

也可以理解为子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除了添加新的方法完成新增功能外,尽量不要重写父类的方法。

里氏替换原则只存于父类与子类之间,约束继承泛滥。

2、作用

  • 里氏替换原则是实现开闭原则的重要方式之一。
  • 它克服了继承中重写父类造成的可复用性变差的缺点。
  • 它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低代码出错的可能性。
  • 加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更时引入的风险。

七、合成复用原则

1、定义

合成复用原则(Composite/Aggregate Reuse Principle,CARP),是指尽量使用对象组合(has-a)或聚合(contanis-a)的方式实现代码复用,而不是继承关系达到代码复用的目的。

继承又称为白箱复用,相当于把所有的实现细节暴露给子类。

组合/聚合又称为黑箱复用,对类以外的对象是无法获取到实现细节的。

2、作用

  • 维持类的封装性
    因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
  • 新旧类之间的耦合度低
    这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
  • 复用的灵活性高
    这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

参考文章:

  • 软件设计的七大原则:https://www.jianshu.com/p/613d182ffceb

– 求知若饥,虚心若愚。

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

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

相关文章

glibc内存管理那些事儿

Linux内存空间简介 32位Linux平台下进程虚拟地址空间分布如下图: 进程虚拟地址空间分布 图中,0xC0000000开始的最高1G空间是内核地址空间,剩下3G空间是用户态空间。用户态空间从上到下依次为stack栈(向下增长)、mmap(匿名文件映射区)、Heap堆(向上增长…

网络编程之IO多路复用

目录 一. 同步与阻塞 1.1 同步阻塞 1.2 同步非阻塞 1.3 异步阻塞 1.4 异步非阻塞 1.5 I/O多路 二.多路复用的技术 2.1 UNIX I/O Models 2.1.1 blocking I/O 2.1.2 nonblocking I/O 2.1.3 I/O Multiplexing Model 2.1.4 SIGIO 2.1.5 asynchronous I/O 2.2 IO多路复…

【拓扑排序】课程表问题

一、拓扑排序问题描述 给定:一系列任务 (A,B,C …) 任务间的依赖关系 (B 和 C 必须在 A 之前完成, …) 输出:这些任务间的合法执行顺序 (C – B – A – …) 总之&am…

「图文讲解」浏览器原理与页面渲染过程

相信大家在面试的时候面试官总是会问一个问题:“可以说下浏览器从输入url到渲染页面完成过程吗?”,非官方标准答案来啦~ 那我们首先需要先来讲一下浏览器是什么,浏览器其实就是一个应用软件,在学习操作系统…

《数据结构、算法与应用C++语言描述》线性表-数组描述

《数据结构、算法与应用C语言描述》线性表-数组描述 5表示在 数据结构算法与应用C语言描述 书中所在章节。 本文包含了《数据结构、算法与应用C语言描述》第五章主要练习题答案,给出了线性表数组描述完整测试代码。 5.1 数据对象 5.1.1 定义 数据对象(data obj…

java开发的师生评教小程序学生对老师评价老师对班级评价打分题单选题意见框系统选课系统

简介 源码1.0(源码2.0选课功能,请往下看) 师生评教小程序,学生可以对老师进行评价,老师可以对班级行进评级。管理员可以创建不同的评教模板(单选题0分或者10分,打分题0-10分,意见框…

三分钟彻底搞懂paint,repaint,update!

最近总结了一下java中的paint,repaint和updata三者之间的关系,首先咱们都知道用paint方法来绘图,用repaint重绘,用update来写双缓冲。但是他们之间是怎么来调用的呢,咱们来分析一下(想直接看结果,请跳过分析…

2022卡塔尔世界杯感想

一、概述 说说我个人吧!在体育活动上面真是没什么兴趣,篮球,足球...等等竞技运动不敏感! 今年稍微关注了点世界杯比赛!什么原因呢?我有一个爱买彩票/赌球的一个同事!随着世界杯的进行&#xf…

风力发电机组机械功率Pm与转子转速Wm关系(Matlab实现)

目录 1 数学模型 2 代码 3 结果 1 数学模型 风力机空气动力学模型 风力涡轮机的动态输出机械扭矩表示为: 其中是空气密度 , A是叶片扫掠面积 , R是风力涡轮机的转子半径 (m), 是风速 (m/s)。是叶片的功率系数,它是叶片桨距…

linux内网渗透:docker逃逸

Docker逃逸 前言 Docker 逃逸在渗透测试中面向的场景大概是这样,渗透拿到shell后,发现主机是docker环境,要进一步渗透,就必须逃逸到“直接宿主机”。甚至还有物理机运行虚拟机,虚拟机运行Docker容器的情况。那就还要…

基于VUE.JS的招聘系统

开发工具(eclipse/idea/vscode等):idea 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字):本文是基于Vue.js对招聘系统的设计与实现,对招聘系统管理员、个人用户、企业用户三个模块功能的完善…

kubernetes学习之路--污点容忍度横向主节点

参考:K8s污点容忍度横向主节点-安全客 - 安全资讯平台 一.kube-scheduler调度 kube-scheduler是Kubernetes 集群的默认调度器,并且是集群控制面(master)的一部分。对每一个新创建的Pod或者是未被调度的Pod,kube-scheduler会选择一个最优的N…

[附源码]Nodejs计算机毕业设计基于图书管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

43_SDIO基础知识

目录 SDIO协议简介 SDIO设备分类 SD卡物理结构 SD卡寄存器列表 SDIO总线拓扑 SDIO总线 SDIO总线协议 SDIO命令 命令格式 命令类型 响应 SD卡的操作模式 卡识别模式 数据传输模式 STM32 SDIO功能框图 命令通道 命令状态机 数据通道 数据状态机 数据FIFO SDI…

自定义java注解案例

今天与大家分享java注解的基本使用,如有哪里有问题,望大家指教。 目录 1. 什么是java注解 2. java注解的分类 2.1 JDK基本注解 2.2 JDK元注解 3. 自定义注解 3.1 自定义注解语法 4. 注解示例 4.1 定义注解 4.2 拦截器 4.3 使用注解 4.4 测试 …

Kali Linux渗透测试演示——DNS欺骗

目录 一、DNS欺骗 1.介绍 2.原理 二、环境和工具 1.kali Linux和靶机(这里选择windows 7) 2.ettercap 三、攻击过程 1.首先确认一下Kali和靶机的IP地址以及网关 2.进入ettercap的配置文件 3.打开ettercap,进行主机发现 总结 一、DNS…

MR案例:计算学生成绩

计算学生成绩一、提出任务二、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录(二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启动成绩驱动…

adb常用命令(二)

adb:Android下面一个通用的调试工具管理设备或者手机模拟器的状态,进行手机操作:安装软件、卸载软件、系统升级、运行shell命令等adb命令:一、环境配置1,Java--JDK java -version2,SDK adb versionsdk版本管理(SDK与…

Spark-RDD(转换算子、行动算子、序列化、依赖关系、持久化、分区器、文件读取和保存、累加器、广播变量)

文章目录RDDRDD特点核心属性执行原理RDD创建RDD并行度与分区内存数据的分区文件数据的并行度和分区RDD转换算子Value类型mapmapPartitionsmapPartitionsWithIndexflatMapglom(获取分区数组)groupByfilterdistinctcoalesce(缩小/扩大分区)repartition(扩大分区)sortBysample双 V…

人工智能 之 机器学习(Machine Learning)

目录 一:机器学习概述 二:机器学习算法 三:机器学习模型 四:机器学习过程 五:机器学习模型验证 六:sklearn模块 一:机器学习概述 程序化处理和机器学习处理; 主观思维和客观思…