面向对象程序设计原则

前言

面向对象程序设计应遵循七大原则,以此提高代码的稳定性、易扩展、可复用、可维护。而不是CTRL+CV一把梭走天下,想要摆脱初级程序猿的称号,就应该从这里开始,不要总是想着程序和人有一个能跑就行,对自己的工作负责,也是对自己负责。

七大设计原则

设计原则名称定义使用频率
单一职责原则一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中★★★★
开闭原则软件实体应当对扩展开放,对修改关闭★★★★★
里氏代换原则所有引用基类的地方必须能透明的使用其子类的对象★★★★★
依赖倒转原则高层模块不应依赖低层模块,它们都应依赖于细节。抽象不应该依赖于细节,细节应该依赖于抽象★★★★★
接口隔离原则客户端不应该依赖那些它不需要的接口★★
合成复用原则优先使用对象组合,而不是继承来达到复用的摸底★★★★
迪米特法则每一个软件单位对其他的单位都只有最少的只是,二位局限于那些与本单位密切相关的软件单位★★★

单一职责原则

定义

单一职责原则就是指就一个类而言,应该仅有一个引起它变化的原因,否则应该被拆分。核心就是控制一个类的粒度大小,将对象解耦,提高其内聚性。

作用

  • 降低类的复杂性:一个类只负责一项职责,其罗技肯定要比负责多项职责简单的多
  • 提高可读性:复杂性降低,就不会杂乱无章了没自然可读性也会提高
  • 提高可维护性:该类就只负责处理某一具体功能,超出能力范围就可以考虑继承多态等方式去实现了
  • 降低变更引起的风险性:变更是必然的避免不了,如果单一职责原则遵循的好,当修改一个功能时,可以显著降低对其它功能的影响

开闭原则

定义

开闭原则及开放-封闭原则,是指程序实体(类、模块、方法等)应该可以扩展,但是不可修改(或修改成本尽可能低)。通俗点说就是当应用的需求改变时,在不修改软件实体的源代码的前提下,可以扩展模块的功能,使其满足新的需求

作用

  • 方便测试:测试时只需要对扩展的代码进行测试
  • 提高复用性:粒度越小,复用的可用性越大
  • 提高代码健壮性:稳定并且易于扩展和维护

实现方式

通过“抽象约束,封装变化”来实现开闭原则。通过接口或抽象类为程序实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。

举个栗子

你是一名程序猿,你的本职工作就是CRUD(狗头.JPG),你的BOSS让你去打扫厕所,让你做美工,这合适吗?显然不行,你只需要做好你的本职工作就行,其它工作有相对应的岗位来做。

依赖倒转原则

定义

抽象不应该依赖细节,细节应该依赖于抽象。高层模块不应该依赖低层模块两个都应该依赖抽象。通俗点说就是要针对接口编程,而不是针对实现编程。

作用

  • 高内聚,低耦合
  • 提高稳定性
  • 降低并行开发引起的风险
  • 提高可读性和可维护性

实现方式

  1. 每个类经可能提供接口或抽象类,或两者都具备
  2. 变量的声明类型尽量时接口或是抽象
  3. 任何类都不应该从具体类派生
  4. 使用继承时尽量遵循里氏替换原则

举个栗子

PC电脑是由主板、CPU、内存条、显卡、电源等多个组件组合而成的,主板按照某一标准规则预留了插槽、针脚等、如果主板坏了,只需要换一个主板即可,而不是主板坏了则其它的CPU、内存条那些全都得跟着一起换,这就体现了,高层不应该依赖低层。就好比它们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,更换任何一个部件对其他都没有影响。

里氏替换原则

定义

子类必须能够替换它们的父类。通俗点说就是继承必须确保类所拥有的性质在子类中仍然成立。子类可以扩展父类的功能,但不能改变父类原有的功能。

作用

  • 克服了继承中重写父类造成的可复用性变差的缺点
  • 保证动作准确性:即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性

实现方式

在继承时,除添加新的方法完成新功能外,尽量不要重写父类的方法

举个栗子

现在有一只会飞的鸟,具体点一只麻雀,在设计抽象层时,里面有一个飞行动作的方法,而此时有一头鸵鸟,能继承这个父类吗?显然不太合适,鸵鸟虽然也是鸟,可是并不会飞,一旦继承,它将会拥有飞的功能。

TODO

  • 接口隔离原则
  • 合成复用原则
  • 迪米特法则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值