可以取代人的哪些活动,这些活动中涉及到哪些具体的事物、哪些过程、遵循哪些规则等。也 就是从现实世界中找出能够回答这些问题的对象如何通过观察现实世界来识别对象就是 我们现在要讨论的问题。 识别对象首先要搞清楚信息系统要解决的问题到底涉及到哪些事物 我们将现实世界中存在的事物分成五大类 (1)有形物指那些看得见摸得着的东西,例如人、书汽车等。这一部分事物很容易 识别,当要解决的问题确定下来以后,很容易将与此问题有关的“有形物”都找出来 (2)人或组织机构所扮演的角色例如“医生”、“病人”、“顾客”、“售货员”等都属于 这一类的对象。 角色之间是紧密相关的,只要找出一个角色对象就很容易找出一组相关的角色对象 来 (3)事件事件对象用来表示所发生的事件,例如“出诊”、“进货”等都属于此类对 象 (4)交互交互对象常常具有“交易”“订合同”的性质,经常能够把多个对象联系起 来。例如“购买”将售货员顾客和商品联系在一起;再如“上课”将老师、课程和学生联系起 来 (5)规范规范对象具有“标准”或“定义”的性质,例如产品的技术指标和学校的专 业培养目标都是规范对象 上述分类是按事物的存在来进行的按照面向对象的观点,若把上述所分类的对象再进 行归纳,又可分为下述三类 (1)客观存在物这一类对象包括有形对象和角色对象,在面向对象系统中它体现 问题的结构特性。 (2)行为这一类对象包括事件对象和交互对象。识别行为是识别对象的一部分,行 为是依赖于对象的。在面向对象系统中它体现问题的行为特性 (3)概念观察现实世界与获取应用领域知识是分不开的,在现实世界中,人的活动 必然关联了一系列的客观存在物和它们的行为并且这种关联往往是有规律的。概念就是他 们交流各领域知识的工具,是识别对象时的一类认识和分析对象 在识别对象时,最首要的问题是找出信息系统所要取代的人的那一部分活动,以这些活 动为线索,去识别活动中所使用的工具和操作的对象;对识别出的对象和类,分析它们的结 构和行为,从而找出与它们相关联的对象和类,最终识别出所有的对象和类以及它们的结构 和行为。 422对象间的通讯 在面向对象系统中,对象和对象之间的通讯是通过发送消息完成的,并且可能带有某些 参数。 消息的一个特征是它们只表示请求,不保证动作;至于是否响应这个请求以及如何响 应那是接收消息的对象的事情。 例如,有一个“个人住址对象”中拥有一个实现消息 new TeleNumber( aNewTelen ber)的函数其功能是将新电话号码(假定为7位)送入这个住址对象,若用C++实现: ·28·
false, true: //定义一个枚举类 address int tele Number bool new'Tele Number (int aNew TeleNumber i if (aNew Tele Number>=10000000) return false else iteleNumber=aNewTeleNumber; return true;11 此函数首先检测新电话号码是否合法,若合法则进行更新操作。 当需要更改某一对象的电话号码时,首先发一条 new Tele Number消息给此对象,并且 将新号码作为参数传给对象,对象接受到消息后调用上面的函数完成所需的操作。 在面向对象系统中,一条消息的实现就是一个函数调用,向一个对象发送消息就是调用 这个对象成员函数的一种方法消息本身与这个对象的操作名(成员函数名)是相同的,并且 消息总能提供函数所需的参数。调用某个对象的某种操作的唯一途径就是发送消息 4.2.3对象关系图示—类图 在面向对象程序设计中,就内部操作而言,一个对象本身有不足的地方不是关键问题, 这容易察觉也容易修正,可以随时进行改进,甚至在系统运行时也可以加以改进,因为这 改动是限定在一个特定的对象类中的,不会对整个系统产生大的损伤。但是,不同对象同通 讯上的不足通常是设计当中较为严重的问题,若再进行改动或扩充时,对象之间的消息传递 将是非常困难的事情,因为它所波及的面比较大。若消息能力不足,就很难正常启动系统运 对象关系图就是为了确定系统设计中的消息通讯是否完整而设计的。它既包括对象类 之间的结构关系,又包括相互有消息传递的对象之间的动态关系 使用对象关系图,会给我们的设计带来下面几点益处: 发现设计中的错误,特别是那些有关对象间关系的错误; 作为实际应编码的依据; 用于系统出问题时的调试与检错。 下面我前将具体讨论对象间的各种关系如何用对象关系图来描述 1.类的层次结构 有了继承机制就有了类的层次关系和结构。类层次结构是表示系统中所有类关系的轮 廓,以这种形式可以很容易地跟踪类与基类和派生类之间的关系 若有三个对象类ABC,其中B是从A中派生出来的,C是从B中派生出来的。若以A 为基准,B是一个派生类;若以C为基准B又是一个基类。我们用类的层次结构图来表示这 些关系如下:
在层次图上,我们以轮廓的形式展示这些类,将一个类的所有派生类按字母排序,并用 锯齿形表示基类下的派生类,这样所有类之间关系就很清楚了 再例如,在个学校中有学生、教师、教室、办公室和课题。设计一个类层次,用 Object 作为所有类的公共基类,它有三个派生类;人员( person)、房间(room)和课程( subject); person类有两个派生类:学生( student)和教师( teacher):房间有两个派生类:教室(cass room)和办公室( office),将这些类关系用层次结构图给出如图4.1(a)所示。 person Obiect person studen rom classroom classro office subject a)类层次结构图 (b)类层次结构简化图 图4.1类层次结构图 对于比较复杂的类层次关系我们在描述时可以去掉各种方框,就变成类层次结构简化 图如图41(b)所示。 2对象间的创建关系 对象之间的创建关系是委托关系的一种具体实现。即一个对象在它的成员函数中创建 另一个关系对象,而后再委托它进行部分工作,最后完成自己的工作。这种创建关系都是发 生在一个对象实现某个方法(某种操作功能)过程中使用另一个对象的时候 例如对象A在实施m方法(在C++中称为成员函数)中要创建另一个对象B,所以在 对象A和对象B之间通过方法m建立了创建关系,称对象A是对象B的基于方法m的创 建者,可用图42表示这种创建关系,这是一种单个对象的创建关系 对象A力法叫对象日对象A一方法m一→对象B 单个对象的创建关系图 单个对象的创建关系简化图 图42单个对象的创建关系 在面向对象系统中,一个方法有可能要创建多个对象来协助它完成任务,它可以根据程
序的运行状态创建所需要的对象 例如,在学校系统中有关人员情况的有三个类, person, tudent和 teacher。在 person类 中有一个成员函数 number()是用来得到全校的教师和学生的总人数的,要想完成这个操 作需 student类对象和 teacher类对象分别计数后,它再给以汇总。因出它在实现过程中需 要创建 student类对象和 teacher类对象,再委托它们做计数工作。在 person类对象和stu dent类对象、 teacher类对象之间存在着创建关系,它们表达的是一种多对象创建关系,其创 建关系图如图4.3所示。 personI number( teacher f teache (a)多个对象的创建关系图 (b)多个对象的创建关系简化图 图4.3多个对象的创建关系 3.对象间的聚合关系 对象之间的聚合关系是指一个对象是由若干个其它对象组合而成的,是一种包含关系 而这种包含关系是直接的,对象的创建不需要通过一个中间方法来实现。当这个对象被创建 以后,组成它的各个对象将自动被创建 例如,飞机是由机身、引擎、机翼和尾翼这四部分组成的。在面向对象系统中要想描述它 们,可将机身等四部分都定义为对象类因为飞机这个对象类由这四部分组成,所以它们之 间不是一种继承关系,而是一种包含关系。这四个对象类在飞机类中以成员对象的身份存 在,它们之间所体现的是一种对象之间的聚合关系,可用图44给出它们之间的关系图 1机身 一机身 引擎 引擎 机翼 机翼 尾翼 尾翼 灯象之间聚合关系图 对象之间聚合关系简图 图4.4对象之间的聚合关系 对象间的消息流图 消息流图用来描述系统中对象间的消息流,它只描述那些相关对象间交换的主要消息 这种图能帮助我们看到对象是如河交互来完成赋于它们的任务的。 消息流图有两种:内向消息图和外向消息图 内向消息图描述一个对象如何从其它对象接收消息。例如对象B和对象C分别向对
象A发送了一条消息,其消息流图如图4.5所示。 对象B 对象C 消息对象B 消息1 消息2 消息2←对象C 内向消息流图 内向消息流简化图 图4.5内向消息流图 外向消息流图描述一个特定对象发送给其它对象的所有消息,与内向消息流图正好 相反。例如对象A分别发送了一个消息给对象B和对象C,其消息流图如图4.6所 示, 对象B 对象C 对象A一→·消息1—对象B [消息】[消息2 消息2一→对象C 对象A 外向消息流图 外向消息流简化图 图4.6外向消息流图 4.2.4类描述语言 在面向对象系统中,概念模型是由一系列相互联系的类构成的。为了表示一个概念模 型,需要一个描述类机构的语言—类描述语言CDL。在CDL中各种类抽象机制都有相应 的语言成分。在CDL语言中的语言成分可分为五部分。 1. class 它用于定义类,格式为 class:类名{类描述子句} 它是一个类描述子句,用来说明一个类的所有上位类(直接基类),格式为 superclass s:上位类表 在上位类表中列出此类的所有直接基类的名字,之间用“,”隔开 3. attribute 它是一个类描述子句,用以说明类的属性即类所包含的数据成员,格式为 attribute:属性定义;