C++面向对象设计原则详解

概述

C++面向对象设计原则主要包括以下几点:

  • 依赖倒置原则
  • 开放封闭原则
  • 单一职责原则
  • 里氏替换原则
  • 接口隔离原则
  • 封装变化点原则
  • 面向接口编程原则
  • 优先使用对象组合,而不是类继承

接下来详细的分析每一项原则。

详细说明

依赖倒置原则

  • 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。
  • 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。

依赖倒置原则的核心思想是:依赖于抽象。

依赖一定会存在于类与类、模块与模块之间。当两个模块之间存在紧密的耦合关系时,最好的方法就是分离接口和实现:在依赖之间定义一个抽象的接口使得高层模块调用接口,而底层模块实现接口的定义,以此来有效控制耦合关系,达到依赖于抽象的设计目标。

开放封闭原则

  • 对扩展开放,对更改封闭。
  • 类模块应该是可扩展的,但是不可修改。

对扩展开放。意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭。意味着类一旦设计完成,就可以独立完成其工作,而不要对其进行任何尝试的修改。

需求总是在变化,用封闭开放原则来封闭变化满足需求,同时还能保持软件内部的封装体系稳定,不被需求的变化影响。

单一职责原则

  • 一个类应该仅有一个引起它变化的原因。
  • 变化的方向隐含着类的责任。

核心思想为:一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。

里氏替换原则

  • 子类必须能够替换它们的基类(IS-A)。
  • 继承表达类型抽象。

只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。在父类和子类的具体行为中,必须严格把握继承层次中的关系和特征,将基类替换为子类,程序的行为不会发生任何变化。

里氏替换原则能够保证系统具有良好的拓展性,同时实现基于多态的抽象机制,能够减少代码冗余,避免运行期的类型判别。

接口隔离原则

  • 不应强迫客户程序依赖它们不用的方法。
  • 接口应该小而完备。

核心思想是:使用多个小的专门的接口,而不要使用一个大的总接口。
具体而言,接口隔离原则体现在:接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。

分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。

封装变化点原则

寻找出变与不变的分割点,对二者封装,让设计者对单方面修改时不会影响到另一面。实现层次间的松耦合。

面向接口编程原则

不将变量类型声明为某个特定的具体类,而是声明为某个接口。
客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
减少系统中各部分的依赖关系,从而实现高内聚、松耦合的类型设计方案。

优先使用对象组合,而不是类继承

在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。

  • 继承复用:实现简单,易于扩展。破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 )

  • 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用 )

继承在某种程度上破坏了封装性,子类父类耦合度高。
对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。

你可能感兴趣的:(C++,And,C)