[软件工程] 面向对象分析

面向对象分析

  • 面向对象分析
    • 一、 面向对象的基本过程
      • (一) 概述面向对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程。
      • (二) 3个子模型与5个层次
    • 二、需求陈述
      • (一) 书写要点
      • (二) 例子
    • 三、 建立对象模型
      • (一) 确定类与对象
        • 1.找出候选的类与对象
        • 2.找出所有名词:
        • 3.筛选出正确的类与对象
          • (1) 冗余
          • (2) 无关
          • (3) 笼统
          • (4) 属性
          • (5) 操作
          • (6) 实现
      • (二) 确定关联
        • 1. 初步确定关联
          • (1) 直接提取动词短语得出的关联
          • (2) 需求陈述中隐含的关联总行由各个分行组成;
          • (3) 根据问题域知识得出的关联现金兑换卡访问账户;分行雇用柜员。
        • 2. 筛选
          • (1) 已删去的类之间的关联
          • (2) 与问题无关的或应在实现阶段考虑的关联应该把处在本问题域之外的关联或与实现密切相关的关联删去。
          • (3) 瞬时事件
          • (4) 三元关联
        • 3. 进一步完善
          • (1) 正名
          • (2) 分解
          • (3) 补充
          • (4) 标明重数
      • (三) 划分主题
      • (四) 确定属性
        • 1. 分析
        • 2. 选择
          • (1) 误把对象当作属性
          • (2)误把关联类的属性当作一般对象的属性
          • (3)把限定误当成属性
          • (4) 误把内部状态当成了属性
          • (5) 过于细化
          • (6) 存在不一致的属性
      • (五) 识别继承关系
        • 1. 自底向上
        • 2.自顶向下
      • (六) 反复修改
        • 1. 分解“现金兑换卡”类
        • 2.“事务”由“更新”组成
        • 3.把“分行”与“分行计算机”合并
    • 四、 建立动态模型
      • (一) 编写脚本
      • (二) 设想用户界面
      • (三)画事件跟踪图
      • (四)画状态图
      • (五)审查动态模型
    • 五、建立功能模型
      • (一) 画出基本系统模型图图10.12是ATM系统的基本系统模型。
      • (二)描述处理框功能
    • 六、定义服务
      • (一)常规行为
      • (二)从事件导出的操作
      • (三)与数据流图中处理框对应的操作数据流图中处理框都与对象上的操作相对应。
      • (四)利用继承减少冗余操作利用继承机制继承服务,减少定义的服务数目。

面向对象分析

分析过程得出的最重要的文档资料是软件需求规格说明(在面向对象分析中,主要由对象模型、动态模型和功能模型组成)。
  面向对象分析(OOA)的关键是识别出问题域内的类与对象,并分析它们相互间的关系,最终建立起问题域的简洁、精确、可理解的正确模型。
  在用面向对象观点建立起的三种模型中,对象模型是最基本、最重要、最核心的。

一、 面向对象的基本过程

(一) 概述面向对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程。

[软件工程] 面向对象分析
            OOA分析过程

(二) 3个子模型与5个层次

面向对象建模得到系统3子模型:
  静态结构——对象模型
  交互次序——动态模型
  数据变换——功能模型

  1. 任何问题,都需要从客观世界实体及实体间相互关系抽象出极有价值的对象模型;
  2. 当问题涉及交互作用和时序时,动态模型是重要的;
  3. 解决运算量很大的问题,则涉及重要的功能模型。

动态模型和功能模型中都包含了对象模型中的操作(即服务或方法)。复杂问题的对象模型通常由5个层次组成,这5个层次,一层比一层显现出对象模型的更多细节。在概念上,这5个层次是整个模型的5张水平切片。

5个层次对应着在面向对象分析过程中建立对象模型的5项主要活动:

  • 找出类与对象
  • 识别结构
  • 识别主题
  • 定义属性
  • 定义服务
    “5项活动”不是5个步骤,事实上,这5项工作完全没有必要顺序完成,也无须彻底完成一项工作以后再开始另外一项工作。

在概念上可以认为,面向对象分析大体上按照下列顺序进行:
  寻找类与对象,识别结构,识别主题,定义属性,建立动态模型,建立功能模型,定义服务。
  但是,分析不可能严格地按照预定顺序进行,大型、复杂系统的模型需要反复构造多遍才能建成。
  通常,先构造出模型的子集,然后再逐渐扩充,直到完全、充分地理解了整个问题,才能最终把模型建立起来。

二、需求陈述

(一) 书写要点

需求陈述的内容包括:问题范围,功能需求,性能需求,应用环境及假设条件等。
   需求陈述应该阐明“做什么”,指出哪些是系统必要的性质,哪些是任选的性质。
   不能指望没有经过全面、深入分析的需求陈述是完整、准确、有效的。随后进行的面向对象分析的目的,就是全面深入地理解问题域和用户的真实需求,建立起问题域的精确模型。

(二) 例子

自动取款机(ATM)系统,如图所示。

[软件工程] 面向对象分析

(三) 划分主题

为了降低复杂度,将一个大的系统再进一步划分成几个不同的主题。
当系统对象较多(系统规模较大),可参照如下进行:先识别出类与对象和关联,然后划分主题,并用它作为指导开发者和用户观察整个模型的一种机制;
对于规模极大的系统,则首先由高级分析员粗略地识别对象和关联,然后初步划分主题,经进一步分析,对系统结构有更深入的了解之后,再进一步修改和精炼主题。

划分主体的原则:
应按问题领域而不是用功能分解方法来确定主题。另外,各个主题内对象应较少依赖和交互。
以ATM系统为例,可以把它划分成总行(包含总行和中央计算机这两个类)、分行(包含分行、分行计算机、柜员终端、柜员事务、柜员和账户等类)和ATM(包含ATM、远程事务、现金兑换卡和储户等类)等3个主题。
教材中ATM系统是一个简化的系统,将不考虑主题层。

(四) 确定属性

属性是对象的性质,藉助于属性我们能对类与对象和结构有更深入更具体的认识。注意,在分析阶段不要用属性来表示对象间的关系,使用关联能够表示两个对象间的任何关系,而且把关系表示得更清晰、更醒目。
一般说来,确定属性的过程包括分析和选择两个步骤。

属性是对象的性质,确定属性有助于我们对类与对象和结构有更深入更具体的认识。
确定属性的过程包括分析和选择两个步骤。

1. 分析

一般在需求陈述中用名词词组表示属性,例如
“汽车的颜色”或“光标的位置”。
往往用形容词表示可枚举的具体属性,例如,
“红色的”、“打开的”。
此外还需要领域知识和常识才能分析得出需要的属性。
由于属性对问题域的基本结构影响很小。结构相对稳定,属性可能随时间的推移而改变了。
在分析中首先找出最重要的属性,再逐渐把其余属性增添进去。

2. 选择

删掉不正确的或不必要的属性:

(1) 误把对象当作属性

如果某个实体的独立存在比它的值更重要,则应把它作为一个对象而不是对象的属性。同一个实体在不同应用领域中可扮演

(2)误把关联类的属性当作一般对象的属性

如果某个性质依赖于某个关联链的存在,则该性质是关联类的属性,在分析阶段不应该把它作为一般对象的属性。
如:学生选课程(n:m),成绩是关联类属性。

(3)把限定误当成属性

在ATM系统的例子中,“分行代码”、“账号”、“雇员号”等都是限定词。
使用关系限定符可以

  • 更精确地表达实体关系
  • 直接指导实现代码的编写
    [软件工程] 面向对象分析
    UML图表示
    [软件工程] 面向对象分析

    (五) 识别继承关系

    继承关系的建立实质上是知识抽取过程,它应该反映出一定深度的领域知识,因此必须有领域专家密切配合才能完成。
    可使用两种方式建立继承(泛化)关系:

    1. 自底向上

    模拟人类归纳思维过程,从现有类抽象出共同性质泛化出父类。
    例如,在ATM系统中,“远程事务”和“柜员事务”是类似的,可以泛化出父类“事务”;
    可以从“ATM”和“柜员终端”泛化出父类“输入站”。

    2.自顶向下

    模拟人类的演绎思维过程,从现有类细化成更具体的子类。
    这个过程比较自然,但避免过细。
    如图是增加了继承关系之后的ATM对象模型。

    [软件工程] 面向对象分析

    (三)画事件跟踪图

    状态图的绘制步骤:
      ①完整、正确的脚本;
      ②事件跟踪图(简易的UML顺序图);
      ③状态图。
      因为,脚本用自然语言书写,阅读时会有二义性。
      确定事件,分析各脚本(正常、异常),提取所有外部事件(包括系统与用户(或外部设备)交互的所有信号、输入、输出、中断、动作等等)。正常事件易找,异常事件和出错条件易遗漏。传递信息的对象的动作、大多数对象到对象的交互行为都对应着事件。
      如图所示,事件跟踪图(简易顺序图)。
    竖线——对象,横线——事件,箭头——作用方向。

    [软件工程] 面向对象分析

    [软件工程] 面向对象分析

    (五)审查动态模型

    在完成了每个具有重要交互行为的类的状态图之后,应该检查系统级的完整性和一致性。

    • 一般说来,每个事件都应该既有发送对象又有接受对象(发送者、接受者可以相同)。
    • 没有前驱或没有后继的状态应该是交互序列的起点或终点,否则出错误。
    • 应该审查每个事件,跟踪它对系统中各个对象所产生的效果,以保证它们与每个脚本都匹配。

    以ATM系统为例。在总行类的状态图中,事件 “分行代码错”是由总行发出的,但是在ATM类的状态图中并没有一个状态接受这个事件。因此,在ATM类的状态图中应该再补充一个状态“do/显示分行代码错信息”,它接受由前驱状态“do/验证账户”发出的事件“分行代码错”,它的后续状态是“退卡”。

    五、建立功能模型

    通常在建立了对象模型和动态模型之后再建立功能模型。
    功能模型由一组数据流图组成。
    其中的处理功能可以用IPO图(或表)、伪码等多种方式进一步描述。

    (一) 画出基本系统模型图图10.12是ATM系统的基本系统模型。

    [软件工程] 面向对象分析

    (二)描述处理框功能

    描述处理框的功能——要着重描述每个处理框所代表的功能,而不是实现功能的具体算法。
    可利用IPO图、伪代码等。

    六、定义服务

    • “对象”是由属性及对这些数据施加的操作(即服务)封装在一起构成的独立单元。
    • 服务需要在建立了动态模型和功能模型基础之上确定服务。

    在确定类中服务时应考虑如下:

    (一)常规行为

    类中定义的每个属性都是可访问的,即都定义了读、写该类每个属性的操作(服务)。
    但这些常规操作一般不在类图中显示表示(设计时考虑即可)。

    (二)从事件导出的操作

    在状态图中,事件是某对象接收到的消息,根据消息选择符指定的操作修改对象状态(即属性值),并启动相应的服务。
      例如ATM系统:
       发往ATM对象的事件“中止”,启动该对象的服务“打印账单”;
       发往分行的事件“请分行验卡”启动该对象的服务“验证卡号”;
       事件“处理分行事务”启动分行对象的服务
       “更新账户”。

    (三)与数据流图中处理框对应的操作数据流图中处理框都与对象上的操作相对应。

    综合考虑状态图和数据流图,确定对象应提供服务。
      例如,在ATM系统中,从状态图上看出分行对象应该提供“验证卡号”服务,而在数据流图上与之对应的处理框是“验卡”,根据实际应该完成的功能看,该对象提供的这个服务应该是“验卡”。

    (四)利用继承减少冗余操作利用继承机制继承服务,减少定义的服务数目。

    只要不违背领域知识和常识,就尽量抽取出相似类的公共属性和操作,以建立这些类的新父类,并在类等级的不同层次中正确地定义各个服务。

    来源:ZaneXu1024

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年10月4日
下一篇 2019年10月4日

相关推荐