- OOAD 教程
- OOAD - 首页
- OOAD - 面向对象范式
- OOAD - 面向对象模型
- OOAD - 面向对象系统
- 面向对象设计(OOAD) - 面向对象原则
- OOAD - 面向对象分析
- OOAD - 动态建模
- OOAD - 功能建模
- OOAD - UML分析模型
- OOAD - UML基本符号
- OOAD - UML结构图
- OOAD - UML行为图
- OOAD - 面向对象设计
- OOAD - 实现策略
- OOAD - 测试与质量保证
- OOAD 有用资源
- OOAD - 快速指南
- OOAD - 有用资源
面向对象设计(OOAD) - 面向对象原则
面向对象系统的原则
面向对象系统的概念框架基于对象模型。面向对象系统中存在两类元素:
主要元素 - 所谓主要元素是指,如果一个模型缺少任何一个这些元素,它就不再是面向对象的。四个主要元素是:
- 抽象
- 封装
- 模块化
- 层次结构
次要元素 - 所谓次要元素是指,这些元素很有用,但不是对象模型中不可或缺的部分。三个次要元素是:
- 类型化
- 并发
- 持久性
抽象
抽象意味着在面向对象编程中关注元素或对象的本质特征,忽略其无关或偶然的属性。本质特征是相对于对象使用环境而言的。
Grady Booch 对抽象的定义如下:
“抽象表示对象的本质特征,这些特征将其与所有其他类型的对象区分开来,从而相对于观察者的视角提供了清晰定义的概念边界。”
示例 - 当设计一个名为 Student 的类时,包含属性 enrolment_number、name、course 和 address,而排除诸如 pulse_rate 和 size_of_shoe 等特征,因为它们与教育机构的视角无关。
封装
封装是将属性和方法都绑定到一个类中的过程。通过封装,可以将类的内部细节隐藏在外部。类具有提供用户界面的方法,用户可以通过这些方法使用类提供的服务。
模块化
模块化是将问题(程序)分解成一组模块的过程,以降低问题的整体复杂性。Booch 将模块化定义为:
“模块化是系统的一个属性,它已被分解成一组内聚且松散耦合的模块。”
模块化与封装紧密相关。模块化可以被视为一种将封装的抽象映射到具有高内聚性和低模块间交互或耦合的实际物理模块的方式。
层次结构
用 Grady Booch 的话说,“层次结构是抽象的等级或排序”。通过层次结构,系统可以由相互关联的子系统组成,这些子系统可以拥有它们自己的子系统,以此类推,直到达到最小的级别组件。它使用了“分而治之”的原则。层次结构允许代码重用。
面向对象分析中的两种层次结构是:
“IS-A” 层次结构 - 它定义了继承中的层次关系,通过它可以从一个超类派生出多个子类,这些子类又可以有子类,以此类推。例如,如果我们从 Flower 类派生出一个 Rose 类,我们可以说玫瑰“是”花。
“PART-OF” 层次结构 - 它通过聚合定义层次关系,通过它一个类可以由其他类组成。例如,一朵花由萼片、花瓣、雄蕊和雌蕊组成。可以说花瓣是花的“一部分”。
类型化
根据抽象数据类型的理论,类型是一组元素的特征。在面向对象编程中,类被视为具有与任何其他类型不同的属性的类型。类型化是强制执行对象是单个类或类型的实例的概念。它还强制执行不同类型的对象通常不能互换;只有在绝对需要时,才能以非常有限的方式互换。
两种类型的类型化是:
强类型 - 在这里,对对象的运算在编译时进行检查,就像在 Eiffel 编程语言中一样。
弱类型 - 在这里,可以向任何类发送消息。运算只在运行时检查,就像在 Smalltalk 编程语言中一样。
并发
操作系统中的并发允许同时执行多个任务或进程。当系统中存在单个进程时,据说存在单个控制线程。但是,大多数系统都具有多个线程,有些处于活动状态,有些正在等待 CPU,有些处于挂起状态,有些已终止。具有多个 CPU 的系统固有地允许并发的控制线程;但是,在单个 CPU 上运行的系统使用适当的算法来为线程提供公平的 CPU 时间,从而实现并发。
在面向对象环境中,存在活动对象和非活动对象。活动对象具有独立的控制线程,可以与其他对象的线程并发执行。活动对象彼此同步,也与纯顺序对象同步。
持久性
对象占据内存空间并在特定时间段内存在。在传统编程中,对象的生存期通常是创建它的程序的执行生存期。在文件或数据库中,对象的生存期长于创建对象的进程的持续时间。对象即使在其创建者停止存在后继续存在,这个属性被称为持久性。