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

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

对于一个研发工程师,一定要有一个好的设计思维。

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


单一职责(SRP)


定义


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


职责的变化:

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


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


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


开闭原则(OCP)


定义


软件中的实体(类、模板、函数等)应该对扩展是开放的,但是对于修改是封闭的,即开放-封闭原则。

为了使我们的代码有更高的兼容性?(不知道用的词对不对)就是新增一个新的需求的时候,我们不用对已编写的代码进行修改,只用新增一部分代码就可以满足新的需求。


OCP实现的关键在于“抽象”,面向抽象编程。

我们将可变化的点进行“抽象”,“抽象”的变化用“具体实现”来体现,这样就表现的是对“抽象”封闭,对“实现”开放。

修改(How to do)

扩展(What to do)

严格的符合OCP是非常困难的,对于一些之前预测好的变化没有发生过,就称为过度设计。

我们只对当前业务频繁变化的点进行抽象就行,不能抽象所有业务。


里氏替换原则(LSP)


定义

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


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


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


接口隔离原则 (ISP)


定义


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


多个特定客户端接口要好于一个宽泛用途的接口。

一个对外提供的接口尽量只提供一个职责。


依赖翻转原则(DIP)


定义


高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口

抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口


翻转体现在两个点:

1.翻转上下级严格的关系:

上层模块不用依赖于低层模块,也可以依赖于上层抽象接口。

2.翻转接口所有权和定义权:

是上层根据具体的业务定义接口,低层根据业务实现接口定义。而不是低层现有能力抽象为接口供低层使用。从业务驱动的角度这种方式更加合理。


相关文章
|
2月前
|
人工智能 算法 小程序
再见 Cursor,Qoder 真香!这波要改写 AI 编程格局
真心建议大家去使用一下这段时间最新推出的一款 AI 编程工具:Qoder 。真的是太好用了,一点也不比 Cursor 差。
813 10
|
7月前
|
数据采集 存储 Web App开发
如何避免爬虫因Cookie过期导致登录失效
如何避免爬虫因Cookie过期导致登录失效
|
网络协议 SEO
TCP连接管理与UDP协议IP协议与ethernet协议
TCP、UDP、IP和Ethernet协议是网络通信的基石,各自负责不同的功能和层次。TCP通过三次握手和四次挥手实现可靠的连接管理,适用于需要数据完整性的场景;UDP提供不可靠的传输服务,适用于低延迟要求的实时通信;IP协议负责数据包的寻址和路由,是网络层的重要协议;Ethernet协议定义了局域网的数据帧传输方式,广泛应用于局域网设备之间的通信。理解这些协议的工作原理和应用场景,有助于设计和维护高效可靠的网络系统。
279 4
|
存储 算法 程序员
深入理解程序的结构
深入理解程序的结构
555 0
|
11月前
|
XML Java 数据格式
Spring Boot 开发中的常见失误
本文深入分析了Spring Boot开发中常见的失误,包括不当使用@Component、@ResponseBody、@Autowired注解,以及不良的异常处理和日志记录实践,提供了有效的规避策略,帮助开发者提升代码质量和系统性能。
224 0
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
1185 0
|
开发工具 git
解决Git push提交时Permission denied(publickey).Could not read from remote...的问题
解决Git push提交时Permission denied(publickey).Could not read from remote...的问题
925 0
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
2051 15
|
缓存 安全 Linux
本地YUM源大揭秘:搭建您自己的Linux软件宝库,从此告别网络依赖!一文掌握服务器自给自足的终极技能!
【8月更文挑战第13天】在Linux中,YUM是一款强大的软件包管理工具,可自动处理依赖关系。为适应离线或特定安全需求,本指南教你搭建本地YUM源。首先创建存放软件包的`localrepo`目录,复制`.rpm`文件至其中。接着,安装并运用`createrepo`生成仓库元数据。随后配置新的`.repo`文件指向该目录,并禁用GPG检查。最后,清理并重建YUM缓存,即可启用本地YUM源进行软件搜索与安装,适用于网络受限环境。
916 3
|
设计模式 存储 消息中间件
设计模式之美(二)——设计模式
《设计模式之美》是极客时间上的一个代码学习系列,在学习之后特在此做记录和总结。
设计模式之美(二)——设计模式