面向对象的信息隐藏

面向对象方法中需要做的两点:

  1. 封装类的职责,隐藏职责的实现
  2. 预计将会发生的变更,抽象它的接口,隐藏它的内部机制

封装类的职责

类的职责

什么是职责

  1. 类或对象维护一定的状态信息
  2. 基于状态履行行为职能的能力

按照信息隐藏的思想,一个模块应该通过稳定的接口对外表现其所承载的需求,而隐藏它对需求的内部实现细节。那么类就应该通过接口对外表现它直接和间接承载的需求,而隐藏类内部的构造机理,这恰恰是“封装”想要达到的

类的封装

封装通常有两方面的含义:

  1. 将数据和行为同时包含在类中:并不仅仅是简单将成员变量声明代码与方法代码拼接到一个类中,而是需要集中数据与行为
  2. 分离对外借口与内部实现:接口描述了类的职责,需要对外公布,供外界调用,以帮助系统满足最终需求。实现是类内部实现机制,不需要对外公开,外界也不应该知道它的具体细节。这样既不会影响到最终需求的满足(只需要接口抽象),又能帮助实现“分而治之”(不需要实现细节)的复杂度处理。

在面向对象中,接口通常描述以下几个内容:

  1. 对象之间交互的消息(方法名)
  2. 消息中的所有参数
  3. 消息返回结果的类型
  4. 与状态无关的不变量
  5. 需要处理的异常

封装实现的细节

  1. 封装数据和行为
  2. 封装内部结构
  3. 封装其他对象的引用
  4. 封装类型信息
  5. 封装潜在变更

为变更而设计

开闭原则

Open Close Principle, OCP

开闭原则的具体内容是:对扩展开放,对修改关闭

多态

多态是针对类型的语义限定,指的是不同类型的值能够通过统一的接口来操纵。表现为只需要不同类型的对象拥有统一定义的公共接口,就可以不论实际类型如何,直接调用该统一接口,这样系统就可以根据实际类型的不同表现出不同的行为。

严格来说,多态并不是非要有继承关系才会产生多态。

多态 一般性多态 子类型多态
参数化多态
临时性多态 重载(overloading)
强制转换

依赖倒置原则

Dependency Inversion Principle, DIP

依赖倒置原则是指:

  1. 抽象不应该依赖于细节,细节应该依赖于抽象。因为抽象是稳定的,细节是不稳定的。
  2. 高层模块不应该依赖于底层模块,而是双方都依赖于抽象。因为抽象时稳定的,而高层模块和底层模块都可能是不稳定的。

DIP的实现

为满足需求,在类 B 需要依赖于类 A 的情况下:

  1. 如果 A 是抽象的,那么 “B 依赖于 A” 就是符合DIP的
  2. 如果 A 是具体的,那么 “B 依赖于 A” 就不符合DIP。这是的办法是为A建立抽象接口IA,然后使用B依赖IA、A实现IA,那么依赖关系将被倒置为 “B 依赖于 IA”、“A 依赖于 IA”,此时就是符合DIP的。

为具体类建立抽象接口并分离该接口是实现DIP的基本手段

Reference

  1. 南京大学软件学院2022春季学期《软件工程与计算二》
文章作者: ZY
文章链接: https://zyinnju.com/2022/06/16/面向对象的信息隐藏/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ZY in NJU