1.2.3 面向对象的设计方法
面向对象(Object-Oriented)的设计方法是近年来发展起来的一种新的设计技术,其基本思想是:将系统所面对的问题,应用封装机制,按其自然属性进行分隔,按人们通常的思维方式进行描述,建立每个对象的领域模型和联系,既模拟信息实体的内在结构又模拟动作机制(如路径选择和图像解释就是矢量数据与栅格数据两类应用的典型范例),使设计出的软件尽可能直接地表现出问题求解的过程。整个系统只由对象组成,对象之间的联系通过消息(messages)进行。面向对象的设计方法所强调的是在系统调查资料的基础上,针对OOA所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。由于采用了将数据和操作行为封装在一起的模块化结构,从而使系统很容易重组,但其他系统就必须重写,这对于结构复杂的系统是难以承受的。因此,面向对象设计方法的优点就是:加强了对问题域和系统责任的理解;改进了与分析有关的各类人员之间的交流;对需求的变化具有较强的适应性;贯穿软件生命周期全过程的一致性、实用性;有利于用户参与,容易扩充和重组。
所谓面向对象的定义,是指无论怎样复杂的事物都可以准确地由一个对象表示。例如,地图上多边形的一个节点或一条弧段可定义为对象;一条河流,或一个省,也可定义为一个对象。下面是面向对象技术的一些有关概念。
(1)对象(Object)。对象是事物的抽象单位,具有特征的内部状态、性质、知识和处理能力,通过消息传递与其他对象相联系,是构成系统的元素或说是封装了数据和操作集的实体。
(2)消息(Message)。消息是请求对象执行某一操作或回答某些信息的要求,用以统一数据层和操作控制,将对象联系起来。
(3)分类(Classification)。分类是关于同类对象的集合。具有相同属性和操作的对象组合在一起形成类。属于同一类的所有对象共享相同的属性项和操作方法,但每个对象可能有不同的属性值。以一个城市的GIS为例,它包含了建筑物、街道、公园、给排水管道、电力设施等类型,而中山路51 号是建筑物类中的一个实体,即对象;建筑物类中可能还有诸如地址、房主、用途、建筑日期等其他属性,并可能需要显示对象、更新属性数据等操作。
(4)概括(Generalization)。在定义类型时,将几种类型中某些具有公共特征的属性和操作抽象出来,形成一种更一般的所谓超类,称为概括(或父类)。例如,饭店、商店、学校、医院等都涉及建筑物,所以可以将建筑物抽象出来,形成一种超类,建立饭店、商店、学校、医院等子类的公共属性项和操作。子类还可以进一步分类,如饭店类可以进一步分为餐馆、旅店、涉外宾馆、招待所等类型。所以一个类可能是某个或几个超类的子类,同时又可能是几个子类的超类。
(5)联合(Association)。在定义对象时,将同一类对象中的几个具有相同属性值的对象组合起来,为了避免重复,设立一个更高层次的对象来表示那些相同的属性值。例如,某农户拥有两块农田,使用同样的耕种方法,种植同样的庄稼,这里农田主、耕种方法和庄稼三个属性相同,因而可把这两个对象(农田)组合成一个新的对象,而新对象中包含有这三个属性。
(6)聚集(Aggregation)。聚集有点类似于联合,但聚集是将几个不同特征的对象组合成一个更高层次的对象。每个不同特征的对象是这个聚集的一部分,它们有自己的属性描述数据和操作,这些是不能为聚集所公用的,但聚集可以从它们那里派生得到一些信息。例如,房子从某种意义上说是一个聚集,因为它是由墙、门、窗、房顶等组成的。
(7)传播(Propagation)。传播是作用于联合和聚集的工具,它通过一种强制性的手段将子对象的属性信息传播给高层次的组合对象。也就是说,高层次的组合对象,联合和聚集的某些属性值并不单独存在于数据库中,而是从它的子对象中提取和派生。例如,一个多边形的位置坐标数据并不直接存在于多边形文件中,而是存在于弧段和节点文件中。多边形文件仅提供一种组织对象的功能和机制,即借助于传播工具可以得到多边形位置信息。
面向对象技术具有如下三个性质。
(1)封装性
一个对象即是一个独立存在的实体,对象有各自的属性和行为,彼此以信息进行通信,对象的属性只能通过自己的行为来改变,实现了数据封装。
(2)继承性
相关对象在进行合并分类后,有可能出现共享某些性质,通过抽象后使多种相关的对象表现为一定的组织层次,底层次的对象继承其高层次对象的特性,这便是对象的继承性。
类通过继承定义成不同的层次结构,将相关的特点抽象出来作为父类,子类继承父类,即子类的某些属性和操作来源于它的父类。因此,在同一父类下的子类拥有某些公共属性,并且在继承过程中,还可以将父类的操作和属性遗传给子类的子类。继承是有力的建模工具,有助于进行共享说明和实现几何数据与属性数据一体化。
(3)多态性
对象的某种操作在不同的条件环境下可以实现不同的处理,产生不同的结果,也就是说不同类中的对象,对系统发生的同一信息都具有反应能力。例如发出绘图命令时,不同对象(方形、圆形、椭圆形等)都有反应能力。
面向对象的设计方法,更接近于对问题而不是对程序的描述,软件设计带有智能化的性质,这种形式更便于程序设计人员与应用人员的交流,软件设计也更具有普遍意义,尤其是在地理信息系统的智能化要求和专家系统技术不断提高的形势下,面向对象的软件设计是更有效的途径。