面向对象分析-第二节:面向对象分析之建立对象模型

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象分析-第二节:面向对象分析之建立对象模型相关的知识,希望对你有一定的参考价值。

文章目录

一: 基本概念

(1)对象模型

面向对象分析的首要工作就是建立问题域的对象模型。对象模型表示静态的、结构化的系统的数据性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。对象模型为建立动态模型和功能模型,提供了实质性的框架

(2)先建立对象模型的原因

  • 静态数据结构对应用细节依赖较少,比较容易确定
  • 当用户的需求变化时,静态数据结构相对来说比较稳定

(3)信息来源

需求陈述、应用领域的专业知识、客观世界的常识,是建立对象模型时的主要信息来源

(4)典型的建模步骤

  • 确定对象类和关联(对于大型复杂问题还要进一步划分出若干个主题);
  • 给类和关联增添属性,以进一步描述它们;
  • 使用适当的继承关系进一步合并和组织类

二:确定类与对象

(1)找出候选的类与对象

A:客观事物分类

对象是对问题域中有意义的事物的抽象,它们既可能是物理实体,也可能是抽象概念。客观事物可分为下述5类:

  • 可感知的物理实体;
  • 人或组织的角色;
  • 应该记忆的事件;
  • 两个或多个对象的相互作用;
  • 需要说明的概念

B:非正式分析

以用自然语言书写的需求陈述为依据,把陈述中的名词作为类与对象的候选者,用形容词作为确定属性的线索,把动词作为服务的候选者。这种方法确定的候选者是非常不准确的,其中往往包含大量不正确或不必要的事物,需要经过更进一步的严格筛选

C:提取隐含的类与对象

(2)筛选出正确的类与对象

  • 如果两个类表达了同样的信息,则应该保留在此问题域中最富于描述力的名称
  • 需要把与本问题密切相关的类与对象放进目标系统中
  • 系统无须记忆笼统的、泛指的名词信息,把这些笼统的或模糊的类去掉
  • 把描述的是其他对象属性的词从候选类与对象中去掉
  • 慎重考虑既可作为名词,又可作为动词的词,以便正确地决定把它们作为类还是作为类中定义的操作。本身具有属性,需独立存在的操作,应该作为类与对象
  • 应该去掉仅和实现有关的候选的类与对象

三:确定关联

(1)关联

A:定义

两个或多个对象之间的相互依赖、相互作用的关系就是关联。在需求陈述中使用的描述性动词或动词词组,通常表示关联关系

B:确定关联的重要性

分析确定关联,能促使分析员考虑问题域的边缘情况,有助于发现尚未被发现的类与对象

(2)步骤

A:初步确定关联

  • 直接提取动词短语得出的关联
  • 需求陈述中隐含的关联
  • 根据问题域知识得出的关联

B:筛选

筛选时主要根据下述标准删除候选的关联:

  • 已删去的类之间的关联:如果在分析确定类与对象的过程中已经删掉了某个候选类,则与这个类有关的关联也应该删去,或用其他类重新表达这个关联

  • 与问题无关的或应在实现阶段考虑的关联:应该把处在本问题域之外的关联与实现密切相关的关联删去

  • 瞬时事件:关联应该描述问题域的静态结构,而不应该是一个瞬时事件

  • 三元关联:三个或三个以上对象间的关联,可分解为二元关联或用词组描述成限定的关联

  • 派生关联:去掉那些可以用其他关联定义的冗余关联

C:改进

可以从以下几个方面进一步完善经筛选后余下的关联

  • 正名:仔细选择含义更明确的名字作为关联名
  • 分解:为了能够适用于不同的关联,必要时应该分解以前确定的类与对象
  • 补充:发现了遗漏的关联就应该及时补上
  • 标明重数:应该初步判定各个关联的类型,并粗略地确定关联的重数

四:划分主题

(1)定义

在开发大型、复杂系统的过程中,为了降低复杂程度,把系统再进一步划分成几个不同的主题,即在概念上把系统包含的内容分解成若干个范畴

(2)针对不同类型的方法

  • 规模小的系统:可能无须引入主题层
  • 含有较多对象的系统:首先识别出类与对象和关联,然后划分主题,并用它作为指导开发者和用户观察整个模型的一种机制
  • 规模大的系统:首先由高级分析员粗略地识别对象和关联,然后初步划分主题,经进一步分析,对系统结构有更深入的了解之后,再进一步修改和精炼主题

(3)原则

  • 问题领域而不是用功能分解方法来确定主题
  • 按照使不同主题内的对象相互间依赖和交互最少的原则来确定主题

五:确定属性

(1)属性

属性是对象的性质,借助于属性人们能对类与对象和结构有更深入更具体的认识

  • 注意:在分析阶段不要用属性来表示对象间的关系,使用关联能够表示两个对象间的任何关系,而且把关系表示得更清晰、更醒目

(2)确定属性的步骤

A:分析

  • 在需求陈述中用名词词组表示属性,用形容词表示可枚举的具体属性
  • 借助于领域知识常识分析需要的属性
  • 仅考虑与具体应用直接相关的属性,不要考虑那些超出所要解决的问题范围的属性
  • 首先找出最重要的属性,以后再逐渐把其余属性增添进去
  • 不要考虑那些纯粹用于实现的属性

B:选择

从初步分析确定下来的属性中删掉不正确的或不必要的属性。有以下几种常见情况:

  • 误把对象当作属性:如果某个实体的独立存在比它的值更重要,则应把它作为一个对象而不是对象的属性

  • 误把关联类的属性当作一般对象的属性:如果某个性质依赖于某个关联链的存在,则该性质是关联类的属性,在分析阶段不应把它作为一般对象的属性

  • 把限定误当成属性:如果把某个属性值固定下来以后能减少关联的重数,则应该考虑把这个属性重新表达成一个限定词。

  • 误把内部状态当成了属性:如果某个性质是对象的非公开的内部状态,则应该从对象模型中删除这个属性。

  • 过于细化:在分析阶段应该忽略那些对大多数操作都没有影响的属性

  • 存在不一致的属性:类应该是简单而且一致的。如果得出一些看起来与其他属性毫不相关的属性,则应该考虑把类分解成两个不同的类

六:识别继承关系

(1)建立继承关系的方式

确定了类中应该定义的属性之后,就可以利用继承机制共享公共性质,并对系统中众多的类加以组织。可以使用以下两种方式建立继承关系

  • 自底向上:抽象出现有类的共同性质泛化出父类,这个过程实质上模拟了人类归纳思维的过程
  • 自顶向下:把现有类细化成更具体的子类,这模拟了人类的演绎思维过程。从应用域中常常能明显看出应该做的自顶向下的具体化工作

(2)多重继承

A:作用

利用多重继承可以提高共享程度,但增加了概念上以及实现时的复杂程度

B:要点

  • 指定一个主要父类,从它继承大部分属性和行为;
  • 次要父类只补充一些属性和行为

七:反复修改

(1)必要性

软件开发过程就是一个多次反复修改、逐步完善的过程。仅仅经过一次建模过程很难得到完全正确的对象模型

(2)面向对象在修改时的优点

面向对象的概念和符号在整个开发过程中都是一致的,比使用结构分析、设计技术更容易实现反复修改、逐步完善的过程

以上是关于面向对象分析-第二节:面向对象分析之建立对象模型的主要内容,如果未能解决你的问题,请参考以下文章

面向对象分析与设计—OOD部分

面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

20171127-构建之法:现代软件工程-阅读笔记

面向对象设计----软件设计师

Java程序员怎样理解面向对象分析方法?

面向对象方法学-第二节:面向对象的概念