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

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

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

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


单一职责(SRP)


定义


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


职责的变化:

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


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


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


开闭原则(OCP)


定义


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

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


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

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

修改(How to do)

扩展(What to do)

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

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


里氏替换原则(LSP)


定义

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


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


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


接口隔离原则 (ISP)


定义


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


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

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


依赖翻转原则(DIP)


定义


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

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


翻转体现在两个点:

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

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

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

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


相关文章
|
15天前
|
人工智能 自然语言处理 API
阿里云百炼DeepSeek-V4-Pro/Flash全量上线:计费标准、折扣政策与场景化应用详解
阿里云百炼平台已正式上线DeepSeek-V4系列模型,对外提供DeepSeek-V4-Pro与DeepSeek-V4-Flash两种规格服务。此次上线保持API定价与模型官方一致,并面向用户提供低至4.5折的专属优惠,百万Tokens输入成本可低至1元,输出成本可低至2元,大幅降低企业与开发者使用高性能大模型的门槛。平台支持按量计费、节省计划、包月包季等多种付费模式,覆盖电商营销、广告创作、短剧内容生产、AI编程、智能客服、智慧办公等主流场景,为不同规模用户提供灵活、高性价比的AI服务方案。
1346 0
|
8月前
|
人工智能 算法 小程序
再见 Cursor,Qoder 真香!这波要改写 AI 编程格局
真心建议大家去使用一下这段时间最新推出的一款 AI 编程工具:Qoder 。真的是太好用了,一点也不比 Cursor 差。
1744 10
|
算法 Java 关系型数据库
Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
1565 0
Springboot yml配置参数加密 ,jasypt自定义解密器(拓展篇)
|
数据采集 存储 Web App开发
如何避免爬虫因Cookie过期导致登录失效
如何避免爬虫因Cookie过期导致登录失效
|
分布式计算 Hadoop Shell
熟悉常用的HBase操作
熟悉常用的HBase操作
525 3
熟悉常用的HBase操作
|
NoSQL Ubuntu 安全
在Ubuntu 18.04上安装和保护Redis的方法
在Ubuntu 18.04上安装和保护Redis的方法
484 0
|
开发工具 git
解决Git push提交时Permission denied(publickey).Could not read from remote...的问题
解决Git push提交时Permission denied(publickey).Could not read from remote...的问题
1037 0
|
网络协议 SEO
TCP连接管理与UDP协议IP协议与ethernet协议
TCP、UDP、IP和Ethernet协议是网络通信的基石,各自负责不同的功能和层次。TCP通过三次握手和四次挥手实现可靠的连接管理,适用于需要数据完整性的场景;UDP提供不可靠的传输服务,适用于低延迟要求的实时通信;IP协议负责数据包的寻址和路由,是网络层的重要协议;Ethernet协议定义了局域网的数据帧传输方式,广泛应用于局域网设备之间的通信。理解这些协议的工作原理和应用场景,有助于设计和维护高效可靠的网络系统。
497 4
|
设计模式 存储 消息中间件
设计模式之美(二)——设计模式
《设计模式之美》是极客时间上的一个代码学习系列,在学习之后特在此做记录和总结。
设计模式之美(二)——设计模式
|
开发者
鸿蒙next版开发:ArkTS组件通用属性(菜单控制)
在HarmonyOS 5.0中,ArkTS引入了灵活的菜单控制属性,支持通过长按、点击或鼠标右键触发弹出式菜单,增强用户交互体验。本文详细介绍了bindMenu和bindContextMenu方法,以及MenuItem的配置属性,并提供了示例代码,帮助开发者更好地理解和使用这些功能。
918 1