软件设计的几大原理

随着经历过好几次项目的重构,发现重构的代码,基本上都是因为不满足基本的软件设计原则。
因此,将软件设计的几大原则再次温习一下。

开闭原则

  • 一个软件如 类, 模块和函数应该对扩展开放, 对修改关闭
  • 用抽象构建框架, 用实现扩展实现
  • 优点: 提供软件系统的可复用性及可维护性.

依赖倒置原则

  • 高层模块不应该依赖底层模块, 二者都应该依赖其抽象

  • 抽象不应该依赖细节, 细节应该依赖抽象.

  • 针对接口编程, 不要针对实现编程.

  • 优点: 可以减少类间的耦合性, 提高系统稳定性, 提高代码可读性和可维护性, 可减低修改程序所造成的风险

单一职责原则

  • 不要存在多于一个导致类变更的原因

  • 一个类/ 接口/ 方法只负责一项职责

  • 优点: 降低类的复杂度, 提高类的可读性, 提高系统的可维护性, 降低变更引起的风险

接口隔离原则

  • 用多个专门的接口, 而不使用单一的总接口, 客户端不应该依赖它不需要的接口

  • 一个类对另一个类的依赖应该建立在最小的接口上

  • 建立单一接口, 不要建立庞大臃肿的接口

  • 尽量细化接口, 接口中的方法尽量少

  • 注意适度原则, 一定要适度

  • 提高内聚, 尽量减少对外的交互

  • 优点: 符合我们常说的高内聚低耦合的设计思想, 从而使得类具有很好的可读性, 可扩展性和可维护性.

迪米特原则(最少知道原则)

  • 一个对象应该对其他对象保持最少的了解, 又叫最少知道原则

  • 尽量降低类和类之间的耦合

  • 强调只和朋友交流, 不和陌生人说话.

  • 朋友: 出现在成员变量, 方法的输入/输出参数中的类称为成员朋友类, 而出现在方法体内部的类不属于朋友类.

  • 优点: 降低类之间的耦合

合成/复用原则

  • 尽量使用组合,尽量不要使用继承

  • 组合
    由于组合可以将已有的对象纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能

  • 优点
    新对象存取成分对象的唯一方法是通过成分对象的接口。
    这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。
    这种复用支持包装。
    这种复用所需要的依赖较少。
    每一个新的类可以将焦点集中到一个任务上。
    这种复用可以在运行时间动态进行,新对象可以动态的引用与成分对象类型相同的对象。

  • 缺点
    就是用组合复用建造的系统会有较多的对象需要管理。

  • 继承
    组合几乎可以用到任何环境中去,但是继承只能用到一些环境中。

  • 继承复用通过扩展一个已有对象的实现来得到新的功能,基类明显的捕获共同的属性和方法,而子类通过增加新的属性和方法来扩展超类的实现。

优点:
新的实现比较容易,因为基类的大部分功能都可以通过继承自动的进入子类。
修改或扩展继承而来的实现较为容易。

  • 缺点:
    继承复用破坏了包装,因为继承超类的的实现细节暴露给子类。由于超类的内部细节常常对子类是透明的,因此这种复用是透明的复用,又称“白箱”复用。
    如果超类的实现发生改变,那么子类的实现也不得不发生改变。因此,当一个基类发生改变时,这种改变就会像水中投入石子引起的水波一样,将变化一圈又一圈的传导到一级又一级的子类,使设计师不得不相应地改变这些子类,以适应超类的变化。

从超类继承而来的实现是静态的,不可能在运行时间内发生改变,因此没有足够的灵活性。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值