当前位置: 首页 > news >正文

面向对象的设计(OOD)原则了解一下

OOD原则

    • 单一职责(SRP)
      • 定义
    • 开闭原则(OCP)
      • 定义
    • 里氏替换原则(LSP)
      • 定义
    • 接口隔离原则 (ISP)
      • 定义
    • 依赖翻转原则(DIP)
      • 定义

对于一个研发工程师,一定要有一个好的设计思维。
熟悉面向对象的原则,能有利于设计,又有利于测试。如果不成熟的设计,也能实现一些理想的功能,但是对于异常情况的模拟测试很难实现,不能实现产品化。

单一职责(SRP)

定义

每个类或者模块都应该有一个单一职责,并且该职责应由这个类或模块完全封装起来。

职责的变化:
职责的界定会根据类的试用场景界定,当场景变化时需要对类职责进行重新划分。也可以说职责是对于需求的满足,职责层次性来源于需求层次性。

如果一个类承担过多的职责,就等于将这些职责都耦合在一起,任何一个职责的变化都可能造成一个类的变化,也可能引起其他职责的变化。这种耦合导致系统的脆弱性。

软件工程中耦合(Coupling)表示两个子系统(或类)之间的关联程度,当一个子系统(或类)发生变化时对另一个子系统(或类)的影响很小,则称它们是松散耦合的;反之,如果变化的影响很大时,则称它们是紧密耦合的。

开闭原则(OCP)

定义

软件中的实体(类、模板、函数等)应该对扩展是开放的,但是对于修改是封闭的,即开放-封闭原则。
为了使我们的代码有更高的兼容性?(不知道用的词对不对)就是新增一个新的需求的时候,我们不用对已编写的代码进行修改,只用新增一部分代码就可以满足新的需求。

OCP实现的关键在于“抽象”,面向抽象编程。
我们将可变化的点进行“抽象”,“抽象”的变化用“具体实现”来体现,这样就表现的是对“抽象”封闭,对“实现”开放。
修改(How to do)
扩展(What to do)
严格的符合OCP是非常困难的,对于一些之前预测好的变化没有发生过,就称为过度设计。
我们只对当前业务频繁变化的点进行抽象就行,不能抽象所有业务。

里氏替换原则(LSP)

定义

子类必须能完全替换父类,在使用者层次上,子类不能有多于父类的职责。

子类一定不能对父类的行为进行限制

基于正方形是特殊矩形假设将正方形定位为矩形的子类的行为就违反了以上原则,正方形设置长和宽行为限制了矩形的行为设置长和宽的行为(正方形长、宽必须相等)

接口隔离原则 (ISP)

定义

ISP 承认存在一些对象,他们确实不需要内聚的接口,但是 ISP 建议客户程序不应该看到他们作为一个单一的类存在。相反,客户程序看到的应该是多个具有内聚接口的抽象基类。

多个特定客户端接口要好于一个宽泛用途的接口。
一个对外提供的接口尽量只提供一个职责。

依赖翻转原则(DIP)

定义

高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口
抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口

翻转体现在两个点:
1.翻转上下级严格的关系:
上层模块不用依赖于低层模块,也可以依赖于上层抽象接口。
2.翻转接口所有权和定义权:
是上层根据具体的业务定义接口,低层根据业务实现接口定义。而不是低层现有能力抽象为接口供低层使用。从业务驱动的角度这种方式更加合理。

相关文章:

  • <1> c++ 笔记 stl::map
  • 怎样才算精通 Excel?超详细讲解!
  • 3.3Docker网络模式与资源控制
  • 【元宇宙欧米说】一个科幻 NFT,一场关于创作者经济的探索
  • 3.1虚拟化和安装Docker
  • 讲价 数学问题
  • Qt官方示例学习目录
  • 【下班神器】python写自动关机程序并打包成exe文件
  • SQL 改写系列十:半连接转内连接
  • 根据上下级关系统计数据
  • 金仓数据库KingbaseES客户端编程开发框架-Hibernate Spatial(2. 概述)
  • 第二十三章 多线程(一)
  • mysql的常见的外键约束
  • React基础-JSX语法介绍
  • SAP ABAP代码自动生成demo
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android 控件背景颜色处理
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python socket服务器端、客户端传送信息
  • Python十分钟制作属于你自己的个性logo
  • TCP拥塞控制
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 初识 beanstalkd
  • 基于HAProxy的高性能缓存服务器nuster
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 老板让我十分钟上手nx-admin
  • 人脸识别最新开发经验demo
  • 通信类
  • 怎么将电脑中的声音录制成WAV格式
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • !!java web学习笔记(一到五)
  • "无招胜有招"nbsp;史上最全的互…
  • #laravel 通过手动安装依赖PHPExcel#
  • #大学#套接字
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (14)Hive调优——合并小文件
  • (2)STL算法之元素计数
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (差分)胡桃爱原石
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计ssm电影分享网站
  • (排序详解之 堆排序)
  • (三)终结任务
  • (转)IOS中获取各种文件的目录路径的方法
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET NPOI导出Excel详解
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET使用存储过程实现对数据库的增删改查
  • @angular/cli项目构建--Dynamic.Form