第8章面向对象分析

Download Report

Transcript 第8章面向对象分析

第8章
面向对象分析
第8章 面向对象分析
8.1 面向对象方法概述
8.2 迭代开发过程
8.3 用例模型
8.4 分析模型
习题8
第8章
面向对象分析
8.1 面向对象方法概述
本节主要介绍面向对象方法的由来、基本概念和
特点,简要介绍统一建模语言。
8.1.1 引例
设想一个餐馆对外提供顾客就餐的服务,使用结
构化方法来对该餐馆主要业务建模。
图8.1 就餐服务的模块结构图。
图8.2 餐馆业务静态模型(类图)
图8.3 餐馆业务动态模型(顺序图)
第8章
面向对象分析
在理解基本需求之后,面向对象方法把分析设计焦点放在执
行操作的对象以及对象间的协作下。
从系统的观点出发,可以给对象作如下定义:对象是系统中
用来描述客观事物的一个实体,它是构成系统的一个基本单位,
一个对象是由一组属性和对这组属性进行操作的一组服务构成的。
对象的属性可以是简单数据类型、结构数据类型,也可以是
复杂数据类型(另一个对象)。例如,公司是对象,公司中包含有
员工这一属性,而员工本身又是一个对象。
发现信息系统中的对象是一项具有挑战性的任务,把它们设
计成为计算机世界中的包含数据和行为的软件对象,更需要长期
经验的积累才能熟练掌握。
第8章
面向对象分析
8.1.2 面向对象方法的发展
1、面向对象编程(OOP):20世纪70年代末至80年代初,计算机应
用领域日渐扩大,系统软件和应用软件的需求日益多样化,系统
规模日益膨胀,传统的结构化分析方法和面向过程的编程技术已
无法给予有效的支持,导致软件的生产方式和效率远远赶不上信
息化社会发展的需要。人们开始寻找和研究新的方法和技术,面
向对象方法和技术应运而生。
面向对象(OO,Obeject Orient)方法和技术起源于面向对象的
程序设计语言(OOPL)。20世纪80年代以来,出现了大批OOPL,
其实用性、效率不断提高,OO技术开始走向繁荣和实用化。
第8章
面向对象分析
2 、面向对象设计(OOD)
面向对象的设计与结构化设计一样要解决“怎么
做”的问题,关注的都是解空间的解决方案。不同的
是面向对象的设计过程强调的是定义软件对象(类)
和这些软件对象如何协作来满足需求,设计模型用类
的属性和操作来描述对象的数据结构和功能。
3、面向对象分析(OOA)
面向对象分析就是直接将问题域中客观存在的事
物或概念识别为对象建立分析模型,用对象的属性和
服务分别描述事物的静态特征和行为,并且保留问题
域中事物之间的原貌。
第8章
面向对象分析
面向对象方法适合于解决分析与设计期间的复杂性,实现分
析与设计的复用。从20世纪80年代中期开始,面向对象技术的焦
点逐渐从程序设计转移到软件工程的其他阶段,面向对象分析与
设计(OOA和OOD)技术得到了快速的发展,初步形成新的方法论
和开发技术。
合理的软件开发过程是OOA—OOD—OOP,在OOA和OOD
阶段对系统需要设立的每个对象类及其内部构成与相互关系都达
到透彻的认识,并建立清晰的模型;OOP只是在选定的语言环境
下使用具体的数据结构来定义对象的属性,编写具体的语句来实
现有关算法。
第8章
8.1.3
面向对象分析
面向对象方法的主要概念
1、对象:对象是一些属性及专用服务的封装体,它是问
题空间中一些事物的抽象。
 对象就是我们在问题空间中要考虑的那些人或事物,
它具有一组属性和一组操作。这些属性的值刻画了一
个对象的状态;这些操作是对象的行为(即服务),
通过它们改变对象的状态(即属性值)。
 对象自然而又灵活地模拟现实世界,这使我们能更准
确地描述世界。
 系统中的对象,在生命周期的不同阶段有不同的表示
形式。
第8章
面向对象分析
描述对象行为的几个概念:服务、操作、方法。
服务的概念一般用在分析阶段;操作是指为实现某些
行为的算法抽象,这些算法对外以函数接口的方式提
供,操作一般用于设计阶段;而方法通常重于算法的
具体实现,一般用于详细设计和编程阶段。
第8章
面向对象分析
2、类
类也称为对象类:具有相同属性和服务的一组对
象的集合,它为属于该类的全部对象提供了统一的抽
象描述,包括对所有属性和操作的声明。
 类是用来创造对象的模板。
 面向对象程序设计语言还支持两种特殊的类:抽象类
和接口。
一个类中没有包含足够的信息来描绘一个具体的
对象,为样的类就是抽象类。抽象类是不能够被实例
化的,一般利用继承机制来使用抽象类。
接口是抽象类的变体。接口是一些方法的集合,
但所有方法都是抽象的,只有声明而没有程序体。
第8章
面向对象分析
3、封装
封装是软件模块化思想的体现,也是面向对象方法的一个重要
原则。封装实现了信息隐藏:封装从字面上看, 就是将某件事物
包围起来, 使外界不必知道实际内容。 每个对象都把状态和行为
(Behavior)封装在一起。 对象的状态是该对象属性值的集合,
而对象的行为是在对象状态上操作的方法的集合。
(1)首先,当设计一个系统的总体结构时,系统的每个成分应该封
装或隐蔽为一个独立的模块。
(2)其次,封装表现在对象概念上。对象是一个很好的封装体,它
把数据和服务封装于一个内在的整体。
(3)封装遵循了人们使用对象的一般心理,因此在信息系统的开发
中能贴切地反映事物的真实面貌,对于软件维护和分工管理非常
有利。
第8章
面向对象分析
4、消息
在面向对象技术中,消息是对象之间交互、通信
的手段,是外界能够引用对象操作及获取对象状态的
惟一方式。 这个特征保证了对象的实现只依赖于它本
身的状态和所能接受的消息, 而不依赖于其他对象。
人不是生活在真空中的, 总是要和其他人交往, 请求
(invoke)他人帮助解决一些问题。 这里的“请求”
便是一个人与其他人进行交往的手段。 在面向对象技
术的专业术语中, 将这些请求称之为“消息”。日常
生活中不仅有请求,而且还会有命令,命令也是一种
消息。
第8章
面向对象分析
5、继承和多态性
继承是指特殊类的对象拥有其一般类的全部属性
与服务。特殊类在继承一个一般类的语义性质外,还
有自己特有的属性和操作。继承一个单一的父类叫单
继承;如果有两个及两个以上的父类则是多继承。
在软件开发中使用继承可以明显带来两个方面的好处:
(1)可以简化系统的描述和实现;
(2)直接实现了软件重用,提高软件开发效率。
第8章
面向对象分析
多态性(多形性):指相同的操作(函数或过程)
可作用于多种类型的对象并获得不同的结果。在OOP
中多态的实现有两种方法:
(1)由覆盖实现动态多态,子类对父类的方法进行重写,
称为运行时多态,是父类和多个子类的多态性。
(2)由重载实现的静态多态,即利用重载技术在一个类
中定义多个名称相同、参数类型不同的方法,称为编
译时多态,是一个类中多态性的表现。
第8章
面向对象分析
多态性是一种依赖于抽象的设计,需要建立在继
承机制之上。有两个显著的优点:
 当给不同子类型的对象发送相同的消息时,消息的发
送者可以不用关心具体的对象类型,而由对象自身做
出不同的响应处理。
 需要扩充一种新类型时,只需要从父类中再派生出一
个子类,覆盖父类的某些服务,而不需要改动其他外
部程序。
总之,多态性极大地提高了重用性和灵活性,对
象的使用和理解也得以简化。
第8章
面向对象分析
6、关系:一个问题域中会出现多种对象,它们相互存在
的联系就是关系。
 类关系存在于两个类之间,或者类和接口之间,前者
是继承关系,后者是实现关系。
(1)继承/泛化关系:对象分类的层次关系,继承关系对
于类中的所有对象都成立,而不特指某个具体对象。
(2)实现关系:一个接口可以提供某些操作的描述,另
一些类需要具体来完成这些操作,即对接口进行实现。
第8章
面向对象分析
 对象关系则是存在于两个或两个以上对象之间的联系,
这种联系分为静态联系(关联)和动态联系(依赖)。
(1)关联:表达对象与对象的静态联系,是一种长期关
系。
(2)依赖:表达对象与对象的动态联系,是一种短期关
系。
以上四种联系方式在具体编程时都有有使用,如果
能在分析和设计时就考虑清楚,并能表达出来,那么
后续工作会更清晰,而又具有连贯性。
第8章
面向对象分析
8.1.4 面向对象方法的优势
1、 对问题空间的理解更直接,更符合人们认识客观事物的
思维规律。
在面向对象分析中,可以将问题空间直接映射到模
型。
2、系统分析和系统设计使用同一模型,不存在过渡困难。
结构化方法的主要困难是从分析过渡到设计有双重
负担,一是构造方法的转换,一是添加实施细节。
第8章
面向对象分析
3、开发出来的信息系统从本质上具有更强的生命力
面向对象方法使代表共性的对象稳定下来,而把不
稳定的东西隐藏起来,这样可避免增加复杂性,系统
对环境的适应和应变能力也随之增强。
4、易于扩充和维护
面向对象方法中的类是更理想的模块机制,其封装
性好,类对外的接口设计好之后,内部的修改不会影
响到其他类,可重用性高;而且在有较大的修改或扩
充时,利用多态性的优势,可以在原有类的基础上通
过继承机制派生出新类来实现,大大降低了工作量,
提高了系统的可维护性和可扩充性。
第8章
面向对象分析
8.1.5 统一建模语言
1、什么是UML
20世纪90年代中后期,面向对象领域的专家学者
联合创造了一种通用的建模语言,并成为了国际标准,
即UML。
2、UML的主要内容:由视图、图、模型元素和通用机
制等几部分组成。
视图表示系统的各个方面,由多个图构成。
每个图使用了多个模型元素。
通用机制为图做进一步补充说明,如注释、元素的语义
说明。
第8章
面向对象分析
UML定义了以下几种视图,从不同角度反映系统:
(1)用例视图:描述系统的功能需求,是最终用户、分析
人员和测试人员看到的系统行为。
(2)逻辑视图:描述系统的基本逻辑结构,是问题的逻辑
解决方案展示对象和类是如何组成系统、实现系统行为的。
(3)进程视图:用于描述系统性能、可伸缩性和吞吐量的
设计。
(4)实现视图:用于描述系统组装和配置管理、表达软件
成分的组织结构。
(5)部署视图:描述组成物理系统的部件的分布、交付和
安装,包含形成系统硬件拓扑结构的结点。
一般在分析与设计过程中至少应该产生用例图、类图和顺
序图。
第8章
面向对象分析
8.2 迭代开发过程
本节介绍迭代开发过程的基本思想和迭代过程模型。
8.2.1 什么是迭代过程
迭代过程:根据系统功能子集而不是软件开发活
动将项目分解为多个迭代周期,每个迭代周期内完成
需求定义、分析、设计、实现等活动,能够生产出经
过测试和集成的、可执行的系统子集。
目前最有影响力的迭代过程模型是统一过程和敏
捷过程。
第8章
面向对象分析
8.2.2 Rational统一过程
Rational统一过程简称RUP,使用UML来制定软件系统的所有
模型,其突出特点表现在三个方面:用例驱动,以架构为中心,
迭代和增量。
1、用例驱动:用例驱动表明开发过程是沿着用例展开的一系列工作
流前进的。
2、以构架为中心:软件构架的作用是从各个不同角度刻画系统的整
体轮廓。在RUP中,构架表示为系统中所有模型的不同视图这些
视图表示整个系统。
3、迭代和增量:将一个项目划分为较小的袖珍项目,每个袖珍项目
都是一次能够产生一个增量的迭代过程,都必须按照计划好的步
骤有选择地执行。
RUP是一个完整的开发过程框架,并没有具体的过程实例,
实际应用时应该进行适当裁减,以适合具体项目和开发小组实施。
第8章
面向对象分析
8.2.3 敏捷开发过程
敏捷过程是一系列轻量的过程模型的总称,它们
致力于在无过程和过于繁琐的过程中达到一种平衡,
使得能以不多的步骤过程获取较满意的结果。
敏捷过程也建立在迭代的基础上,倾向于使用较
短的迭代周期,通常是一个月或更短。
敏捷过程有很多代表模型,其中以极限编程最完
美也最有代表性。主要做法和原则如下:
(1)客户作为团队成员
(2)使用用户素材。用户素材就是和用户进行的关于需
求谈话的记录,用来获取对需求的理解,也可以用于
估算和计划。
第8章
面向对象分析
(3)短期交付。每次迭代中根据优先级别和依赖顺序来
选择实现一些用户素材,迭代结束时演示所生成的系统,
以得到相关人员的反馈。
(4)验收测试。
(5)结对编程。
(6)测试驱动开发。
(7)集体所有权。
(8)持续集成。每天会进行多次系统构建,构建后完成
所有的测试。
(9)设计简单。
(10)重构。对代码进行一系列小的改造。
第8章
面向对象分析
8.3
用例模型
面向对象分析的基本任务是:运用面向对象方法,
对问题域(即待开发系统的应用领域)和系统责任(即
所开发系统应具备的职能)进行分析和理解,正确认识
其中的事物及它们之间的关系,找出描述问题域及系统
责任所需的类和对象,定义它们的属性与服务,以及它
们之间所形成的结构、静态联系和动态联系。最终产生
一个符合用户需求,并能直接反映问题域和系统责任的
OOA模型及其详细说明。
第8章
面向对象分析
8.3.1
系统需求
1、功能性需求:描述系统预期应提供的功能或服务,包
括系统需要哪些输入、对输入作出什么反应以及对系
统具体行为的描述。
2、非功能性需求:指那些除功能以外的系统性能和系统
特性的需求,包括可用性、可靠性、响应时间、吞吐
率、可移植性等。
需求来源于用户,但并不是所有用户都能清晰地
表达出全部需求。在大多数情况下,以下一些步骤都
是可行的:
第8章
面向对象分析
(1)列举出候选需求 。候选需求可能被选择立即
或将来实现,候选需求一旦进行定义并成为正式
需求,就从清单中移除。
(2)理解系统的语境。系统分析人员需要了解用
户业务模型。业务模型详细说明了系统将支持哪
些业务过程,通过业务过程可以确定完成该过程
需要哪些工作人员、他们的职责以及他们要执行
的操作。
(3)捕获功能性需求。在理解系统语境之后,收
集所有人员和系统可能的交互,就能提取系统功
能性需求。
(4)捕获非功能性需求。非功能性需求为功能性
需求增加了一些条件。
第8章
面向对象分析
8.3.2
用例
在面向对象方法中,通过用例描述系统需求。全
部的用例构成系统的用例模型。用例模型完整描述了
系统对外可见的行为。用例和用例模型意义:
(1)用例是对系统需求的规范化的描述,用例模型是面
向对象分析的关键输入。
(2)用例图及用例的事件流描述集中体现了系统责任。
(3)通过用例建立交互图。
建立用例建模涉及三个主要步骤:确定参与者,
确定用例,描述每个用例。
第8章
面向对象分析
1、确定参与者
(1)确定谁是参与者:参与者是系统之外与系统进行交
互的任何事物,在UML中采用小人符号来表示。参与
者可以是使用系统的用户,可以是其他外部系统、外
部设备等外部实体。
(2)主要参与者和次要参与者:主要参与者是从系统中
直接获得可度量价值的用户。次要参与者的需求驱动
了用例所表示的行为或功能,在用例中起支持作用,
帮助主要参与者完成他们的工作,不能脱离主要参与
者而存在。
(3)参与者的泛化:参与者的角色可以共享,即一种角
色可以拥有另一种角色的全部行为。
第8章
面向对象分析
2、确定用例
用例就是需求,通过用例名称可以表达系统完成
的工作。
确定用例的过程中,第一,不能混淆用例和用例
所包含的步骤。第二,注意区分业务用例和系统用例。
第8章
面向对象分析
8.3.3 用例的描述
虽然UML定义了用例图来描述用例、参与者及
它们间的关系,但用例最主要的内容是文本(用例
体),而不是图表(用例图)。
1、前置备件和后置条件
(1)前置条件:表述在系统允许用例开始以前,系统
应确保为真的条件。
(2)后置条件:表述在用例结束时,系统将要保证的
限定条件,一般都是在成功完成用例后成立。
第8章
面向对象分析
2、主事件流:主事件流是指能够满足目标的典型的
成功路径。主事件流通常不包括任何条件和分支,符
合大多数人员的期望,从而更容易理解和扩展。
3、备选事件流:备选事件流还可以分为正常可选事
件流和错误异常事件流。
4、事件流的书写准则
(1)使用简单的语法,主语明确,语义易于理解;
(2)使用主动语态,主语是参与者或系统,读者能
直观地了解究竟是谁在施行这一步骤;
(3)从第三者的角度来编写,指出参与者的动作,
以及系统的响应。
第8章
面向对象分析
(4)描述用户意图和系统职责,而不叙述具体的行
为和技术细节,特别是有关用户界面的细节。
(5)主事件流使用“确认”、“验证”等积极词汇。
5、非功能性需求:与用例有关的非功能性需求,可
以将它们和用例记录在一起。
第8章
面向对象分析
8.3.4 建立用例的关系
扩展和包含关系是用例模型中消除冗余的一种手段。
1、包含关系:经过封装后可以在各种不同的基本用例中
复用的行为称为包含用例。基本用例可以控制包含用例,
并要使用包含用例所得到的结果,如果缺少了包含用例,
基本用例的功能就是不完整的。
2、扩展关系:表达某些可选或只在特定条件下才执行的
系统行为的用例,称为扩展用例。
3、泛化关系:用一个新的、通常也是抽象的父用例来描
述这些共有部分,该用例随后被子用例特殊化,子用例
继承父用例的所有结构、行为和关系。
第8章
面向对象分析
8.3.5 用例模型
一个较为复杂的系统会有较多的用例,为便于理
解,可以为它们建立多张用例图。更为复杂的情况将
导致所有用例难以维持一种平面结构,这时可以对用
例进行分组。UML2.0中按用例主题划分用例组,一组
用例放置在以主题命名的方框中,类似于系统边界。
每个主题中可以含多个用例。
第8章
面向对象分析
8.4 分析模型
分析模型描述系统的基本逻辑结构,展示对象和类如何组成系
统(静态模型),以及它们如何保持通信实现系统行为(动态模型)。
为了使模型独立于具体的开发语言,需要使用一些面向对象分
析与设计技术,帮助人们把注意力集中在概念性问题而不是软件技术
问题上。这些技术的起始点就是领域模型。
8.4.1 从需求到分析
1、什么是领域模型:它说明问题域里有意义的概念类。这些概
念类直接来源于业务领域中的对象。领域模型是这些可视化的表示,
也称为概念模型或分析对象模型。规模适度的领域模型通常需要几十
个概念类。
第8章
面向对象分析
2、分析模型与用例模型的关系:分析建立在需求收集基
础上,分析模型的概念类从用例模型中获取灵感。
3、建立分析模型的过程
(1)发现领域对象,定义概念类;
(2)识别对象的属性;
(3)识别对象的关系,包括建立类的泛化关系、对象的
关联关系;
(4)建立交互图。
第8章
面向对象分析
8.4.2 定义概念类
OOA的中心任务就是要找到系统中的对象或类。这
些对象或类将反映到系统设计中的软件类和系统实现中
某个面向对象语言已声明的一个类。在整个开发过程中,
总是尽量使这些对象或类在不同阶段保持相同的名称。
8.4.3 添加属性
属性是描述对象静态特征的一个数据项。
1、发现属性的策略:
(1)为对象做一般性的描述,也就是该类对象的一般特
征。
第8章
面向对象分析
(2)在当前的问题域中对象还具备哪些特定描述项。
(3)对象在系统中的责任是什么?在系统中对象还需要
了解或提供哪些信息?
(4)对象需要长期保存哪些信息?
(5)对象可能处于什么状态?
2、保持属性的简单性
(1)仅定义与系统责任和系统目标有关的属性。
(2)使用简单数据类型来定义属性。
(3)不使用可导出的属性。
(4)不为对象关联定义属性。
第8章
面向对象分析
3、属性的说明
(1)属性的名称和解释
(2)属性的数据类型
(3)其他要求:如取值范围、缺省值等。
8.4.4 识别对象的关联
1、什么是关联:表示不同类的对象之间的结构关系,它
在一段时间内将多个类的实例连接在一起。
(1)关联名称
(2)角色
(3)多重性
(4)导向性
第8章
面向对象分析
2、整体——部分关联
如果对象A是对象B的一个组成部分,则称B为A
的整体对象,A为B的部分对象,二者对应的关联开式
称为整体——部分关联。
3、识别关联:要识别出对解决问题有关键作用的关联,
而不是现实中的全部关联。
第8章
面向对象分析
8.4.5 建立类的泛化关系
1、什么是泛化
泛化是在多个概念之间识别共性,定义超类(一般概
念)和子类(特定概念)关系的活动。
2、什么时候需要泛化:主要看问题域的具体情况。
3、抽象概念类:如果一个类A的每一个成员必须同时是其
子类的成员,那么称类A为抽象概念类。
4、多继承:指一个子类继承了两个父类的属性和行为。使
用多继承有两个潜在的问题:
(1)如果某个类从若干个类中进行继承,就必须检查祖先
中关系、操作和属性的命名方式。
(2)如果使用多继承,同一祖先类就可能会被一个后代继
承多次。
第8章
面向对象分析
8.4.6 分析模型
完整的分析模型包括反映对象静态结构的类图、
反映用例实现的对象交互图,当对象行为复杂并存在
多种不同状态转换时,还要有反映对象状态变化的状
态图。
第8章
面向对象分析
习 题 8
1. 面象对象方法和结构化方法有什么不同,它具有哪
些优势?
2. 什么是UML?它定义了哪几种视图?每个视图描
述了什么?
3、什么是迭代开发过程?采用迭代过程有什么好处?