面向对象方法中需要做的两点:
- 封装类的职责,隐藏职责的实现
- 预计将会发生的变更,抽象它的接口,隐藏它的内部机制
封装类的职责
类的职责
什么是职责
- 类或对象维护一定的状态信息
- 基于状态履行行为职能的能力
按照信息隐藏的思想,一个模块应该通过稳定的接口对外表现其所承载的需求,而隐藏它对需求的内部实现细节。那么类就应该通过接口对外表现它直接和间接承载的需求,而隐藏类内部的构造机理,这恰恰是“封装”想要达到的
类的封装
封装通常有两方面的含义:
- 将数据和行为同时包含在类中:并不仅仅是简单将成员变量声明代码与方法代码拼接到一个类中,而是需要集中数据与行为
- 分离对外借口与内部实现:接口描述了类的职责,需要对外公布,供外界调用,以帮助系统满足最终需求。实现是类内部实现机制,不需要对外公开,外界也不应该知道它的具体细节。这样既不会影响到最终需求的满足(只需要接口抽象),又能帮助实现“分而治之”(不需要实现细节)的复杂度处理。
在面向对象中,接口通常描述以下几个内容:
- 对象之间交互的消息(方法名)
- 消息中的所有参数
- 消息返回结果的类型
- 与状态无关的不变量
- 需要处理的异常
封装实现的细节
- 封装数据和行为
- 封装内部结构
- 封装其他对象的引用
- 封装类型信息
- 封装潜在变更
为变更而设计
开闭原则
Open Close Principle, OCP
开闭原则的具体内容是:对扩展开放,对修改关闭
多态
多态是针对类型的语义限定,指的是不同类型的值能够通过统一的接口来操纵。表现为只需要不同类型的对象拥有统一定义的公共接口,就可以不论实际类型如何,直接调用该统一接口,这样系统就可以根据实际类型的不同表现出不同的行为。
严格来说,多态并不是非要有继承关系才会产生多态。
多态 | 一般性多态 | 子类型多态 |
---|---|---|
参数化多态 | ||
临时性多态 | 重载(overloading) | |
强制转换 |
依赖倒置原则
Dependency Inversion Principle, DIP
依赖倒置原则是指:
- 抽象不应该依赖于细节,细节应该依赖于抽象。因为抽象是稳定的,细节是不稳定的。
- 高层模块不应该依赖于底层模块,而是双方都依赖于抽象。因为抽象时稳定的,而高层模块和底层模块都可能是不稳定的。
DIP的实现
为满足需求,在类 B
需要依赖于类 A
的情况下:
- 如果
A
是抽象的,那么 “B 依赖于 A” 就是符合DIP的 - 如果
A
是具体的,那么 “B 依赖于 A” 就不符合DIP。这是的办法是为A建立抽象接口IA,然后使用B依赖IA、A实现IA,那么依赖关系将被倒置为 “B 依赖于 IA”、“A 依赖于 IA”,此时就是符合DIP的。
为具体类建立抽象接口并分离该接口是实现DIP的基本手段
Reference
- 南京大学软件学院2022春季学期《软件工程与计算二》