软件设计七大原则

2023-11-17


软件设计有两个关键目标: 高内聚、低耦合

  1. 开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;
  2. 里氏替换原则告诉我们不要破坏继承体系;
  3. 依赖倒置原则告诉我们要面向接口编程;
  4. 单一职责原则告诉我们实现类要职责单一;
  5. 接口隔离原则告诉我们在设计接口的时候要精简单一;
  6. 迪米特法则告诉我们要降低耦合度;
  7. 合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。

一、开闭原则

定义

要对扩展开放,对修改关闭
当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。

实现方法

可以通过“抽象约束、封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。

二、里氏替换原则

定义

继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。
里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原理是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。

实现方法

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

三、依赖倒置原则

定义

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口编程,不要面向实现编程。

实现方法

  1. 每个类尽量提供接口或抽象类,或者两者都具备。
  2. 变量的声明类型尽量是接口或者是抽象类。
  3. 任何类都不应该从具体类派生。
  4. 使用继承时尽量遵循里氏替换原则。

四、单一职责原则

定义

规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。

实现方法

在这里插入图片描述

五、接口隔离原则

定义

客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。
一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。
要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。实现方法

实现方法

  1. 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑。
  2. 为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
  3. 了解环境,拒绝盲从。每个项目或产品都有选定的环境因素,环境不同,接口拆分的标准就不同深入了解业务逻辑。
  4. 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

六、迪米特法则

定义

最少知识原则(Least Knowledge Principle,LKP)
只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。
其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

实现方法

从依赖者的角度来说,只依赖应该依赖的对象。

从被依赖者的角度说,只暴露应该暴露的方法。

  1. 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。
  2. 在类的结构设计上,尽量降低类成员的访问权限。
  3. 在类的设计上,优先考虑将一个类设置成不变类。
  4. 在对其他类的引用上,将引用其他对象的次数降到最低。
  5. 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。
  6. 谨慎使用序列化(Serializable)功能。

七、合成复用原则

定义

组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)
在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

实现方法

合成复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件设计七大原则 的相关文章

  • 概说概要设计怎么做

    概说概要设计怎么做 51CMM COM原创 作者 厦门巨龙软件工程有限公司 卢琳生 2003 12 22 摘要 本文是在概要设计实践和学习中的一些心得与学习笔记 希望与大家分享 如有不妥之处欢迎指正 关键字 概要设计 结构化 OOD 正文
  • 2021年系统集成项目管理工程师(软考中级)连夜整理考前重点

    一 信息与信息化 1 信息论奠基者香农认为 信息就是能够用来消除不确定性的东西 8种状态需要3位比特表示 5位比特则可表示64种状态 信息 物质材料 能源是三大戓略资源 2 信息论两个层次 本体论和认识论 3 信息传输模型 信源 编码 信道
  • 计网学习记录,burp抓包等学习记录

    攻防实验室 网安学习记录 1 学习到html的基础架构及其简单用法 1 html基础架构 2 table 定义表格 2 学会用phpstudy创建网站 3 用wordpress对phpstudy创建的网站进行了编辑修改 4 仅通过phpst
  • 音乐软件案例分析

    项目 内容 这个作业属于哪个课程 2023年北航敏捷软件工程 这个作业的要求在哪里 软件案例分析 我在这个课程的目标是 学习软件工程理论 在实践中体会并运用软件工程理论 收获团队开发和软件工程实践经验 这个作业在哪个具体方面帮助我实现目标
  • 系统架构设计师-数据库系统(1)

    目录 一 数据库模式 1 集中式数据库 2 分布式数据库 二 数据库设计过程 1 E R模型 2 概念结构设计 3 逻辑结构设计 三 关系代数 1 并交差 2 投影和选择 3 笛卡尔积 4 自然连接 一 数据库模式 1 集中式数据库 三级模
  • Open Source Game Clones

    Open Source Game Clones This site tries to gather open source reimplementations of great old games in one place If you t
  • 软件工程复习10:软件设计与实现

    作者 非妃是公主 专栏 软件工程 个性签 顺境不惰 逆境不馁 以心制境 万事可成 曾国藩 专栏地址 软件工程专栏地址 专栏系列文章 软件工程复习01 软件工程概述 软件工程复习02 个人技术 软件工程复习03 个人软件流程 软件工程复习04
  • 软件设计(十四)-UML建模(上)

    软件设计 十三 原码 反码 补码 移码https blog csdn net ke1ying article details 129115844 spm 1001 2014 3001 5501 UML建模包含 用例图 类图与对象图 顺序图
  • JAVAWEB编程题

    1 登陆验证代码
  • 软件项目管理

    目录 前言 项目管理概述 项目与软件项目 项目管理与软件项目管理 项目管理知识体系 过程管理与软件项目管理的关系 软件项目管理过程 项目初始 项目确立 项目立项 项目招投标 项目授权 敏捷开发总结 scrum模型 迭代式增量软件开发过程 术
  • 软件工程期末试题及答案(史上最全)

    软件工程期末试题及答案 文章目录 软件工程期末试题及答案 一 填空题 二 选择题 三 判断题 四 简答题 五 分析题 六 画图题 一 填空题 在信息处理和计算机领域内 一般认为软件是 文库 程序 文档 和 数据 数据流图的基本组成部分有 数
  • 推荐111个软件工程本科的计算机毕业设计,有手就会

    对于即将挑战计算机专业毕业设计的学子们 是否已经为选题和项目感到焦虑 今天 我们为即将毕业的学生提供了大量的毕业设计项目 期望对于正在为毕业设计挠头的同学们有所助益 一 成品列表 以下所有springboot框架项目的源码博主已经打包好上传
  • 非常优秀的网站设计案例,设计师必备

    厚积才能薄发 一个优秀的设计师的天性一定是想要获得更多网站设计灵感 擅于为新项目寻找创意切入点 搜索设计参考资源 最新的设计趋势 今天为大家带来了一组免费可商用的网站设计案例 通过这些网站设计案例 你可以获得 寻找不同风格的网站灵感 配色
  • Python 简介和用途

    什么是Python Python是一种流行的编程语言 由Guido van Rossum创建 并于1991年发布 它用于以下领域 网页开发 服务器端 软件开发 数学 系统脚本编写 Python能做什么 Python可用于在服务器上创建Web
  • WMS系统出库扫描:提升仓储管理效率与准确性

    WMS系统中的出库扫描功能是关键环节之一 它通过扫描物料或货物的条形码或二维码 实现实时 准确地记录和更新库存信息 一 WMS系统出库扫描的重要性 1 实现库存准确性 通过出库扫描 WMS系统能够准确记录物料或货物的出库信息 实时更新库存数
  • Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose

    Docker CLI 命令行界面 是一个强大的工具 可让您与 Docker 容器 映像 卷和网络进行交互和管理 它为用户提供了广泛的命令 用于在其开发和生产工作流中创建 运行和管理 Docker 容器和其他 Docker 资源 安装 要开始
  • C++ 中 const 和 constexpr 关键字解析:常量、函数和指针

    很多 C 的初学者看到 const 这个关键字的第一反应都是一头雾水 主要是因为 const 可 以出现在很多的位置 以及后面加入的 constexpr 更是常常感到困惑 今天就为大家一一解释出现它们的含义和以及作用 const 关键字 c
  • Python 中多态性的示例和类的继承多态性

    单词 多态 意味着 多种形式 在编程中 它指的是具有相同名称的方法 函数 操作符 可以在许多不同的对象或类上执行 函数多态性 一个示例是 Python 中的 len 函数 它可以用于不同的对象 字符串 对于字符串 len 返回字符的数量 示
  • 掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南

    C 变量 变量是用于存储数据值的容器 在 C 中 有不同类型的变量 用不同的关键字定义 例如 int 存储整数 没有小数点的整数 如 123 或 123 double 存储浮点数 有小数点 如 19 99 或 19 99 char 存储单个
  • C# Break 和 Continue 语句以及数组详解

    C Break 它被用于 跳出 switch 语句 break 语句也可用于跳出循环 以下示例在 i 等于 4 时跳出循环 示例 for int i 0 i lt 10 i if i 4 break Console WriteLine i

随机推荐

  • 浅析java基本数据类型

    java中的基本数据类型4类8种 四种整数类型 byte short int long 两种浮点数类型 float double 一种字符类型 char 一种布尔类型 boolean true 真 和 false 假 所谓数据类型 在数据结
  • 若依免登录进首页

    现象 在启动若依后 输入验证码登录至首页 然后关掉idea中的前后端 再打开idea重启前后端 然后发现若依免登录直接进入到首页 应是login vue中设置了Cookie 如下图所示 这里验证码的答案因为已经缓存到Redis中了 因而在该
  • mpu6050数据,mqtt订阅实时存mysql数据库

    import json import paho mqtt client as mqtt import pymysql import time HOST mqtt域名 PORT mqtt端口号 KEEPALIVE 60 topic MPU60
  • linux系统架构与目录解析

    1 当有两个硬盘都装有linux时 居然可以直接跳进另一个操作系统 不用重启 使用命令chroot 做一些简单的操作 因为linux kernel差不多 2 linux本地启动过程为grub gt kernel gt initrd gt i
  • RIP的防环机制:水平分割、毒性反转、触发更新

    RIP的防环机制 水平分割 毒性反转 触发更新 RIP Routing Information Protocol 路由信息协议 一种距离矢量路由协议 属于IGP协议 适用于中小型网络 使用UDP进行路由信息的交互 端口号520 为了防止产生
  • 计网学习记录,burp抓包等学习记录

    攻防实验室 网安学习记录 1 学习到html的基础架构及其简单用法 1 html基础架构 2 table 定义表格 2 学会用phpstudy创建网站 3 用wordpress对phpstudy创建的网站进行了编辑修改 4 仅通过phpst
  • Android日志分析02-am篇

    Android日志分析02 am篇 在日常分析bug时 免不了和系统ActivityManagerService打交道 根据日志去查看各个Activity的生命周期 从而判断是否出现Activity生命周期异常 先使用adb logcat和
  • for in / for of / forEach 循环

    目录 1 for 循环 2 for in 循环 3 forEach 循环 4 for of循环 5 const 在 for in 或者for of 中的使用 1 for 循环 for 循环的最大缺点是需要跟踪计数器和退出条件 虽然 for
  • nginx解决端口问题含配置步骤---反向代理

    centos7下安装nginx博客链接 https blog csdn net qq 41357211 article details 99694744 nginx配置反向代理步骤 在文章下面 nginx安装在服务器后 例如服务器的域名为
  • android接口加密实现方案

    Fiddler抓包工具配置 android接口如何防抓取 Windows下使用OpenSSL生成RSA证书 文中使用的加密库 1 程序主类 import android os Bundle import android support v7
  • QTreeWidget表头拉伸宽度自适应导致长度显示有遮挡

    对QTreeWidget 设置 header gt setSectionResizeMode 0 QHeaderView ResizeToContents 后 由于控件的拉伸属性再为其设置setColumnWidth 0 200 将不再生效
  • CE+OD外挂制作实战 [提高篇]

    人造指针 基址 实验目标 通过向游戏注入一段特殊汇编代码 实现自动获取动态地址 省略找基址的麻烦 为什么会出现人造指针 1 基址偏移层数太多 很难找 2 有些游戏根本找不到基址 人造指针有什么优缺点 1 人造指针就算游戏更新也无需去重复找基
  • Numpy 通过矩阵操作避免for循环 之 [None, :, :]运用

    我们知道python中 for 循环的效率是不高的 相比之下 直接运用矩阵向量操作 如点乘 可以让代码运行更快 因为在复现paper时候遇到了这样的问题 在这里总结一下我的解决方法 None 介绍 通过None indexing 可以将一个
  • citespace数据处理:用python对Ref文档进行去重

    首先将txt文档提取到Excel表格中筛选出重复项 并且整理到txt中 需要去重的目标txt也准备好 接下来运行代码 注意代码中的路径需要自己按实际情况修改 coding utf 8 author pig 实现去重功能 import re
  • xampp安装

    常见报错 1 apache启动出错 ServerRoot must be a valid directory 解决方法 安装时 直接安装在D盘下 而不是子文件夹下 2 XAMPP与VMware端口443占用问题 Port 443 in us
  • LaTeX新人教程,30分钟从完全陌生到基本入门

    1 LaTeX软件的安装和使用 方法A 自助 在MikTeX的官网下载免费的MikTeX编译包并安装 下载WinEdt 收费 或TexMaker 免费 等编辑界面软件并安装 方法B 打包 在ctex org下载ctex套装 含MikTeX及
  • C++,函数的分文件编写,进行封装。

    1 创建后缀名为 h的头文件 例如test h 右键头文件 新建项 下方文件命名为为 h的头文件 2 然后在头文件里面 对函数声明 其中 include
  • 160道Shell企业面试题整理汇总

    1 Shell脚本是什么 它是必需的吗 答 一个Shell脚本是一个文本文件 包含一个或多个命令 作为系统管理员 我们经常需要使用多个命令来完成一项任务 我们可以添加这些所有命令在一个文本文件 Shell脚本 来完成这些日常工作任务 2 什
  • 领扣算法:234 回文链表

    请判断一个链表是否为回文链表 示例 1 输入 1 gt 2 输出 false 示例 2 输入 1 gt 2 gt 2 gt 1 输出 true 输入参数 public boolean isPalindrome ListNode head 解
  • 软件设计七大原则

    文章目录 一 开闭原则 定义 实现方法 二 里氏替换原则 定义 实现方法 三 依赖倒置原则 定义 实现方法 四 单一职责原则 定义 实现方法 五 接口隔离原则 定义 实现方法 六 迪米特法则 定义 实现方法 七 合成复用原则 定义 实现方法