1. 好的设计原则

目录

  • 一、应该具备的性质
  • 二、面向对象设计原则
  • 三、详解
    • 3.1 开闭原则
    • 3.2 单一职责原则
    • 3.3 里氏替换原则
    • 3.4 依赖倒置原则
    • 3.5 接口隔离原则
    • 3.6 合成复用原则
    • 3.7 迪米特原则

一、应该具备的性质

  • 可扩展性
  • 灵活性
  • 可插入性

二、面向对象设计原则

以下设计原则的重要性从高到低排列

名称简介重要度
开闭原则软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能💪💪💪💪💪
依赖倒置原则要针对抽象层编程,而不要针对具体类编程💪💪💪💪💪
单一职责原则类的职责要单一、不能将太多的职责放在一个类中💪💪💪💪
里氏替换原则在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象💪💪💪💪
合成复用原则在系统中应该尽量多使用组合和聚合关联关系,尽量少用甚至不用继承关系💪💪💪💪
迪米特法则一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互💪💪💪
接口隔离原则使用多个专门的接口来取代一个统一的接口💪💪

三、详解

3.1 开闭原则

  • 抽象化是开闭原则的关键。
  • 要求开发人员可以在不修改系统中现有功能代码的前提下,实现对应用系统的软件功能进行扩展。

3.2 单一职责原则

  • 高内聚性原则
  • 避免相同的职责(功能)分散到不同的类中实现
  • 避免一个类承担过多的职责
  • 可以减少类之间的耦合
  • 数据库类设计示例
    • 数据库连接和数据库访问操作相互分离
    • 例如数据库连接分为Mysql和Orcal连接
    • 相应的访问也会有Mysql和Orcal访问

3.3 里氏替换原则

  • 凡是父类出现的地方,都可以用子类进行替代
  • 里氏替换原则
    • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
    • 子类中可以增加自己特有的方法
    • 当子类的方法重载父类的方法时,方法的形参要比父类方法的输入参数更宽松
    • 当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。

3.4 依赖倒置原则

  • 将依赖关系倒置为依赖接口
    • 上层模块不应该依赖于下层模块,它们共同依赖于一个抽象
    • 父类不能依赖子类,它们都要依赖抽象类
    • 抽象不能依赖于具体,具体应该依赖于抽象
  • 示例如下
    • 左图显示了类之间的严格依赖,耦合性非常强
    • 应该做如下修改
      • 找到类之间共同的行为约束(接口)
      • 客户端程序不针对具体的类进行调用,而是调用接口
      • 这样就屏蔽了类之间的强关联关系

在这里插入图片描述

3.5 接口隔离原则

  • 一个类对另外一个类的依赖性应当是建立在最小的接口上
  • 客户端不应该依赖那些它不需要的接口(方法)
  • 仍然需要考虑接口的单一职责原则
  • 如何避免不良好的接口设计
    • 用多个专门的接口,而不使用单一的总接口
    • 一个接口就只代表一个角色
    • 使用接口隔离原则拆分接口时,首先必须满足单一职责原则

3.6 合成复用原则

  • 也称为组合/聚合复用原则
  • 尽量使用对象组合,而不是继承来达到复用目的
  • 一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象
  • 新对象通过委派调用已有对象的方法达到复用其已有功能的目的
  • 简单来说,就是要尽量使用组合/聚合关系,少用继承!
  • 继承复用: 实现简单,易于扩展,没有足够的“灵活性”(“白箱”复用)

在这里插入图片描述

  • 上面的类StudentDAO拥有了DBUtil类的行为以及属性
  • 那么两个类之间具有了强耦合关系,尤其是DBUtil父类发生改变时,其子类StudentDAOTeacherDAO都会受到影响。
  • 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行(“黑箱”复用)
    在这里插入图片描述
    • 让类StudentDAO拥有了DBUtil类的实例
    • 此时StudentDAO类依然拥有了DBUtil类的属性和行为
    • 如此以来耦合性就会降低
    • 如果想近一步降低耦合性,则将DBUtil类设计为接口,在其它地方实现即可。

3.7 迪米特原则

  • 要求一个软件实体应当尽可能少的与其他实体发生相互作用
  • 又称为最少知识原则
    • 不要和“陌生人”说话
    • 只与你的直接朋友通信
    • 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些本单位密切相关的软件单位
  • 简单来说就是,创建松耦合的类
  • 某系统界面类(如Form1、Form2等类)与数据访问类(如DAO1、DAO2等类)之间的调用关系较为复杂,如图所示
    在这里插入图片描述
  • 如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用
    在这里插入图片描述

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

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

相关文章

深度学习图像分类数据集—猫七种表情识别分类

该数据集为图像分类数据集,适用于ResNet、VGG等卷积神经网络,SENet、CBAM等注意力机制相关算法,Vision Transformer等Transformer相关算法。 数据集信息介绍:猫七种表情识别分类:[Angry, Disgusted, Happy, Normal, Sa…

002_Claude模型与定价

Claude模型与定价 目录 Claude 4 模型系列模型功能对比定价策略计费说明企业定价使用建议 Claude 4 模型系列 Anthropic 推出了最新的 Claude 4 系列模型,提供不同性能等级以满足各种需求: Claude Opus 4 定位:最强大、最智能的模型特点…

【牛客刷题】游游的字母串

文章目录 一、题目介绍1.1 题目描述1.2 输入描述:1.3 输出描述:1.4 示例1二、解题二、解题思路2.1 核心问题2.2 关键策略三、算法分析3.1 为什么正确?3.2 复杂度分析四、模拟演练五、完整代码一、题目介绍 题目:游游的字母串 1.1 题目描述 对于一个小写字母而言,游游可以通…

docker容器高级管理-dockerfile创建镜像

目录一.构建LNMP架构1.构建nginx容器①拉取centos镜像(对镜像做基础架构)②创建dockerfile工作目录(可以是一个服务的项目)③创建dockerfile④创建启动脚本2.构建mysql数据库①创建mysql项目②配置dockersfile文件④创建镜像文件3…

北京-4年功能测试2年空窗-报培训班学测开-第四十九天

今天自习,在自习室嘤…今天效率不高,导致焦虑。不,或者该说,因为焦虑导致效率不高?没有达到自己预期,对自己也不满意临近结课,突然有些迷茫,我知道我要做的还有很多,要学…

css选择器的优先级以及用法

在 CSS 中,当多个选择器同时作用于一个元素,并且为该元素的同一属性设置了不同的值时,就需要依据选择器的优先级来确定最终应用哪个样式。本文详细介绍 CSS 选择器优先级的相关内容。 本文目录一、单个选择器的优先级1. 内联样式2. ID 选择器…

hercules zos 安裝 jdk 8

首先到 IBM 官網下載相關 PAX 檔 (SDK8_31bit_SR8_FP45.PAX.Z) 和 SDK8_31bit_readme.txt https://www.ibm.com/support/pages/java-sdk-products-zos 在 hercules 裡加一些新卷用來存放這個 JDK (UAPP02),UTMP02 也可以順便加上讓 OMVS IBMUSER 下多一些存放空間&…

张量索引操作

一.前言本期我们来说一下张量的索引操作,需要掌握张量不同索引操作,我们在操作张量时,经常需要去进⾏获取或者修改操作,掌握张量的花式索引操作是必须的⼀项能⼒。二.简单行、列索引import torchdata torch.randint(0, 10, [4, 5…

docker 启动中间件

docker 启动 MySQL # 创建目录 mkdir -p /Users/dongdong/software/mysql/{conf,data}docker run -d \ -p 3306:3306 \ -v /Users/dongdong/software/mysql/conf:/etc/mysql/conf.d \ -v /Users/dongdong/software/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -…

如何批量旋转视频90度?

用相机拍摄视频的时候,原本是竖直拍的,但是放到电脑里面看的时候,却变成了横版的。如果我们需要放到剪映或者其他软件做剪辑的时候,一个一个去旋转视频会比较麻烦,这里,我们可以事先用.bat文件批处理的方式…

(2025)IDEA 下载与安装保姆级指南

目录 一、下载 IntelliJ IDEA (一)访问官方网站 (二)选择版本 (三)下载安装包 二、安装 IntelliJ IDEA (一)运行安装程序 (二)选择安装语言 &#xf…

【CV综合实战】基于深度学习的工业压力表智能检测与读数系统【1】压力表位置检测

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

性能狂飙 Gooxi 8卡5090服务器重新定义高密度算力

国鑫Intel Eagle Stream平台8卡RTX5090AI服务器性能到底有多强?小编一文带你看懂个中奥妙。国鑫Intel Eagle Stream平台8卡RTX5090AI服务器如图,国鑫Intel Eagle Stream平台8卡RTX5090AI服务器(SY6108G-G4)只有6U高度,…

零基础掌握Go语言需要多久?报班的话哪家好?

大家有没有发现,近年来,Go语言越来越受欢迎了,TIOBE榜单中,Go现在已经稳居前10了。 尤其在云计算、区块链、微服务等领域,Go语言更是“钦点语言”,很多大厂也都在积极使用Go语言,薪资待遇更是连…

【网络】Linux 内核优化实战 - net.ipv4.tcp_no_metrics_save

目录一、TCP连接指标缓存的作用二、tcp_no_metrics_save的取值及含义三、适用场景与影响推荐启用缓存(值为0)的场景:推荐禁用缓存(值为1)的场景:实际影响:四、如何查看和修改参数1. 查看当前值2…

13. G1垃圾回收器

1. JVM介绍和运行流程-CSDN博客 2. 什么是程序计数器-CSDN博客 3. java 堆和 JVM 内存结构-CSDN博客 4. 虚拟机栈-CSDN博客 5. JVM 的方法区-CSDN博客 6. JVM直接内存-CSDN博客 7. JVM类加载器与双亲委派模型-CSDN博客 8. JVM类装载的执行过程-CSDN博客 9. JVM垃圾回收…

算法学习笔记:13.归并排序——从原理到实战,涵盖 LeetCode 与考研 408 例题

归并排序是一种基于分治策略的经典排序算法,由约翰・冯・诺依曼在 1945 年提出。它以稳定的 O (nlogn) 时间复杂度和良好的可并行性,在大规模数据排序场景中占据重要地位。与快速排序的 “先分区后排序” 不同,归并排序采用 “先排序后合并”…

Kotlin基础学习记录

变量和函数 变量 // val为常量,一旦赋值就不可变 val a 10 val a: Int 10 a 3 // 报错// var为变量 var a 10 a 3 var b: Int 20 b 2函数fun add(a: Int, b: Int): Unit {a b // 报错,参数默认val }fun add(a: Int, b: Int) {var x: Int ax b …

【C#】GraphicsPath的用法

在 C# 中,GraphicsPath 是 GDI 提供的一个非常强大的类,用于创建和操作复杂图形路径。它可以用来绘制直线、曲线、多边形等形状,并支持判断点是否在路径内或路径的轮廓上。一、基本概念GraphicsPath 类功能:添加各种几何图形&…

C语言32个关键字

文章目录数据类型1、数据类型(12个)控制语句2、控制语句关键字(12个)存储类型3、存储类型关键字(4个)其他关键字4、其他关键字(4个)​一共32个关键字分为 数据类型 1、数据类型&am…