OOAD - 面向对象原则

面向对象系统的原理

面向对象系统的概念框架基于对象模型。 面向对象系统中有两类元素 −

主要元素 − 主要意味着如果一个模型没有这些元素中的任何一个,它就不再是面向对象的。 四个主要要素是 −

  • 抽象
  • 封装
  • 模块化
  • 层次结构

次要元素 − 次要的意思是这些元素是有用的,但不是对象模型不可或缺的部分。 三个次要元素是 −

  • 类型
  • 并发
  • 持久性

抽象

抽象意味着关注 OOP 中元素或对象的基本特征,忽略其无关或偶然的属性。 基本特征与对象的使用环境相关。

Grady Booch 将抽象定义如下 −

"抽象表示一个对象的基本特征,这些特征将其与所有其他类型的对象区分开来,从而提供相对于观看者的视角而言清晰定义的概念边界。"

示例 − 当设计Student类时,会包含enrolment_number、name、course和address属性,而像pulse_rate和size_of_shoe这样的特征会被删除,因为它们与教育机构的角度无关。

封装

封装是将属性和方法在类中绑定在一起的过程。 通过封装,类的内部细节可以对外部隐藏。 该类具有提供用户界面的方法,通过该用户界面可以使用该类提供的服务。

模块化

模块化是将问题(程序)分解为一组模块以降低问题整体复杂度的过程。 Booch 将模块化定义为 −

"模块化是系统的属性,该系统已分解为一组内聚且松散耦合的模块。"

模块化与封装有着内在的联系。 模块化可以可视化为一种将封装的抽象映射到真实的物理模块的方式,这些模块在模块内具有高内聚性,并且模块间的交互或耦合较低。

层次结构

用 Grady Booch 的话来说,"层次结构是抽象的排名或排序"。 通过层次结构,系统可以由相互关联的子系统组成,子系统可以有自己的子系统,依此类推,直到达到最小级别的组件。 它采用"分而治之"的原则。 层次结构允许代码重用。

OOA 中的两种层次结构是 −

  • "IS-A"层次结构 − 它定义了继承中的层次关系,由此可以从超类派生出许多子类,这些子类又可以具有子类,依此类推。 例如,如果我们从 Flower 类派生出 Rose 类,我们可以说玫瑰是"一朵"花。

  • "PART–OF"层次结构 − 它定义了聚合中的层次关系,通过这种关系,一个类可以由其他类组成。 例如,花由萼片、花瓣、雄蕊和心皮组成。 可以说,花瓣是花的"一部分"。

类型

根据抽象数据类型的理论,类型是一组元素的表征。 在 OOP 中,类被可视化为具有不同于任何其他类型的属性的类型。 类型化是对象是单个类或类型的实例这一概念的强制执行。 它还强制规定不同类型的对象通常不能互换; 并且只有在绝对需要的情况下才能以非常有限的方式进行互换。

这两种类型是 −

  • 强类型 − 这里,在编译时检查对对象的操作,就像在编程语言 Eiffel 中一样。

  • 弱类型 − 在这里,消息可以发送到任何类。 仅在执行时检查操作,就像在编程语言 Smalltalk 中一样。

并发

操作系统中的并发允许同时执行多个任务或进程。 当系统中存在单个进程时,就称存在单个控制线程。 然而,大多数系统都有多个线程,有些是活动的,有些是等待CPU,有些是挂起的,有些是终止的。 具有多个 CPU 的系统本质上允许并发控制线程; 但在单 CPU 上运行的系统会使用适当的算法为线程提供公平的 CPU 时间,从而实现并发。

在面向对象的环境中,存在活动对象和非活动对象。 活动对象具有独立的控制线程,可以与其他对象的线程并发执行。 活动对象彼此同步以及与纯顺序对象同步。

持久性

对象占用一段内存空间并存在一段特定的时间。 在传统编程中,对象的生命周期通常是创建它的程序执行的生命周期。 在文件或数据库中,对象的生命周期比创建对象的过程的持续时间长。 即使对象的创建者不再存在,对象仍继续存在的这种属性称为持久性。