李光明,蔡福俊,李红强
模块化设计是传统软件工程中提出的软件设计方法,目的是运用“分而治之”的思想,把一个庞大的系统分成若干各模块,然后根据各模块的层次关系,组合成一个完整的系统,传统的软件工程已经制订了众多的原则,其中包括模块化分析与设计、模块的独立性、模块之间的信息共享和信息隐藏等在内的许多思想还是有效的,而有的则已经过时。在现代软件工程理论中,更强调分层的模块化设计的研究与应用,以前虽然有些在分层的模块化设计方法下的系统,但因其是在关系型数据库的支持下,所以很难区分彼此之间的层次关系。而本文所研究的分层模块化设计不是基于传统的关系数据库,而是基于面向对象的数据库(Caché),这样系统的层次管理在Caché的支持下就充分的体现出来,能适应各行业不断变化的业务规则,满足各种多变的需求。
模块化的思想是将软件设计成清晰和良好的结构以支持软件的维护和重用,模块是数据说明、可执行语句等程序对象的集合,他是单独命名的而且可以通过名字来访问的。模块化理论是在原有的概念上发展起来的, 保持其“分而治之”的内核的同时,也添加了许多新的内容和设计原则。模块化没有统一的定义,可以简单地将其理解为“模块化属于标准化范畴,是标准化发展的一种崭新的形式,是标准化原理的具体应用”。传统的模块化理论力求部件的标准化,但在现代软件工程中,模块化理论采用“分层的模块化设计”原则,把通用化扩大到组件级、子系统级、甚至系统级、使系统模块结构增强了灵活性和通用性。
分层的模块化设计不是对系统进行简单的分解。在分解中,如果划分粒度太大,则解决问题的难度依然较高;如果颗粒度太小,则如一盘散沙,难以管理,所以必须进行分层的模块化设计。模块划分时,首先将系统划分成几个大模块,然后在逐个对大模块进行划分,如此下去,直至分解到功能明确、易于实现的原子模块为止,使软件模块设计复杂度降低,达到低耦合高聚合的特点,这样形成结构层次清晰的模块化结构树,实现对系统的分层的模块化设计。
采用分层的模块化设计思想对系统实现划分,其他人不需要知道某个特定模块内部工作究竟是怎样写的,只是需要知道这部分所实现的功能,知道它所拥有的接口就可以了,这样程序设计就会更加简便,而且还可以把某个部分拆分开发,具备易标准化、动态性、易复用、易扩展、易部署等诸多优点。
针对传统软件开发方式模块化的问题,我们设计信息化系统时,采用分层模块化设计。模块按功能需求相对独立的应用划分,原则上每个模块就是一个相对独立应用系统,可单独存在并运行,某个或几个模块的增加、删去、改动不会影响整个系统的运行,模块归集构成一个完整的信息系统。各模块之间的数据调用都是通过对应的接口来实现,而接口也分内外接口(见图1)所示。这种结构的设计思想完全遵循面向对象的设计方法,将各个类内部属性和方法封装起来,内部接口都采用类方法来实现,做成Web Service进行发布,以供外部的程序进行调用,这种接口对用户都是开放的,用户可以根据自己的需要自行修改客户端的程序来满足自身的要求,设想将此系统做成一个平台,用户可在平台的基础上自行开发,这样就满足了行业需求多变的特性。
图1 系统内、外部接口
模块对数据的存取,只限于该模块内部涉及的数据,其他模块对于该数据不能直接存取,借用面向对象编程即所谓封装。如果涉及属于其他模块的数据,则必须通过数据路由规则实现数据的存取。
每个模块内部逻辑上分两部分:内部路由及外部路由。内部路由负责该模块及及其派生模块间的数据交换,外部路由负责该模块与其邻接上层父模块间的数据交换。每个模块间的数据交换具体通过下列规则进行:
a) 模块的内部路由逻辑只能调用与该模块邻接的下一层各模块(也就是该模块直接派生的模块)的外部路由逻辑的接口交换数据。
b) 继承自同一个上层模块的同层模块间的数据交换,由发出数据请求的模块回溯到上层父模块路由,然后再由上层父模块路由逻辑调用被请求的模块实现数据交换。
c) 不同层模块间的数据交换,或同层不同父模块间的数据交换,一直向上回朔到同一父模块路由,然后再由共同的父模块逐层路由到被请求的模块。
d) 除与父模块直接调用接口路由数据外,不允许模块间相互调用接口来路由数据。
能源管理信息系统(EMIS),通过能源计划、能源统计、能效分析、重点能耗设备管理、计量设备管理等多种手段,使企业管理者对企业的能源成本比重,发展趋势有准确的掌握,并将企业的能源消费计划任务分解到各个生产部门车间,使节能工作责任明确,促进企业健康稳定发展,并能满足所有授权用户对信息的各种功能需求的计算机应用软件系统。
在介绍具体实现过程之前,首先说明一下本文所说的分层的模块化设计都是在面向对象的基础上来实现的,所以数据库就不采用传统的关系型数据库,本系统采用了美国InterSystems公司的面向对象的数据库(Caché)作为后台数据库。这种数据库是完全面向对象的,结合了高性能、快速查询的SQL和先进的快速存储和对象访问,它的多维数据存取模型非常适合描述复杂的信息,并且数据库引擎采用的稀疏数组,事先无需声明定义数据库结构,类(对象)、关系表(支持SQL语法)和Global(多维数组)三种数据存取方式可同时进行,其高效的多维数组存储形式将数据和业务逻辑都封装在数据库中来完成,在层次的实现上方便。UI 采用Caché特有的高级组件Zen来完成。
系统结构层次关系,见图2。系统颗粒度最小划分到19个模块,各模块只限于对该模块内部的数据进行访问,涉及其他模块的数据必须通过路由完成,以实现封装机制。
各模块的内部路由只能调用该模块邻接下层模块的外部路由来交换数据。如“统计”模块只能调用其下层“能耗统计”等5个模块的外部路由逻辑的接口交换数据。若两个模块有共同的上级模块,则发出数据请求的模块必须先回溯到其上级模块,然后通过其上级模块来实现对其兄弟模块的访问。涉及不同层的模块或者虽然处于同层,但是其上级模块不同的模块间实现数据交换,则必须一直回溯到上层共同的父模块路由。例如“水能报表”模块要向“能耗统计”模块发出数据请求,由“报表系统”模块到“统计”模块路由请求“能耗统计”模块,反之亦然。
图2 系统框架图
在Caché中对系统的开发分两部分来完成。
a) 采用Caché特有的COS进行底层业务逻辑包括各个接口的开发工作。
Caché 应用服务的核心是非常快速的 Caché 虚拟机,它能够支持两种脚本语言,即COS(Caché Object Script)和 Caché Basic。COS对象脚本语言是一种以面向对象技术为基础的语言,能避免试图把现实世界中的对象实体表达或拆分成为若干个二维关系表的麻烦,从而摆脱“表格型”数据的限制,开发和设计出各种高性能、高伸缩性和高可用性系统。如图3所示,模块的组织是依靠包(Package)来实现的。其中UserMan和ParameterMan包分别代表用户管理模块和计量参数管理模块,Comm 是“公共”模块,也是 UserMan和 ParameterMan模块的父模块,不仅要负责 UserMan和ParameterMan模块的管理, 而且需要管理自己的数据。UserMan、AnalysisMan、StatisticsMan是同层次的模块。
在包内, 每个模块是由类组成的。在 UserMan模块内,有3个类: UserDefined (用户属性类)、PermisDefined (权限属性类)、RoleDefined (角色属性类)。这里的每个类相当于关系型数据库内的一张表, 类的实例相当于关系表中的记录。在关系型数据库里, 表之间引用需要依靠外键来实现。而Caché数据库中, 直接设置类中的一个属性的类型为另一个属性,即可简便的完成表的关联。如在UserDefined类中设置其私有属性 userRole的类型为 RoleDefined:Property userRole As RoleDefined。
用 SQL 查看, UserDefined表中 userRole填写的是RoleDefined表的记录ID,从而实现了关联。
图3 模块组织结构
Zen类的访问原则:Zen类中的属性都默认设置为私有属性, 要想访问, 必须通过类的方法访问。而方法分为“ClassMethod(类方法)”和“Method(普通方法)”,如果类的方法不设置成“类方法’,是普通的方法, 需要访问方法时必须先将类实例化后方可访问。如:
如果把类的方法设置成“类方法”, 可以在不实例化的情况下就直接调用, 如:
Zen作为CACHÉ的新组件,是一个针对海量数据处理的 web应用程序进行专门优化的可扩展高级框架,它极大地提高了构建丰富多样的、跨平台的 Web应用的速度,含有的预构建组件的扩展库,包括表格和选择树,使创建和管理复杂进程变得容易和快速。因此,开发人员可以轻松开发反应灵活、界面丰富的 web应用,拥有高性能和完善的界面。UI尝试全部采用B/S架构,利用Zen完成整个 UI系统设计与开发的工作。
本文在模块化概念发展的状况和新趋势基础上,将模块化程序设计方法和面向对象的程序设计方法结合起来,基于面向对象数据库CACHÉ,提出在系统开发的过程中采用分层模块化设计思想并阐述了其设计原则。结合EMIS系统这个特殊的管理系统对分层的模块化的需求, 然后利用分层的模块化设计方法提取并开发完成系统各功能模块。结果表明,这种分层模块化设计方法合理,提高开发效率,降低开发成本,系统的灵活性大大提高,可以在其它各类系统的开发过程中推广这种模式.
本文的创新点在于:提出分层的模块化设计思想并运用到EMIS系统的设计中;全部基于B/S架构,成功采用面向对象的后关系型数据库CACHÉ及其无缝集成Zen技术进行开发。
[1]InterSystems公司.对象与关系之间的矛盾[EB/OL].www.InterSystems.com.
[2]李守振,张南平,常国锋.Web应用分层与开发框架设计研究[J].计算机应用, 2006,32(22):274-276.
[3]吴桂兰.面向方面编程的分析与研究[J].计算机工程与设计, 2008,29(20):5253-5255.
[4]WG10.DCO Mstandards Committee. Strategic Document[M].Chicago: DCOM Standards Committee, 2001:56-57.
[5]John D. Halamka.Care group公司.建立以Caché后关系型数据库为基础的基于 Web技术应用的电子病历系统[J].美国专业数据库管理系统DM杂志,2005,9(01): 251.
[6] 王学龙,卫红春.面向方面编程及其应用现状的研究[J].微电子学与计算机, 2005,22(11):181-189.