课件
在我们眼里,这是德国用于召开计算机方面相关研讨会的Dagstuhl城堡,但在一位面向对象程序员的眼里,他看到的就会是另外一番景象,他看到的会是一个又一个对外提供服务的对象,比如水池成了流体输入接口、门成了室内活动触发器、而窗子则成了访客监控接口、窗帘成为了隐私保护代理。通过这样的比喻,可以看到,用面向对象的视角来看待世界,我们就把世界看成了是一个一个彼此独立又相互联系的对象实体。
⾯向对象分析 OOA
面向对象分析(Object-Oriented Analysis, OOA)是一种软件系统的需求建模与分析技术。它是在上个世纪八十年代末九十年代初提出,受到面向对象的程序设计、语义网络和带语义的数据模型的影响,它的基本的观点就是采用对象、类、方法等原子概念,在需求分析、设计与实现之间建立自然的映射关系。
面向对象的分析技术关注运用领域中的实体,并将其建模为对象。面向对象分析技术主要基于分类、泛化、聚合关系,在对象的集合之间建立某种层次结构。而对象的行为就是执行预定的动作,有时候也称为服务或者活动。对象通过执行这些动作来完成它自身状态的迁移。
面向对象分析的起源
面向对向分析的思路主要来源于四个方面:
- 首先就是面向对象程序设计中的概念。将面向对象程序设计中的概念上推到分析和设计阶段,使得各个阶段之间的转换变得更为平滑;
- 此外,面向对象分析还从数据库设计中汲取了主要的数据建模方法,ER图中的主要概念,其中的实体-关系、泛化、聚合和分类用于系统中对象的建模和分析;
- 在面向对象之前,主要的软件范型就是结构化的分析方法。结构化分析方法强调分而治之,将大的系统分解为更小的子系统,单独完成独立的功能。这种思路在面向对象中也有所体现;
- 在人工智能、知识工程中,知识表示方法也对面向对象的概念建模提供了很好的借鉴的语义表示,主要是基于问题框架和语义网络的知识表示方法,它对于刻画对象之间关系有着很好的借鉴意义;
面向对象分析方法举例
在面向对象分析方法全盛的时代,曾经有过50余种面向对象的分析方法同时存在,这其中影响最深远的要属 Peter Coad 和 Yourdon 的方法,在 Peter Coad 的方法中,他提出对象是问题领域中真实存在的实体,有着清晰定义的对象边界,意思就是说一个给定的对象能够清晰地知道判断出它是不是属于我们所定义的这种类型的对象,类型的区分应该是很明显的,要想作出这样明显的区分,主要靠对象中封装的属性和它的行为。因此面向对象的分析的核心概念就是对象、属性、行为,其中行为我们用服务来定义。面向对象的分析中,除了对象、属性、服务这三个概念外,另外两个概念一个是结构、一个是主题。
结构
继承/一般-特殊结构 Gen-Spec Structures
用于表达继承关系的一般-特殊结构。一般-特殊结构将类组织成基于继承关系的分类层次结构,自底向上就是从特殊的类到一般的类,一般的类也称为父类或者是基类,特别的类就是父类的子类。自顶向下就是从一般的类到特殊的类,先有抽象的具有公共属性的类,然后再把它特化为更具的、属性定义更具有特殊性的类。
上面类图,可以看到,患者可以分为两个特殊的类,一类是住院患者一类是门诊患者,住院患者和门诊患者他们有一个公共的属性,就是他们都要有一个医生为他负责,要在患者的属性中添加他所负责任的医生的名字,而在住院患者中有两个特殊的属性,即住院患者有相应的病房号和病床号,而门诊患者只是记录他的上一次诊疗时间、相关的诊疗记录以及下一次的预约时间,所以我们可以看到通过类结构就能把类之间的公共的属性提取出来,放到父类和基类中去,而那些所属于这个类的独特的一些属性则放到特定的这个类自身来定义,这样我们就可以更好的支持重用。
整体-部分结构 Whole Part Structures
除了一般-特殊结构,另一个主要的结构就是整体-部分结构。整体-部分结构用于描述对象之间的组合关系,比如一个交通灯对象是由零到三个灯组以及支撑杆和位置组成的:
这样的结构就是一个整体-部分结构,它表明了一个整体的对象是由哪些更小的部分的对象组合而成。
服务
在面向对相的这种方法学中,所倡导的这一种分而治之的世界观,仿佛是把世界切碎了,每一个碎片都是一个独立的对象,但是对象之间并非老死不相往来,每个对象存在于这个环境中就要为他周遭的其他对象提供服务,比如医生对象对外提供的服务是体检、出体检报告等等。
在Coad的OOA方法中,它把对象能够对外提供的服务抽象成了三种类型,这三种类型的服务仍然是我们目前的软件系统最流行、最常见的服务:
- 瞬时服务(Occurrence services):它是用事件发生的形式提供出来的,比如对象的创建、结束,修改等等,它都是瞬时完成的,做一个动作之后服务过程就结束了;
- 计算服务(Calculate services):这是计算机软件能够对外提供的主要服务之一,这类服务主要是为其他对象完成某些复杂的科学计算任务等,当然也包括很简单的数学计算;
- 监控服务 (Monitor services) :这类服务是是持续性的服务,通常就是监控类型的服务。这类服务需要对象持续地去监控某些业务流程,检查预设条件是否得到满足,当预设的报警条件满足时,这些监控服务要采取一定的动作,如报警、发消息或切断某些服务等等,这类监控服务也是现在最常见的服务类型;
服务的表示方式为:在类图中用带箭头的虚线来表示一个对象引用另外一个对象的服务。
从面向对象到面向服务,其实是看待问题的视角的切换。面向对象更强调在对象的内部所封装的那些信息,所以它采用的是一些信息建模的角度,而面向服务它更强调的是服务过程本身,强调的是功能,因此我们可以看到在信息系统或者软件系统中,对象和服务是一个事物的两个方面,一个是静态的信息结构,一个是动态的操作流程。
服务关系 ( Services relationships)
在上面这幅图的这个系统的模型中可以看到,一共有三个类被定义出来,即医生、住院病人、病历,这三者之间互相调用彼此的服务来完成它们预期的功能。比如医生对外提供的服务是体检和出体检报告,而住院病人对外提供的是看病和做体检,这里实际上看病和体检是由这个病人发出的要用到医生相应服务才能完成的一个服务,因此我们可以看到医生和住院病人他们彼此使用对方的服务来合作完成看病体检等系统的功能,而病历作为一个实体对象它主要是一个信息的载体,医生对象需要调用病例对象的取数据服务,来访问他所关注的患者的就诊记录以及检查结果等等。在住院病人和病历之间的这条实线,它表明的是病例和住院病人之间存在一个关联关系,住院病人都有对应的病例。
面向对象的分析方法学
面向对象的分析方法学最主要的任务:
- 首先是识别对象和类,在领域中找出类和对象,给出它们的抽象的定义(类是对象的抽象定义)
- 识别类之间的关系,建立由继承和组合关系组成的类层次结构
- 定义主题,主题是用来将对象模型组织成多个抽象层次或视角的一个概念,通过继承关系或者整体部分关系联系起来的一系列的类通常都是属于同一个主题。我们用主题来划分领域中关注的不同的点
- 识别每个对象内部的属性信息,并把它赋予到相应抽象层次的类,就是我们建模的重点之一
- 定义了属性之后,再为每个对象类去定义相应的公共的服务,
以上这样,我们就完成了面向对象分析的主要步骤。
面向对象分析的局限性
面向对象分析方法的局限性在于,我们最初希望的初衷是,采用面向对象的思路能够让我们更早的进入分析和设计环节,但往往因为分析阶段的概念和设计阶段的概念无法对齐,进而无法实现。在面向对象分析中所能够沉淀下来的最有用的对象,就是对领域实体对象的建模,这些领域实体对象可以在后续的系统设计和实现中沉淀为一或多个实体对象的保存,这是我们做面向对象分析中最有用的部分。在面对一个具体的现实世界问题时,我们应该很好的评估对象、关系、服务等概念,是建模我们现实问题的业务流程最好的元素与否,当判断为是的时候,就可以采用面向对象的分析方法,当感觉不适用的时候,我们就要转换方法学去采用最适用的方法。
面向对象分析常用术语对照表
最主要的就是我们知道对象和实例它是指的同一个东西,一般特殊关系、继承关系泛化关系是同样的,组成关系和整体部分关系、聚合关系,它们又是具有语义上是可替代的,消息和刺激以及事件这几者它代表的含义是类似的,服务和操作这二者之间表达的是同样的含义,主题或者视角这两者又是可以互相替换的,情景这里和用例的关系是一个抽象定义的模板和实例的关系,另外就是参与者的概念,在有的方法中也把它叫做用户