zoukankan      html  css  js  c++  java
  • 面向对象程序设计原则

    前言

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

    七大设计原则

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

    单一职责原则

    定义

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

    作用

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

    开闭原则

    定义

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

    作用

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

    实现方式

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

    举个栗子

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

    依赖倒转原则

    定义

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

    作用

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

    实现方式

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

    举个栗子

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

    里氏替换原则

    定义

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

    作用

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

    实现方式

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

    举个栗子

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

    迪米特法则

    定义

    如果两个类不必直接通信,那么这两个类就不应当直接发生直接的相互作用,。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

    作用

    解决类之间的松耦合关系,类之间的耦合越若,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。

    实现方式

    定义接口或父类,具体实现类有相互调用的地方则通过父类"中转"

    举个栗子

    初入职场,进公司报道时,人事部叫你去找IT部鲁工领电脑及办公设备,然而鲁工今天恰好有急事外出了,你又去找了IT部另外的同事,人家一看是让你去找鲁工,就不乐意接你这活了,你就在办公室摸鱼摸了一天,如果IT部有一个主管(表示抽象父类或接口),人事部让你去找IT部(主管),要是鲁工不在,主管就会去安排另外的同事与你对接。

    TODO

    • [ ] 接口隔离原则
    • [ ] 合成复用原则
  • 相关阅读:
    第02组 每周小结 (2/3)(组长)
    第02组 每周小结 (1/3)(组长)
    第02组(51)beta冲刺总结
    第02组 Beta冲刺 (5/5)(组长)
    第02组 Beta冲刺 (4/5)(组长)
    第02组 Beta冲刺 (3/5)(组长)
    第02组 Beta冲刺 (2/5)(组长)
    第02组 Beta冲刺 (1/5)(组长)
    软工实践个人总结
    第11组 每周小结 (当前轮次3/3)
  • 原文地址:https://www.cnblogs.com/chonglu/p/14928816.html
Copyright © 2011-2022 走看看