1
面向对象软件工程实践指南
1.2.2.2 2.2 面向对象分析、设计与实现
2.2 面向对象分析、设计与实现

2.2.1 面向对象分析

面向对象分析(object oriented analysis,OOA)是运用面向对象的方法进行需求分析,抽取和整理用户需求并建立应用领域的面向对象模型的过程。面向对象分析过程,首先是建模,通常需要建立四种形式的模型:对象(静态)模型、用例(功能)模型、动态行为模型和物理实现模型。这四种模型从不同的角度描述目标系统,相互补充,相互配合,使得人们对系统的认识更加全面。根据所解决的问题类型不同,各模型重要性也不同,其中对象模型是核心,是用例模型和动态行为模型的框架。

1)对象模型

对象模型是面向对象方法中最基础、最核心的模型。该模型主要考虑系统中对象的结构、属性与操作,以及对象之间关系的映射。该模型是对客观世界的对象和对象关系的静态描述,为建立用例模型和动态模型提供了实质性的框架。在UML中,对象模型常用类图和对象图来描述。

2)用例模型

用例模型一般从用户需求的角度来描述系统,指明系统应该做什么,描述数据在系统中的变换过程和系统的功能,是整个后续工作的基础,也是测试和验收的依据。在UML中,用例模型使用用例图来描述。

3)动态模型

在建立起对象模型之后,需要观察对象的动态行为。所有对象都有自己的生存周期。每个对象在生产周期的每个阶段都有特定的适合的运行规律和行为准则来规范其行为。动态模型可以借助顺序图、通信图、状态图或活动图进行建模。

4)物理模型

物理模型关注的是系统实现过程的建模,常用组件图和部署图表示静态物理实现模型,用交互图和状态图来描述动态实现模型。

2.2.2 面向对象设计

面向对象设计(object oriented design,OOD)是面向对象方法的核心阶段,它建立软件系统的模型。面向对象设计与面向对象分析的建模原则和方法相同,但是面向对象设计模型的抽象层次较低,包含了与具体实现有关的细节。面向对象设计的准则包含模块化、抽象、封装、弱耦合、强内聚和可重用等。

面向对象设计的主要任务是将分析模型转换为设计模型,设计的目标是提高生产效率、质量和可维护性,在面向分析的基础上,考虑如何实现系统。面向对象设计进一步细化为系统设计和对象设计。系统设计是针对整个系统的,主要包含系统高层结构设计、确定设计元素、确定任务管理策略、实现分布式机制、设计数据存储方案和设计UI界面六个方面。对象设计是对每个设计对象进行的详细设计,包含组成系统的类、子系统和接口、包等。

2.2.3 面向对象实现

面向对象实现(object oriented implementation,OOI)主要包含两项工作:面向对象编程(object oriented programming,OOP)和面向对象测试(object oriented testing,OOT)。

1)面向对象编程

面向对象编程首先遇到的问题是程序设计语言的选择。根据语言的功能和产生时间,代表性的面向对象编程语言如下:

(1)面向对象兴盛时期(1980—1990年):①Smalltalk80,纯面向对象语言;②C++,从C和Simula发展而来;③Eiffel,从Ada和Simula发展而来。

(2)框架的出现(1990—现在):①Visual Basic,简化了Windows应用的图像界面(GUI)开发;②Java,Oak的后续版本;③Python,面向对象的脚本语言;④J2EE,基于Java的企业级计算框架;⑤Visual C#,.NET框架下的Java的竞争者;⑥Visual Basic.NET,针对微软. NET框架的Visual Basic。

2)面向对象测试

完整的面向对象测试类型包括了面向对象分析测试、面向对象设计测试、面向对象编程测试、面向对象单元测试、面向对象集成测试和面向对象系统测试。

(1)面向对象分析测试。对于一个面向对象系统而言,对象是相对稳定的,关系是相对不稳定的。所以,面向对象分析的测试需要考虑对分析模型中对象、对象关系、对象属性和方法进行测试和确认。

(2)面向对象设计测试。面向对象设计是对面向对象分析的进一步细化和抽象。面向对象设计的测试需要考虑对设计模型中类、类的层次结构、类库进行测试和确认。

(3)面向对象编程测试。面向对象编程阶段是把功能的实现分布在类中。面向对象编程的测试忽略类的实现细则,主要集中在类功能的实现和相应的面向对象程序风格上,主要测试两个方面:数据成员是否满足数据封装的要求和类是否实现了要求的功能。

(4)面向对象单元测试。单元测试是指对类及其实例的测试。最小的可测试单位是封装的类或对象,类包含一组操作和属性,但在面向对象单元测试中,操作和属性作为整体进行测试。

(5)面向对象集成测试。面向对象系统的集成测试主要有两种策略:基于线程的测试和基于使用的测试。基于线程的测试一般应用回归测试,对系统的一个输入或事件所需要的一组类,每个线程被集成并分别测试。基于使用的测试,首先测试那些几乎不依赖其他类的独立类,在独立类测试完成之后,再测试依赖类,直到构造出完整系统。

(6)面向对象系统测试。通过单元测试和集成测试只能保证软件的功能得以实现,但不能保证实际运行时,是否满足用户的需求,因此,规范的系统测试是必要的。系统测试一般尽量搭建与用户实际使用环境相同的测试平台,检测软件是否能够完全再现问题空间。