1. 4面向对象技术在仿真领域的研究现状与发展
进入90年代以来,面向对象仿真技术的研究和开发有了惊人的进步,目前在许多领域开发的仿真建模语一言和环境大部分支持OOS (Object Oriented Simulation)。在通信系统、计算机系统、电力系统、军事系统、环境和生态系统等领域已经开发出不少面向对象仿真环境,例如:多媒体图形仿真,建立大规模多用户3D应用的分布式交互仿真环境等。现在许多面向对象语言都支持仿真类库的开发,有时,也可以使用一些特殊的面向对象仿真语一言和仿真环境,这些仿真语启‘和环境还提供了对数据库及其它软件和硬件设备的集成和通信工具。美国Carnegie Mellon大学首先开始研究基于知识的仿真系统(KBS),相继推出了仿真建模专家系统(ESS),自动生成仿真模型的专家系统(MGES)等。近十几年来,我国的面向对象仿真研究、开发和应用也有很大的进展,支撑OOS的工具己不少实现商品化了。例如:(1)网络仿真技术被用在基于共享的仿真环境,如虚拟工厂教学系统;(2)面向对象仿真在处理复杂系统模型时,是一个极好的工具。将这类模型分成几个子模型,做到仿真程序结构与真实系统结构相似。如解决互相联系的异步电动机组的仿真控制问题等。同时,在科技、生产、社会各方面面向对象仿真技术的应用,使仿真技术的应用能力拓展,渗透性增加,无处不在,无孔不入。
第三章面向对象仿真建模
面向对象的仿真(Object-Oriented Simulation)在理论上突破了传统仿真方法的观念,它根据组成系统的对象及其相互作用关系来构造仿真模型,模型的对象通常表示实际系统中相应的实体,从而弥补了模型和实际系统之间的差距。面向对象的仿真具有内在的可扩充性和可重用性。因而为仿真大规模的复杂系统提供了极为方便的手段。仿真建模的主要任务是构造能够反映系统的结构和行为的模型,构造仿真模型的一种自然的方式是使模型的结构尽可能与实际系统的结构一致,因而要求构造模型的基本模块与实际系统的组成部分相对应,面向对象的仿真提供了实现这种建模方法的途径。 3. 1面向对象的基本概念
面向对象方法是一种运用对象、类、继承、封装、聚合、消息传递、多态性等概念来构造系统的软件开发方法。这种方法是计算机的求解更接近人的思维方式。它使得软件开发的设计阶段更加紧密的与实现阶段相联系。 3.1.1对象
对象是现实世界中一个实际存在的事物,他可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。静态特征即可以用某种数据来描述的特性,动态特性即对象所表现的行为或对象所具有的功能。 一个对象由一组属性和对这组属性进行操作的一组服务构成。 属性是用来描述对象静态特性的一个数据项。 服务是用来描述对象动态特性的一个操作序列。 一个对象可以有多项属性和多项服务。一个对象的属性和服务被封装成一个整体,对象的属性值只能由这个对象的服务存取。 3. 1 .2类
类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。 在面向对象编程语一言中,类是一个独立的程序单元,它应该有一个类名并包括属性说明和服务说明两个主要部分。类的作用是定义对象。类与对象的关系如同一个模具与用这个模具铸造出来的铸件之间的关系。类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。所以一个对象是一个类的实例。
事物既具有共同性,也有特殊性。运用抽象的原则舍弃对象的特殊性,抽取其共同性,则得到一个适应一批对象的类。
同时,我们也可以这样来理解类与对象的概念。现实世界中的事物可分为两大类,即物质和意识。物质表达的是具体的事物;意识描述的是某一抽象的概念。例如“自行车”和“这辆白色的自行车”,“这辆白色的自行车”是物质,它是具体的客观存在;“自行车”是意识,它是一个抽象的概念,是对客观存在的事物的一种概括。这些现实世界中的事物可直接映射到面向对象中的“对象”,现实世界中的意识可对应面向对象系统中的抽象概念一一“类”。“自行车”在面向对象系统中可用自行车类来表示,“一辆白色的自行车”在面向对象系统中则是一个具体的对象,是自行车类的一个实例。 3. 1. 3封装、信息隐藏
封装是面向对象方法的一个重要原则。它有两个含义:第一,把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象);第二个涵义也称作“信息隐藏”,即尽可能隐藏对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系。这主要是指对象的外部不能直接的存取对象的属性,只能通过几个允许外部使用的服务与对象发生联系。确切的说,封装就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。 3. 1. 4消息
消息就是向对象发出的服务请求。当一个对象给另一个对象发送消息时,发送者请求消息接受者执行指定的操作,并(有可能)返回信息。当接受者接收消息时,它以它所知道的方式执行被请求的操作。这样的请求不规定如何执行一个操作。来自发送者的这种信息总是被隐藏的。
3. 1. 5继承、泛化
继承是面向对象的一个重要特色,是代码重用的重要方法。继承关系是子对象可以完全或部分的复用父对象的属性和操作。子对象可以用自己的操作替代父对象的操作。继承可能会带来另一个问题一一多态,这在下面阐述。
泛化是较通用的类和较具体的类之间的一种关系,子类是超类的一个种类,子类的一个对象可以在超类被允许的任何地方时用。
泛化是“is a”关系。泛化使得重新陈述已经定义的特性变得不必要了,为超类定义的属性和操作可以在子类中重用,子类被成为继承了他的父类的属性和方法。
聚合和组合
如同世间万物存在着千丝万缕的联系,作为现实世界的反映,对象相互之间也存在着相互关联的关系。聚合是关联的“一部分”关系(即“is part of\。表示超集类和子集类之间的全体与部分关系。一个超集类包含一个自己类(或一组类)。
这个包含特性可以是强的(值聚合)或弱的(引用聚合),在UML中,值聚合成为组合,而引用聚合成为聚合。
从系统建模的观点看,聚合是一种特殊的并含有其他语义的关联。特别地,聚合是传递的和反对称的。
组合有另外一个存在依赖特性,一个子集类的对象不能在没有被连接到其他超类对象的情况下存在,这就意味着如果一个超集对象被删除,则他的自己对象也必须被删除。多态
多态:不同的对象可以以不同的方式响应同一消息,是对象间可以交互而不需要知道他们的确切类型。
表现在程序实现上,就是不同的对象可以调用相同名称的函数,并可导致完全不同的行为的现象,称之为多态。这大大提高了我们解决复杂问题的能力。在代码实现时,它
常用虚函数来实现。
继承带来多态,绑定操作的工作必须延迟到运行是进行,这就是动态绑定。多态是通过动态绑定实现的。
3. 4类建模
在这个步骤,提取类和他们的属性。确定类的一个方法是从用例推断他们,即仔细研究全部情景,不管是正常的还是异常的,并确定在用例中发挥的作用。它属于系统的静态特征。我们在找到了类之后,要确定其属性、操作,以及类之间的关系。在面向对象建模中,这是非常重要、非常关键的一步。类的提取,类之间关系的确定,将直接影响后面代码的实现。
3. 4. 1类提取
识别对象是任何面向对象方法中最重要也是最困难的一步。通过同问题域专家的交互式对话在问题域中识别所有的“潜在对象”。在寻找对象的尝试中,正确的运用抽象原则,舍弃那些与系统责任无关的事务,同时,对于与系统责任有关的事务,并不是把他们的任何特征都在相应的对象中表达出来。发现对象以后,经过分析,我们提取出有用的属性,以及相关的方法,将其封装在一个类中。
在类提取时,我们要按照一定的原则,选取合适的粒度和层次。根据类描述的抽象层次的不同,它们的粒度是不同的。简而言之,避免大类长方法,也就是说要避免包含许多方法、许多属性的大类。最重要的是要有一个良好的类层次结构。
3. 4. 2聚合
图。-4中,菱形实心箭头个表示的是类之间的聚合关系。箭头指向整体类,另-端则是部分类。聚合关系也称为整体一部分关系,组装一部分关系。识别聚合关系的常用方法是寻找“由?构成”,“包含”,“是?的一部分”等词句。聚合减少了复杂性。
我们可以看出,在岸边集装箱起重机系统中存在的聚合关系有: 1.训练系统由装卸设备和装卸设备组成;
2.岸边集装箱起重机是由大车、小车、吊具、大梁俯仰、指示灯组成的: 3.大车运行机构和夹轨器是大车的一部分; 4.吊具是由旋锁、导板、钢丝绳组成的。 3. 4. 3继承
一个类是可以独立的,也可以位于一个继承层次,继承层次由一些具有父子关系的类组成。继承是一种非常方便高效的机制,通过创建子类,对父类进行特化或扩展。图中,空心三角形箭头则表示泛化/特化关系,即继承关系,继承允许类之间共享同一代码。
在图3-4中,泛化被画成连接到父类伤得连线端点上的一个空心三角形。也就是说,带空心三角形的箭伞示继承关系。箭头指向父类,另一端指向子类。子类继承了父类的属性和操作。值得注意的是,继承作用到类上而不是对象上,而且它作用到类型上而不是值上。在“岸边集装箱起重机”系统中的泛化特化:
1.装卸设备父类有岸边集装箱起重机类和龙门起重机类两个子类;装卸工具类的子类一龙门起重机类,在此处设置该子类,是为了今后开发“龙门起重机仿真训练器”留下接口,在以后的开发中,利用代码重用,可以大大降低开发成本,缩短开发时间,充分体现面向对象研究方法的优越性。
2.船舶类、集卡类、集装箱类继承了装卸工具类中承载能力属性、位置属性等,在子类中不需要再对这些属性进行定义;
3.集装箱类根据编号方法不同又有板上集装箱类,板下集装箱类,以及一种特殊的舱盖板类;
4.指示灯父类有着箱灯类,开锁灯类,闭锁灯类三个子类。着箱灯类、开锁灯类、闭锁
灯类中无需再对状态属性进行定义,因为他们继承自指示灯类,在指示灯类中已经做了定义。
3. 4. 4封装和数据隐藏
面向对象编程中模块的基本单元是类,通过类这种机制,我们将数据和处理这些数据的过程封装为一个有机的整体一一类。
在类图中,每个类单元中间为他们的属性,第三栏为他们的处理属性及操作。如大梁俯仰类,我们将其运动速度属性、俯仰角度属性以及拉起大梁操作、放下大量操作封装在一个单元中,封装在其中的属性是隐藏的,并对不隐藏的封装成员函数提供支持。前面的“#”表示protected,“一”表示private,“+”表示publico public即对用户是可见的。private对用户是不可见的。接口暴露给用户,而实现对用户隐藏。面向对象语言中的类是支持信息隐藏的模块。c++语言使用关键字public和private来对类的属性和操作进行存取访问控制,其中public用于显示类的接口,private关键字用于隐藏类的实现。
3. 4. 5多态
多态意为拥有多种形态。在面向对象语言中,多个不同的函数可以具有现同的函数名。在继承层次结构中,所有的类,包括父类及其一切子类,提供他们自己的适当版本的多态方法是常见。多态使得共享的代码可以被剪裁,以适应每一单个类的特殊情况。
如图3-4类图中所示,装卸工具类的移动处理,与其子类船舶类、集卡类、集装箱类的移动处理都是各不相同的,所以在装卸工具类中我们仅定义出该函数,而是在其子类中以相同的函数名、不同的方法实现。
6. 2面向对象方法的不足
在开发中,我们发现面向对象模型比以往的模型有了很大的进步,显示出了种种优越性,面向对象的仿真更趋方便,逼真度高。虽然避免了结构化法方法的缺陷,但也带来了一些新的问题:
1.对象之间的联系是一种点对点的直接联系,当系统中对象数目增加时,通讯链接数将以平方级激增。也就是说抽象类时,类的数目不能过多,在构造类图时,层次不能过多,要控制好粒度。同时,类实例化时要控制好数目,以减少系统的复杂度及冗余度。例如:根据原型系统,最初分为前大梁类与后大梁类,但是我们发现,这增加了设计的复杂性,带来了许多开销,同时在使用CRC卡进行排列模拟时发现,前大梁类与后大梁类使用的频度不高,而且与其他类的联系也比较相似,于是将其合并为大梁类。
2.为支持通讯,每个对象实体都要维护一个包含所有对象实体功能服务信息的功能服务信息库,这部分信息不但重复,而且还要保证其一致性。这些开销都损害了系统的效率。例如:在吊具对象中要包含大车对象、小车对象、大梁对象等等的功能服务的信息库,而小车对象中同样也要包含这些。
3.更大的问题是对象的接口没有一致的标准,造成向系统中扩充对象时的随意与不规范,不利于系统的维护以及对象的复用。例如:整个系统是由一个个开发小组进行的,虽然大家采用的是同一开发语言,遵循同一个系统分析、系统设计文档,但是大家的编程习惯不同、造成编码也会有所不同。
4.对象方法项目管理存在一定困难。在通过“逐步精化”的对象开发中,各开发阶段之间没有清晰的边界,而且项目文档也是连续进行的。所以对进行分工与任务划分带来一定的麻烦。
6. 3未来发展方向
面向对象的仿真是计算机仿真领域中热点。而且,国内外学者对计算机仿真技术的研究正方兴未艾,不断有新的仿真技术思想和研究成果被提出。分布式仿真的加入,专家系统的引进,都将使仿真系统的功能更为强大,与现实世界的相似度越高。可以预见,随着
现代科技的发展,计算机仿真技术必将获得更大的发展和应用。