面向对象设计原则
面向对象设计原则
变化是复用的天敌
面向对象设计最大的优势在于:抵御变化!
认识面向对象
优点
隔离变化
- 从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化带来的影响减为最小,将影响控制在局部范围内。
各司其职
- 从微观层面来看,面向对象的方式更强调各个类的“责任”;
- 由于需求变化导致的新增类型不应该影响原来类型的实现。
对象是什么
- 从语言实现层面来看,对象封装了代码和数据;
- 从规格层面看,对象是一系列可以被使用的公共接口;
- 从概念层面看,对象是某种拥有责任的抽象。
面向对象设计原则
依赖倒置原则(DIP)
- 高层模块(稳定)不应该依赖于底层模块(变化),二者都应该依赖于抽象(稳定)
- 抽象(稳定)不应该依赖于实现细节(变化),实现细节都应该依赖于抽象。
理解:
首先:这里说的依赖均是指编译时依赖。比如:A依赖于B,那么在A编译时需要B存在。
一般来说,高层模块相对底层模块更加稳定。底层模块相当于是高层模块的地基,地基不稳,上层模块固然要受到影响。所以底层模块的小小变化可能会引起高层模块的巨大变化。
为了避免这种情况,在高层模块和底层模块之间布置一个抽象层,使得高层模块和底层模块都依赖于抽象层。抽象层趋于稳定,底层模块的变化会被抽象层隔离在底层,并不会传递至高层模块,高层模块就会趋向稳定。
在一定程度上,可以将抽象层提供为一层接口层,是高层模块调用底层模块的接口层,高层模块并不关心底层模块是怎么实现接口的,只需直接调用即可。而底层则是通过继承和多态来实现抽象层定义的接口,高层可以通过多态机制调用接口的相应实现。
开放封闭原则(OCP)
- 对扩展开放,对更改封闭
- 类模块应该是可扩展的,但是不可修改
理解:
一个软件实体应当对扩展开放,对修改关闭,即软件实体应尽量在不修改原有代码的情况下进行扩展。
代码开发会随时根据项目需求的变化而发生变化,要做的就是拥抱变化。如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。
为了满足开闭原则,抽象化是关键。可以为系统定义一个相对稳定的抽象层(就是稳定的接口层),而将不同行为(接口)的具体实现转移至具体的实现层中。如果需要修改系统的行为,无须对抽象层进行任何改动,只需要在实现层中增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。
单一职责原则(SRP)
- 一个类应该仅有一个引起它变化的原因
- 变化的方向隐含着类的责任
理解:
在设计类时,类的责任,即实现的功能,应该单一。一个类只承担一份责任,那么引起该类变化的就只有该类所承担的责任这一个原因。
里氏替换原则(LSP)
- 子类必须能够替换它们的基类(IS-A)
- 继承能够表达抽象类型
理解:
接口分离原则(ISP)
- 不应该强迫客户程序依赖它们不用的方法
- 接口应该小而完备
理解:
类在设计时,应该只需将必须暴露在外以供客户程序调用的接口声明为public,不需要外部调用的接口声明为project或者private供类内部自己使用即可;
接口暴露在外,客户程序就可能调用,所以应该只暴露必须暴露的接口。
所谓小而完备,就是只需暴露出必须的接口,暴露的接口较为完备足以供外部程序调用即可;多余的接口不要暴露。
优先使用对象组合,而不是类继承
- 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”;
- 继承在某种程度上破坏了封装性,子类父类耦合度高;
- 对象组合则要求被组合的对象有良好定义的接口,耦合度低。
理解:
对象组合,比如类A和类B一起作为类C的成员变量,这样通过类的组合来实现
封装变化点
- 使用封装来创建对象之间的分解层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次件的松耦合。
针对接口编程,不是针对实现编程
- 不将变量类型声明为某个特定的具体类,而是声明为某个接口;
- 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口;
- 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)