面向对象 (OO) 范式的形成源于新编程方法的最初概念,而对设计和分析方法的兴趣则要晚得多。OO分析和设计范式是OO编程语言被广泛采用的逻辑结果。
- 第一种面向对象的语言是 Simula(真实系统模拟),由挪威计算中心的研究人员于 1960
年开发。
- 1970 年,Alan Kay 和他在 Xerox PARC 的研究小组创建了一台名为 Dynabook
的个人计算机和第一个纯面向对象的编程语言 (OOPL) - Smalltalk,用于对 Dynabook
进行编程。
- 在 1980 年代,Grady Booch 发表了一篇题为《面向对象的设计》的论文,主要介绍了编程语言
Ada 的设计。在随后的版本中,他将自己的想法扩展到了完整的面向对象设计方法。
- 在 1990 年代,Coad 将行为思想融入到面向对象的方法中。
其他重要的创新是 James Rum Baugh 的对象建模技术 (OMT) 和 Ivar
Jacobson 的面向对象软件工程 (OOSE)。
OO 范式简介
面向对象范式是开发任何软件的重要方法。大多数体系结构样式或模式(如管道和筛选器、数据存储库和基于组件)都可以使用此范例来实现。
面向对象系统的基本概念和术语 -
对象
对象是面向对象环境中的真实世界元素,可能具有物理或概念存在。每个对象都有 -
- 将其与系统中的其他对象区分开来的标识。
- 确定对象的特征属性以及对象所包含的属性值的状态。
- 表示对象在其状态变化方面执行的外部可见活动的行为。
可以根据应用程序的需要对对象进行建模。一个物体可能有物理存在,比如客户、汽车等;或无形的概念存在,如项目、过程等。
类
类表示具有相同特征属性的对象的集合,这些对象表现出共同的行为。它提供了蓝图或可从中创建的对象的描述。将对象创建为类的成员称为实例化。因此,对象是类的实例。
一个类的组成部分是 -
- 要从类实例化的对象的一组属性。通常,类的不同对象在属性值上存在一些差异。属性通常称为类数据。
- 描述类对象行为的一组操作。操作也称为函数或方法。
例
让我们考虑一个简单的类 Circle,它表示二维空间中的几何图形圆。此类的属性可以标识如下:
- x–coord,表示中心的 x 坐标
- y-coord,表示中心的 y 坐标
- a,表示圆的半径
它的一些操作可以定义如下:
- findArea(),一种计算面积的方法
- findCircumference(),一种计算周长的方法
- scale(),一种增加或减少半径的方法
封装
封装是在类中将属性和方法绑定在一起的过程。通过封装,可以从外部隐藏类的内部细节。它只允许通过类提供的接口从外部访问类的元素。
多态性
多态性最初是一个希腊词,意思是采取多种形式的能力。在面向对象范式中,多态性意味着以不同的方式使用操作,具体取决于它们所操作的实例。多态性允许具有不同内部结构的对象具有通用的外部接口。多态性在实现继承时特别有效。
例
让我们考虑两个类,Circle 和 Square,每个类都有一个方法 findArea()。尽管类中方法的名称和用途相同,但内部实现(即计算面积的过程)对于每个类都是不同的。当
Circle 类的对象调用其 findArea() 方法时,该操作会查找圆的面积,而不会与
Square 类的 findArea() 方法发生任何冲突。
关系
为了描述一个系统,必须提供系统的动态(行为)和静态(逻辑)规范。动态规范描述了对象之间的关系,例如消息传递。静态规范描述了类之间的关系,例如聚合、关联和继承。
消息传递
任何应用程序都需要许多对象以和谐的方式进行交互。系统中的对象可以使用消息传递相互通信。假设一个系统有两个对象
- obj1 和 obj2。如果 obj1 希望 obj2 执行其方法之一,则对象 obj1
向对象 obj2 发送消息。
组合或聚合
聚合或组合是类之间的一种关系,通过这种关系,一个类可以由其他类的对象的任意组合组成。它允许将对象直接放置在其他类的主体中。聚合被称为“部分”或“具有”关系,能够从整体导航到其部分。聚合对象是由一个或多个其他对象组成的对象。
协会
关联是一组具有共同结构和共同行为的链接。关联描述一个或多个类的对象之间的关系。链接可以定义为关联的实例。关联的程度表示连接中涉及的类数。学位可以是一元的、二元的或三元的。
- 一元关系连接同一类的对象。
- 二进制关系连接两个类的对象。
- 三元关系连接三个或更多类的对象。
遗产
它是一种机制,允许通过扩展和完善其功能从现有类中创建新类。现有类称为基类/父类/超类,新类称为派生类/子类/子类。
子类可以继承或派生超类的属性和方法,前提是超类允许这样做。此外,子类可以添加自己的属性和方法,并可以修改任何超类方法。继承定义了“是-a”关系。
例
从哺乳动物类中,可以派生出许多类,例如人类、猫、狗、牛等。人类、猫、狗和牛都具有哺乳动物的独特特征。此外,每个都有其独特的特点。可以说,牛“是——一种”哺乳动物。
OO分析
在软件开发的面向对象分析阶段,确定系统需求,确定类,并确认类之间的关系。面向对象分析的目的是了解系统的应用领域和具体要求。此阶段的结果是需求规范和对逻辑结构和系统可行性的初步分析。
相互结合用于面向对象分析的三种分析技术是对象建模、动态建模和功能建模。
对象建模
对象建模根据对象来开发软件系统的静态结构。它标识对象、对象可以分组到的类以及对象之间的关系。它还标识了表征每个类的主要属性和操作。
对象建模的过程可以通过以下步骤进行可视化:
- 识别对象并分组到类中
- 确定类之间的关系
- 创建用户对象模型关系图
- 定义用户对象属性
- 定义应对类执行的操作
动态建模
在分析了系统的静态行为之后,需要检查其与时间和外部变化有关的行为。这就是动态建模的目的。
动态建模可以定义为“一种描述单个对象如何响应事件的方式,这些事件可以是由其他对象触发的内部事件,也可以是由外部世界触发的外部事件。
动态建模的过程可以通过以下步骤进行可视化:
- 识别每个对象的状态
- 识别事件并分析操作的适用性
- 构建动态模型图,由状态转换图组成
- 根据对象属性表示每种状态
- 验证绘制的状态转换图
功能建模
函数建模是面向对象分析的最后一个组成部分。函数模型显示对象中执行的过程,以及数据在方法之间移动时的变化方式。它指定对象建模操作的含义和动态建模的操作。功能模型对应于传统结构化分析的数据流图。
功能建模的过程可以通过以下步骤进行可视化:
- 识别所有输入和输出
- 构建显示功能依赖关系的数据流图
- 说明每个函数的用途
- 确定约束条件
- 指定优化条件
面向对象设计
在分析阶段之后,使用面向对象设计 (OOD) 将概念模型进一步开发为面向对象的模型。在 OOD
中,分析模型中与技术无关的概念被映射到实现类上,识别约束,并设计接口,从而生成解决方案域的模型。面向对象设计的主要目的是开发系统的结构架构。
面向对象设计的阶段可以确定为:
- 定义系统的上下文
- 设计系统架构
- 识别系统中的对象
- 设计模型的构建
- 对象接口规范
面向对象设计可以分为两个阶段——概念设计和详细设计。
概念设计
在此阶段,将确定构建系统所需的所有类。此外,还为每个班级分配了特定的职责。类图用于阐明类之间的关系,交互图用于显示事件的流程。它也被称为高级设计。
详细设计
在此阶段,属性和操作根据交互图分配给每个类。开发了状态机图来描述设计的更多细节。它也被称为低级设计。
设计原则
以下是主要的设计原则 -
解耦原理
维护具有一组高度相互依赖的类的系统是很困难的,因为对一个类的修改可能会导致其他类的级联更新。在面向对象设计中,可以通过引入新的类或继承来消除紧密耦合。
确保凝聚力
内聚类执行一组密切相关的功能。缺乏内聚意味着——一个类执行不相关的功能,尽管它不影响整个系统的运行。它使软件的整个结构难以管理、扩展、维护和更改。
开闭原理
根据这一原则,系统应该能够扩展以满足新的要求。不应因系统扩展而修改系统的现有实现和代码。此外,在开闭原则中必须遵循以下准则:
- 对于每个具体类,必须维护单独的接口和实现。
- 在多线程环境中,保持属性的私有性。
- 尽量减少全局变量和类变量的使用。
|