荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: zzt (我命由我不由天), 信区: Program
标  题: [转载]信息隐蔽性设计
发信站: BBS 荔园晨风站 (Tue Jun  1 17:20:47 1999), 转信


发信人: stonec (Adong), 信区: Programme
标  题: [转载]信息隐蔽性设计
发信站: 网日情怀 (Thu Dec  3 13:30:33 1998) , 转信


                  信息隐蔽性设计

                                                  赵晓华 张明

    有关软件工程的隐蔽原则一般是这样描述的:包含在模块内的信息对于无需
这些信息的其他模块是不可存取的,即将不需要的信息都隐藏起来,只允许其他模
块知道其本身所需的信息。

    如果说最简单的就是最好的,那么信息隐蔽性最强的就是最简单的。从方法
学的总结到推广,从软件设计到软件实现,从手工开发到工具辅助,信息隐蔽原则
无时无处不发挥着极有效的指导作用。

                  一、 隐蔽原则与其他原则的统一

    1.方法学都基于软件工程基本原则

    基本原则是行为所依据的法则和规范。无论什么方法学从知识工程角度来
说,都是运用软件工程方法学基本原则的规则、策略及工具的集合。其中抽象原则
是最重要的,它给出软件工程问题求解全过程的最基本原则,其他原则是对抽象原
则的补充。

    指导如何抽象的基本原则大体上可以分为体系规范原则和模块规范原则两
类。前者是规范整体解题思路及解的验证,包括形式化原则、分割原则、层次原
则、概念完整性原则、完备性原则;后者则是与子问题有关的原则,包括隐蔽原
则、局部化原则、逻辑独立性原则。面向对象的“关系”抽象较多受前者规范,
“对象”抽象较多受后者规范。

    2.基本原则间的相互关联

    虽然可以做“体系规范”和“模块规范”的大体分类,但基本原则之间并不
是无关的,而是整体与局部间的相互制约,形成一个统一体。

    要求将信息最大限度地隐蔽在子问题(模块)内的隐蔽原则,使模块内部信息封
装化、模块的外部形象黑盒化,与外部的关系最少,所以使满足体系抽象原则的抽
象过程和验证工作简单化,同时也很容易满足模块规范的其他原则,如局部化原则
和逻辑独立性原则。

    例如,不久前我们完成了一个由国外设计的某系统的编程和测试工作。在该
系统设计中,将具有多重关联的多个数据库表的条件组合查询,由一个驻在服务器
端的存储过程来统一完成。客户端用户可以在同一个窗口上对数十项多层交叉的查
询条件任意选择组合,将选定条件送给相应存储过程。从外部来看,存储过程的任
务极为单纯,即根据指定条件找出所有符合条件的记录,将结果写到一个有共享结
构的工作表中,然后把查询正常与否的消息通报给客户端的调用程序。该程序接到
正常查询结束消息后,到指定暂时存放查询结果的工作表中,按一定格式取出结果
并报告给用户。

    我们认为,这是一个全面符合软件工程基本原则的设计典范,而其关键技术
是信息隐蔽设计。首先是遵循隐蔽原则将具有复杂关系结构的多个数据库表的操作
和库表结构封装在一起,实现了完全的信息隐蔽。由于高度信息隐蔽的实现,使这
一组相关库表(超类表)的所有多层交叉组合结构有可能在一个对象(窗口)中完成,高
度满足了局部化原则。由于它的功能单纯、明确,数据库表间接口通过对相应存储
过程传递参数来完成,属于内聚性最强的功能内聚和耦合性最弱的数据耦合,因而
具有很好的逻辑独立性。

    不难想象,几十项查询条件的组合,查询结果显示方式达三四十种是很正常
的。由于在局部化、功能独立化原则下应用对象只是抽象成一个超类窗口对象,在
信息隐蔽设计支持下,这三四十种结果显示功能可以全部相互独立地挂在查询父窗
口下,自然地满足了分割原则、层次原则、概念完整性原则等体系规范原则。

                二、 信息隐蔽性设计的目的和优越性

    1.目的

    探讨信息隐蔽性设计的目的是:分析将信息隐蔽起来有什么好处,以便使问
题求解简单化。

    (1) 好理解

    一般的复杂问题有两个特征,一是解题要参照的信息(接口)太多、太复杂,一
是解题的方法(算法)太复杂。那么要想使之简化,无非是从问题接口和问题解法上
入手。将复杂的接口信息与复杂算法隐蔽起来,剩下的自然是简单的。换句话说就
是实现对象的外部数据结构与算法的封装。

    需要知道的东西越少越好理解。在软件工程中,理解是最繁重的工作之一。
开发过程中从分析人员对用户需求的理解,到设计人员对需求规格的理解,直至编
程人员对软件设计的理解,是一个理解传递的过程。每一级开发人员的目的都应是
将经过自己加工后的、更简单的抽象结果传递给下一级人员,使一级比一级的问题
更抽象、更好理解。因此好的设计人员就是经其加工后传递给下级开发人员的设计
最容易理解,即给出的问题定义越简单、接口越少越好。

    (2) 好实现

    有时好理解却不好实现,即实现算法复杂。但是,如果把复杂算法做成一个
封装的模块对象,使实现者只需知道模块的作用和使用方法就可以得到所期待的输
出结果,而无须知道模块内部的具体实现,因此实现级的问题就可以得到简化。

    (3) 好验证

    复杂问题也不好验证。有些设计看起来好理解,也不难实现,但验证起来却
很难。例如:同是上述国外项目,设计了相当多的功能热键用户接口。对于输入数
据窗口和数据项较多的应用程序,测试起来十分困难。多个功能热键、多种激发方
式、多个输入数据窗口和数据项之间前后控制跳转,这些都是黑盒测试的出发点,
而每个控制节点都以 2 以上的指数方式递增着测试用例数目。即使一般复杂度的应
用,其测试用例也超过 200 类。

    由于采用了这种多控制、多转移的复杂输入方式设计,算法复杂是不可避免
的。简化的办法还是信息隐蔽性设计,将每个热键的多种激活方式触发的内部处理
都写成公共对象且封装起来,供各应用程序继承调用。显然这种隐蔽技术直接简化
了理解和实现。由于公共父类对象已经做过全面集中测试,下层程序继承后的有关
测试绝大部分可以“免检”,所以间接简化了验证,达到“好验证”的目的。

    (4) 好重用

    好验证的设计方法是把算法复杂的对象泛化为超类对象,进行集中实现和集
中测试,使多个下层子类共享父类的实现和测试,所以它也是一种重用方案。好重
用往往是好理解、好实现、好验证的必然结果。不过它是从更高层次上审视信息隐
蔽性的目的。

    2.优越性

    由于信息隐蔽性设计重用性高,因此可以大大降低开发和维护成本。具体可
以从两方面来看其优越性。

    (1)由于将复杂内容都隐蔽到公共超类之中,可以集中优势兵力对公共超类
对象统一进行设计攻关、设计优化和代码优化及测试和修改,所以不仅利于保证设
计和实现的正确性,而且利于提高可维护性、保证数据安全性。总之,有利于从整
体上保证软件的基本质量,降低维护成本。

    (2)由于简化了编程难度,避免了重复劳动,降低了对程序员技术经验水平
的要求,减少了设计说明和理解交流及编程的工作量,因而利于缩减开发成本。

    倘若前述的在国外完成的软件设计不是采用信息隐蔽性设计,倘若我们只有
对复杂的库表结构了如指掌之后才能进行多层交叉组合查询程序的实现,这不仅将
需要许多时间理解库表结构,还需要在北京构筑和国外同样的数据库,录入能体现
复杂数据关系的各种测试数据。由于数据关系映射着应用对象的关系,为此我们还
必须了解满足各种组合查询的数据与应用业务处理间的对应关系,因为稍有理解偏
差,取出的用于统计的数据就会全面失去意义。所以信息隐蔽性设计对于大型软件
开发,特别是分布式的异地开发,是不可或缺的。

    实际上,国外提供给我们的与复杂数据库结构封装在一起的组合查询存储过
程,只是一个桩程序。在我们开发客户端组合查询程序时,它完全是个黑盒子,甚
至没有放到服务器端。但是,它使得组合查询程序只剩下输入数据检验这一单纯功
能了。

               三、 信息隐蔽性设计的基本思路与实践

    信息隐蔽是个原则而不是方法,按此原则设计的系统具有信息隐蔽性,这是
设计优化的一种表现。结构化方法和面向对象方法都追求信息隐蔽性,并且各自具
有一套抽象与实现的思路与方法。在此,我们尝试归纳一下不拘泥于方法学的有关
设计思路与方法。

    1.哪些场合应考虑隐蔽性设计

    总的来说,凡是可以用信息隐蔽性设计、使复杂问题简单化的场合,都应该
采用此设计。

    首先,可以对共同事件、共同处理采用隐蔽性设计。因为重复是问题复杂化
的一个重要原因。例如“输入数据检验”、“退出事件”、“打开事件”、“打印
处理”、“热键的转移控制”、“系统信息输出处理”等,甚至对打印报表的“制
表时间与页号编辑”功能的共同处理。

    其次,可以对接口和环境采用隐蔽性设计。因为接口也是问题复杂化的重要
原因之一。例如,可将静态数据库表及其查询操作隐蔽起来,将复杂关系表及其存
取操作隐蔽起来,甚至可以将所有数据库都隐蔽起来,使低级开发人员根本不必意
识数据库的存在,以及将特殊输入输出装置接口处理隐蔽起来,将与其他系统的接
口处理隐蔽起来等。

    此外,还可以把复杂的算法、概念隐蔽起来,也可以把用户没有权限的功能
隐蔽起来,以保证数据的安全性。

    2.信息隐蔽的实现方法

    我们可以把实现信息隐蔽的物理范围称为隐蔽黑盒。信息隐蔽的实现方法实
际上就是隐蔽黑盒的实现方法与调用方法。隐蔽黑盒一般可以用函数、存储过程、
超类对象、语句系列来实现。使用隐蔽黑盒时,可以用函数、存储过程调用、祖先
继承及程序段复制等相应办法来引用。

    在北京市公路局系统设计中,我们大量应用了隐蔽黑盒技术。除了对很多共
同处理隐蔽化外,在对数据库隐蔽化及隐蔽黑盒运用上,我们做了更进一步的尝
试。

    (1) 服务器端的隐蔽黑盒设计技术

    我们使用触发器来实现对一些数据库超类表(如流水号表) 或共同表操作 (如表
头信息写操作) 的黑盒化。触发器是通过将实现方法与调用方法封装在一起,把调
用方法也隐蔽起来,是最彻底的隐蔽黑盒。这除了使复杂问题简单化以外,还有利
于数据库的安全。因为再严密的客户端操作也无法完全排除网络带来的不安全因素
的影响。而随着网络支持性价比的提高,把数据库相关操作集中在服务器端,客户
端只负责输入数据的正确性检查和结果数据的处理,这显然是一种既讲效率又能保
证数据库数据安全体系结构的方法,是“胖服务器瘦客户机”发展方向的必然取
舍。

    (2) 静态表的隐蔽黑盒设计

    从信息隐蔽的角度看程序中分离出去的静态表,对程序来说也是一个隐蔽黑
盒,它实现了程序中存在变因的控制数据或开关数据对程序的隐蔽(隔离)。静态表
放在服务器端,便于共享和维护。同时,我们用逻辑控制静态表解决了面向不同应
用对象动态组合应用功能这个难题,把没有权限的那一部分功能对用户隐蔽了起
来。

    总之,人们可以认为:隐蔽黑盒就是重用单元,重用单元越多软件开发越简
单,与数据库有关的隐蔽黑盒放在服务器端要比放在客户端好处更多,因此隐蔽黑
盒有着广阔的重用前景。
--
2mKeep It Simple and Stupid 金融电脑之家7;40m0m
提供金融电脑的AS/400,程序/数据库设计,Y2K,汉字处理,自助产品等信息
5mhttp://netease.com/~stonec =stonec.yeah.net
5mhttp://zg169.net/~stonec    =stonec.kstar.com
5mgnet http://person.mm.gnet.gd.cn/b/stonec
5minet http://ftp.maoming.gd.cn/b/stonec7;40m0m

m;31m※ 来源: 网日情怀 bbs.mm.gnet.gd.cn [FROM: 172.21.79.27]m
--
m;33m※ 转寄:.网日情怀 bbs.maoming.gd.cn.[FROM: bbs.hz.gnet.gd.c]m


--



日出东方,唯我不败;
    天上地下,唯我独尊。

※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.143]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店