提高PB程序的健壮性

作者:达通兴电脑科技公司(www.study01job.com) 郭宝利

一、安全的应用软件

在应用软件的开发中,重要的一个因素是要给用户提供一个安全的工作环境,在软件中不应藏有任何“地雷”,在用户将要进行破坏性的且难以恢复的操作时,系统应当给予应有的提示。用户只有充分相信软件是安全的,才会乐于使用它,才会放心地去使用它,才能更高效地去探索这一软件所提供的新功能。

二、什么是安全的应用

最重要的,但也是最不容易实现的是排除可能会使应用非正常终止的错误。在任何情况下,最终用户都不应看到应用出现保护性错误而退出系统,这种错误最容易使用户对软件失去信心。因为这意味着用户要中断思路,并费时费力地重新登录,而且已进行的操作也会因没有存盘而全部丢失。当然造成系统终止的原因很多,可能是网络、硬件、系统软件或是  PowerBuilder本身的问题,但是开发者应当尽量周全地考虑到各种可能发生的问题,使出错的可能降至最小。特别是使用PowerBuilder开发的软件的确经常会出现保护性错误,但是开发人员却不能因此怨天尤人,而是要多做测试,选择最为保险的方法实现相同的功能。

此外,在使用PowerBuilder编程时,还有一种常见的导致非正常终止的情况是由于程序员自己的原因造成的,这就是变量联接滞后问题,即在编译时定义一个有效的对象类,但是在运行时却没有创建它的实例或这个实例已注销(destroy);这时如有一段代码引用到这一对象,系统却无法在内存中找到它的实例,由此导致应用终止。所以,在引用变量时,应当首先检查它是否存在实例,例如,在一个窗口中引用了另外一个窗口的对象,就应首先检测它在执行代码之前是否已经创建了一个实例。

在下面的例子中,win_A这一窗口对象可能在代码执行时并没有创建,因此就应当在执行前用IsValid函数来检查其是否有效:

If IsValid(win_A) Then

 Close(win_A)

End If

三、使用数据窗口中应注意的问题

PowerBuilder的代码将引用很多数据窗口中的列,指代这一列的方法可以是列名也可以是列号。列号是指这一个数据窗口在执行 SELECT语句中排列的顺序号,如果习惯于使用列号引用某列,要注意可能会在数据窗口的SELECT语句中移动或删除某些列,如果程序员想不起所有引用过这个数据窗口的代码,这时就有可能出现数据类型不匹配的错误。使用列名来引用则可以避免这类错误,但是这里使用的字符串在编译时PowerBuilder并不验证引用得是否正确,只有在运行时,系统才可能发现使用的字符串在数据窗口中不存在,并提示错误,退出应用。这种错误一般比较难以发现,一个有效的方法是尽可能使用Object Browser来剪贴,以减少录入错误。

安全的环境还应当注意尽可能避免用户无意中录入无效的数据。在GUI下,有许多控件可以以十分友好的方式限制用户输入值的种类。例如一个多选框只有两种值的选择,所以当用户做出选择的可能性只有两个时,可以采用这一控件,免去了另外编程进行输入有效性验证的麻烦。当选择的可能再多一些时,可以采用单选钮,每一种选择都是有效的,用户不可能输入任何一种无效的选择。同理,采用ListBox,DropDownDataWindow和DropDownListBox等标准控件都可以有效地避免用户无效输入,而不必另外编程来进行有效性验证,同时可避免用户在某一个输入点反复做输入尝试而耽误很多时间。

在一个应用系统中,开发者应当避免用户做出未经授权或没有意义的操作,在PowerBu- ilder中菜单和按钮等对象有Enabled和Visible属性,因此对用户未授权或无法进行的操作应将相应对象的属性改为Disabled和Invisible。例如,在一个窗口中有一个数据输入窗口和一个删除按钮,在编辑一条新记录时,删除按钮是无效的,因此,这个按钮的属性应为Disabled。

当窗口的状态发生变化时,应当随时改变控件或菜单项的这两个属性。

当对象无效时,使用该控件的Disabled属性还是Invisible属性是个人习惯问题。一般地,在一个菜单项或控件永远是无效时应当使用Invisible属性,例如,一个用户打开一个有删除按钮的窗口,但是这个用户没有删除权限,那么这个按钮就应当是不可见的;而如果用户有权删除,只是在当前状态下,无法执行删除功能,如编辑新记录,这时该按钮应当设置成Disabled。

数据窗口是一个单一的封装的对象,当不希望用户输入某一列时,不能将整个数据窗口的属性设成Disabled,而是应当采用其他的方法,一般来讲,有以下三种方式。

首先,将该列的Tab Order设为0,这样用户将无法按Tab键或用鼠标聚焦在该列上。如果采用这一方法,应当将其原有的Tab Order值存储在一个实例变量中,以便在需要时恢复。

其次,将列的Display Only或Protect属性设为True。这两个属性设为True时,可以使该列得以聚焦(只要Tab Order不为0),用户还可以在该列上选中一些文字以及进行水平、垂直滚屏 ,只是这一列的值不能做修改。如果数据库中的某列大篇幅的多行文字只能显示而不能修改时,可以采用这一方法,但应注意该列的Tab Order不能为0,这样可以保留用户在必要时对其中的部分内容进行拷贝的权利。

时间: 2024-07-30 10:22:45

提高PB程序的健壮性的相关文章

cpu-是否提高了C#应用程序的健壮性同时就降低了CPU的性能?

问题描述 是否提高了C#应用程序的健壮性同时就降低了CPU的性能? 我是基于DoNetFrameWork4.0写的一个WinForm程序在测试程序健状性时我在程序多写了几个判断语句一运行我靠CPU性能一下就升到了90%多太吓人了用的C#语言写的我知道C#在DoNetFrameWork中要先编译成""微软公共语言""再编译成""二进制""给CPU执行我只是在一个if()的里面加了一个或者:即if(||)原文如下:if (((bi

请教如何改善C#中socket通信机客户端程序的健壮性

程序|客户端   我是做Socket的新手,最近做了一个Socket客户端程序,连接Server的时候,如果server存在,并且允许连接的话,程序无错,正常执行:但是如果Server不存在,或者拒绝连接,程序就会卡住,此时不提示出错.开始我以为是没有Catch异常,但是检查了程序,异常情况都Catch掉了,程序还是卡. 请各位大虾帮忙指正!谢谢,以下是我这个模块的代码! using System;using System.Collections;using System.ComponentMo

浅析:setsockopt()改善socket网络程序的健壮性

1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的

ios-关于程序健壮性的问题

问题描述 关于程序健壮性的问题 从服务器获取到的数据或提交到服务器的数据有可能是nil,那我们是否需要对需要用到的每个数据都判断其是否为nil呢? 如果是的话,会不会有些繁琐? 尤其是当从服务器返回的数据或提交到服务器的数据比较多的时候.问一下该怎么保证 程序的健壮性同时又不让程序变得很臃肿. 这是我的从服务器获取数据的代码片段 NSDictionary *data = responseObject[@"data"]; NSArray *list = data[@"list&

欧洲支持采用先进技术提高通信网络健壮性

北京时间5月29日晚间消息,据国外媒体报道,欧洲网络与信息安全署(以下简称"ENISA")呼吁普及先进网络技术--特别是IPv6.DNSSec和MPLS,提高网络的健壮性. ENISA称,这些先进技术可以提高电信网络的安全性和健壮性,减轻黑客攻击和其他恶意攻击的影响.但是,如何部署这些先进技术的知识还不普及.ENISA指出,"汇编"这些知识是推动先进网络技术普及的有效途径.ENISA发现,各大运营商缺乏合作和相关知识的匮乏可能影响网络的安全性. ENISA执行主任安

最大限制地提高代码的可重用性

    重用是一种神话,这似乎正在日渐成为编程人员的一种共识.然而,重用可能难以实现,因为传统面向对象编程方法在可重用性方面存在一些不足.本技巧说明了组成支持重用的一种不同方法的三个步骤. 第一步:将功能移出类实例方法由于类继承机制缺乏精确性,因此对于代码重用来说它并不是一种最理想的机制.也就是说,如果您要重用某个类的单个方法,就必须继承该类的其他方法以及数据成员.这种累赘不必要地将要重用此方法的代码复杂化了.继承类对其父类的依赖性引入了额外的复杂性:对父类的更改会影响子类:当更改父类或子类中的

最大限制地提高代码的可重用性,克服传统面向对象编程方法在可重用性方面的不足

编程|对象     重用是一种神话,这似乎正在日渐成为编程人员的一种共识.然而,重用可能难以实现,因为传统面向对象编程方法在可重用性方面存在一些不足.本技巧说明了组成支持重用的一种不同方法的三个步骤. 第一步:将功能移出类实例方法由于类继承机制缺乏精确性,因此对于代码重用来说它并不是一种最理想的机制.也就是说,如果您要重用某个类的单个方法,就必须继承该类的其他方法以及数据成员.这种累赘不必要地将要重用此方法的代码复杂化了.继承类对其父类的依赖性引入了额外的复杂性:对父类的更改会影响子类:当更改父

教你用Type Hint提高Python程序开发效率_python

简介 Type Hint(或者叫做PEP-484)提供了一种针对Python程序的类型标注标准. 为什么使用Type Hint?对于动态语言而言,常常出现的情况是当你写了一段代码后,隔段时间你可能忘记这个方法的原型是什么样子的了,你也不清楚具体应该传入什么类型的参数,这样往往需要你去阅读代码才能定义每个类型具体是什么.或者当你使用一个文档并不是特别完全的第三方库,你不知道这个库应该如何使用,这都会很痛苦. 现在,借助Type Hint,你可以实现:      1.实现类型检查,防止运行时出现的类

Java核心技术卷I基础知识1.2.4 健壮性

1.2.4 健壮性 Java的设计目标之一在于使得Java编写的程序具有多方面的可靠性.Java投入了大量的精力进行早期的问题 检测.后期动态的(运行时)检测,并消除了容易出错的情况--Java和C++最大的不同在于Java采用的指 针模型可以消除重写内存和损坏数据的可能性. Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题.至于第二点,对于曾经花费几个 小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性.