1.3 面向对象的开发方法
从20世纪80年代开始,面向对象技术得到了飞速的发展,业界也涌现了一系列面向对象的软件开发方法学,其中代表性的有Booch方法、Wirfs-Brock的责任驱动设计方法、Rambaugh的对象模型技术、Coad/Yourdon分析和设计方法、Jacobson的面向对象软件工程方法等。为了避免不同符号所引起的混乱,Booch、Rambaugh和Jacobson等共同参与制定了统一建模语言UML(Unified Modeling Language),采用统一的概念和符号来描述对象模型,支持软件开发的全过程。目前,UML已成为世界通用的面向对象的建模语言,适用于各种开发方法。
1.3.1 面向对象的分析
面向对象的分析(Object Oriented Analysis, OOA)就是运用面向对象的方法对目标系统进行分析和理解,找出描述问题域和系统责任所需要的对象,定义对象的基本框架(包括对象的属性、操作以及它们之间的关系),最后得到能够满足用户需求的系统分析模型。OOA主要有以下5项任务。
(1)识别问题域中的对象和类。通过对问题域和系统责任的深入分析,尽可能地找出与应用有关的对象和类,并从中筛选出真正有用的对象和类。
(2)确定结构。找出对象和类中存在的各种整体—部分结构和一般—特殊结构,并进一步确定这些结构组合而成的多重结构。
(3)确定主题。如果系统包含大量的对象和类,那么可划分出不同的应用主题域,并按照主题域对分析模型进行分解。
(4)定义属性。识别各个对象的属性,确定其名称、类型和限制,并在此基础上找出对象之间的实例连接。
(5)定义服务。识别各个对象所提供的服务,确定其名称、功能和使用约定,并在此基础上找出对象之间的消息连接。
OOA的结果是系统分析说明书,其中包括使用类图和对象图等描述的系统静态模型,使用例图、活动图和交互图等描述的系统动态模型,以及对象和类的规约描述。模型应尽量与问题域保持一致,而不考虑与目标系统实现有关的因素(如使用的编程语言、数据库平台和操作系统等)。
1.3.2 面向对象的设计
面向对象的设计(Object Oriented Design, OOD)是以系统分析模型为基础,运用面向对象的方法进行系统设计,解决与系统实现有关的一系列问题,最后得到符合具体实现条件的系统设计模型。OOD主要有以下4项任务。
(1)问题域设计。对问题域中的分析结果作进一步的细化、改进和增补,包括对模型中的对象和类、结构、属性、操作等进行组合和分解,并根据面向对象的设计原则增加必要的新元素类、属性和关系。这部分主要包括以下设计内容:
• 复用设计,即寻找可复用的类和设计模式,提高开发效率和质量。
• 考虑对象和类的共同特征,增加一般类以建立共同协议。
• 调整继承结构,如减少继承层次、将多继承转换为单继承、调整多态性等。
• 改进性能,如分解复杂类、合并通信频繁的类、减少并发类等。
• 调整关联关系,如将多元关联转换为二元关联、将多对多关联转换为一对多关联等。
• 调整和完善属性,包括确定属性的类型、初始值和可访问性等。
• 构造和优化算法。
(2)用户界面设计。对软件系统的用户进行分析,对用户界面的表现形式和交互方式进行设计。这部分主要包括以下设计内容:
• 用户分类。
• 人机交互场景描述。
• 系统命令的组织。
• 详细的输入和输出设计。
• 在需要时可增加用于人机交互的对象和类,并使用面向对象的方法对其进行设计。
(3)任务管理设计。当系统中存在多任务(进程)并发行为时,需要定义、选择和调整这些任务,从而简化系统的控制结构。这部分主要包括以下设计内容:
• 识别系统任务,包括事件驱动任务、时钟驱动任务、优先任务和关键任务等。
• 确定任务之间的通信机制。
• 任务的协调和控制。
(4)数据管理设计。识别系统需要存储的数据内容和结构,确定对这些数据的访问和管理方法。这部分主要包括以下设计内容:
• 数据的存储方式设计,目前主要有文件系统和数据库系统两种方式。
• 永久性类(Persistent Class)的存储设计,包括其用于存储管理的属性和操作设计。
• 永久性类之间关系的存储设计。
OOA和OOD之间不强调严格的阶段划分,设计模型是对分析模型的逐步细化,主要是在问题域和系统责任的分析基础上解决各种与实现有关的问题。OOA阶段一些不能确定的问题可以遗留到OOD阶段解决,开发过程中也允许存在反复和迭代。