设计原则——开放封闭原则(Open Close Principle)

定义

开闭原则是对系统在面对变化时所表现的特征的描述:对于扩展是开放的(Open for extension),而对于修改是封闭的(Closed for modification1。它是一种现象的描述,所以可能改叫开闭特征(Open Close Characteristics)更恰当些。

原因

任何系统在其生命周期都会发生变化。如果系统中的一处改动产生了连锁反应,导致一系列相关模块的改动,那么设计就具有僵化性(Rigidity)2的臭味。OCP建议我们对系统进行重构,设计一种抽象隔离这种变化,这样以后再进行同样的改动时,就只需要添加新的代码,而不必改动已经正常运行的代码。

关键是抽象

实现开闭特征的关键是抽象.比如遵循依赖倒置原则(DIP):
+ 高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
+ 抽象不应该依赖于细节。细节应该依赖于抽象。

Strategy模式

上图展示了策略模式(Strategy Method)。Client需要实现一些功能,它可以用Client Interface去描绘那些功能,Client Interface的子类型可以以任何它们所选择的方式去实现这个接口。这样,就可以通过创建Client Interface的新的子类型的方式去扩展、更改Client中指定的行为。这种模式遵循了依赖倒置原则,实现了开闭特征。

隔离变化

一般而言,无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化,没有对于所有情况都贴切的模型。如果我们预测到了一种变化,就应该设计一种抽象来隔离它。

  • 只受一次愚弄
    为了防止出现不必要的复杂性的臭味,我们会允许自己被愚弄一次。这意味着在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发送的同类变化。简而言之,我们愿意被第一颗子弹击中,然后我们就会确保自己不再被同一只枪发射的其它任何子弹击中。

  • 刺激变化
    如果我们愿意接受第一颗子弹,那么子弹来到越早、越快就对我们越有利。因此我们需要刺激变化。

    • 测试驱动。一个可测试的系统通常已经建立了隔离许多变化的抽象。
    • 缩短迭代周期。——一个周期为几天而不是几周。
    • 在加入基础结构前就开发特性。持续将那些特性展示给涉众。
    • 首先开发最重要的特性。
    • 持续集成。

结论

满足开闭特性的系统可以带来OOP所声称的巨大好处(灵活性、可重用性以及可维护性)。然而,对于系统的每个部分都肆意地进行抽象同样不是个好主意。正确的做法是,应该仅对系统中呈现频繁变化的那些部分做出抽象。拒绝不成熟的抽象和抽象本身同样重要。


  1. 《敏捷软件开发:原则、模式与实践》
  2. 僵化性(Rigidity):很难对系统进行改动,因为每个改动都会迫使许多对系统其它部分的改动。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
六大设计原则是指面向对象设计中的六个重要原则,它们是: 1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起它变化的原因,即一个类应该只有一个职责。 2. 开放封闭原则Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即在不修改已有代码的情况下,通过扩展来实现新的功能。 3. 里氏替换原则(Liskov Substitution Principle,LSP):子类型必须能够替换掉它们的父类型。即在使用基类对象的地方,可以用其子类对象来替代,而不会影响程序的正确性。 4. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该依赖它不需要的接口。即一个类对另一个类的依赖应该建立在最小的接口上。 5. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖低层模块,二者都应该依赖于抽象。即要针对接口编程,而不是针对实现编程。 6. 迪米特法则(Law of Demeter,LoD):一个对象应该对其他对象有尽可能少的了解,即一个对象应该只与其直接的朋友通信,而不与陌生的对象通信。 依赖倒置原则是六大设计原则中的一项,它强调高层模块不应该依赖低层模块,二者都应该依赖于抽象。具体来说,依赖倒置原则要求: 1. 高层模块不应该直接依赖于低层模块的具体实现,而应该依赖于抽象接口。 2. 抽象接口应该由高层模块定义,低层模块去实现。 3. 通过依赖倒置,可以降低模块间的耦合度,提高代码的可维护性和可扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值