首页 理论教育 ASP动态网页设计:优秀编程习惯

ASP动态网页设计:优秀编程习惯

时间:2023-11-05 理论教育 版权反馈
【摘要】:在编程中避免出现错误是和良好的编程习惯相关的,这里我们要做许多工作,以减少把错误带进网页的可能性。例如,编写如下程序:〈%′get value for calculationstrSalesTotal=Request.FormcurSalesTotal=CCursngCommissionPercent=2.5′calculate commission paymentsngCommission=curSalesTotal*%〉运行这段程序不会产生错误。为了防止这种错误,仅需在程序开头增加Option Explicit语句。〈%Option ExplicitDim strSalesTotal,curSalesTotal,sngCommissionPercent,sngCommission get value for calculationstrSalesTotal=Request.FormcurSalesTotal=CCursngCommissionPercent=2.5calculate commission paymentsngCommission=curSalesTotal*%〉这时,当脚本引擎试图解释程序时将识别出一个语法错误,并且能够指出此变量没有声明,如图6-1所示。

ASP动态网页设计:优秀编程习惯

在编程中避免出现错误是和良好的编程习惯相关的,这里我们要做许多工作,以减少把错误带进网页的可能性。编程人员要考虑的主要内容如下:

●代码的格式化和缩进编排。

变量显式表明。

●变量转换为合适的数据类型。

●封装脚本。

●注意潜在的错误情况。

●程序测试。

1. 代码的格式化和缩进编排

许多VBScript编程员懒于格式化编排其书写的程序。尽管这并不阻碍程序运行,但这使得查找何处产生了错误变得困难。例如,下面的程序中,丢失了一个End If,由于使用嵌套结构的缩进,错误在哪里是明显容易被发现的。

〈%If Len(Resquest.Form(″cmdSet″))Then

strCounterName=Resquest.Form(″lstSet″)

strNewValue=Resquest.Form(″txtSet″)

If isNumeric (strNewvalue)Then

intNewValue=cint(strNewValue)

ObjCounters.Set strCounterNamem,intNewValue

Response.Write ″Set counter″& strCounterName &″to″& strNewValue

Else

Response .write strCounterName&″is not a valid number″

If len (Request .Form(″cmdRemove″))Then

strCounterName=Resquest .Form(″istRemove″)

ObjCounters .Remove strCounterName

Response .Write ″Removed counter″ & strCounterName

′丢失的 ″End if″应该放此处

End If

End IF

%〉

如果程序像下面所示的那样,寻找错误将不是一件易事:

〈% If Len (Resquest .Form(″cmdSet″))Then

strCounterName=Resquest .Form(″lstSet ″)

strNewValue=Resquest .Form(″txtSet″)

If isNumeric (strNewvalue)Then

intNewValue=cint (strNewValue)

ObjCounters .Set strCounterNamem,intNewValue

Response .write″Setcounter″&strCounterName&″to ″&strNewValue

Else

Response .write strCounter Name&″is not a valid number″

If len (Request .Form(″cmdRemove″))Then

strCounterName=Resquest .Form(″istRemove″)

ObjCounters .Remove strCounterName

Response .write″Removed counter″&strCounterName

End If

End If

%〉

2.显式声明变量

VBScript支持Option Explicit语句。在一个脚本页面的开头插入Option Explicit语句时,可以避免使用没有用Dim命令(或用于动态数组的ReDim)定义的变量。因为脚本语言允许通过给一个变量赋值来创建一个需要的变量。然而用Option Explicit进行定义有助于避免错误,特别是那些难以发现的引起脚本产生不正确结果的逻辑错误。

例如,编写如下程序:

〈%

′get value for calculation

strSalesTotal=Request.Form(″SalesTotal″)

curSalesTotal=CCur(strSalesTotal)

sngCommissionPercent=2.5

′calculate commission payment

sngCommission=curSalesTotal*(sngComissionPercent/100)

%〉

运行这段程序不会产生错误(当然,除非用户给销售合计值赋了非法的值)。然而这段程序总是会产生0的结果,因为在程序的最后一行中SngCommissionPercent变量名拼写错了。脚本解释器将产生一个新的变量名(叫作SngComissionPercent),由于没有赋值,在数学计算时返回值总为0。

为了防止这种错误,仅需在程序开头增加Option Explicit语句。

〈%

Option Explicit

Dim strSalesTotal,curSalesTotal,sngCommissionPercent,sngCommission get value for calculation(www.xing528.com)

strSalesTotal=Request.Form(″SalesTotal″)

curSalesTotal=CCur(strSalesTotal)

sngCommissionPercent=2.5

calculate commission payment

sngCommission=curSalesTotal*(sngComissionPercent/100)

%〉

这时,当脚本引擎试图解释程序时将识别出一个语法错误,并且能够指出此变量没有声明,如图6-1所示。

图6-1 显示的错误信息

3. 变量转换为合适的数据类型

在VBScript中,有一系列类似这样的数据类型变换函数。

binBoolean=Cbool(varVariant) ′转换为布尔子类型的变体

bytByte=Cbyte(varVariant) ′转换为字节子类型的变体

curCurrency=CCur(varVariant) ′转换为贷币子类型的变体

datDate=CDate(varVariant) ′转换为日期子类型的变体

dblDouble=CDbl(varVariant) ′转换为双精度子类型的变体

intInteger=CInt(varVariant) ′转换为整型子类型的变体

lngLong=CLng(varVariant) ′转换为长整型子类型的变体

sngSingle=CSng(varVariant) ′转换为单精度子类型的变体

strString=CStr(varVariant) ′转换为字符子类型的变体

如果不能完成变换,也就是说变量内容对新数据类型来说是无效的,便会出现一个运行时错误。然而,如果对数值类型进行变换,我们希望这个数值是有效的,并且能在程序中使用。因此能够检测一个均衡的值对于防止错误的出现是一件“幸事”。

如果想把输入空格当作0对待,并且把任何其他无效的输入作为用户错误对待,前面程序改为:

strSalesTotal=Request.Form(″SalesTotal″)

If Len(strSalesTotal)=0Then

′no value entered,so assume zero

curSalesTotal=0

ElseIf Not IsNumeric(strSalesTotal)Then

not a valid number,so report an error and stop

Response.Write ″The value you entered is not a valid number.″

Response.Flush

Resonse.End

ok to conver the string value and use it′

curSalesTotal=CCur(strSalesTotal)

End If

也可以对“null”(VBScript中为Null)进行测试,保证在程序使用各种变量之前它们已经赋了值。一个特例是从数据库中获得数据时,数据库中的字段内容经常是Null,表示没有数据。

4.封装脚本语言以便代码重用

面向对象编程的原理是建立在程序代码重用的基础上的,并且SSI的#include和新增的Server.Execute方法使调用存储在程序库中的函数更容易。

在ASP页中,可以通过#include命令指示Web服务器将文件内容插入到文档中,被包含文件的内容可以是允许在HTML文档中使用的任何有效内容。

语法格式:

〈!--#includefile|virtual=Filename--〉

说明:file和virtual参数指定包含文件的路径类型,file指定路径类型为#include命令的文件(称为父文件)所在文件夹的相对路径,被包含文件可以位于相同文件夹或子文件夹中,但它不能处于带有#include命令的页的上层文件夹中;virtual指定路径类型为Web站点上虚拟目录的完整虚拟路径。Filename参数指定要包含的文件名,必须包含文件扩展名,而且必须用引号将文件名括起来。被包含文件可具有任何文件扩展名,但建议使用.inc扩展名。

例如,如果有一系列函数用于计算税收和商品的应付费用,可把包含这段程序的页面插入其他页面中:

〈!--#inculde VIRTUAL=″/library/code/online_sales/tax_and_delivery.inc″--〉

包含文件必须含有脚本定界符,或者〈SCRIPTRUNAT=″SERVER″〉⋯〈/SCRIPT〉,或者用〈%⋯%〉,每一个子程序和函数应该采用其要求的数值做参数,并且用函数值或更新的参数返回结果。不能使用全局变量,况且不同网页之间的全局变量也是不可用的。但在主网页中的程序能安全地调用所需的函数和子程序。

另外可使用Server.Execute把执行转到另一个网页。

5.注意潜在的错误情况

编程时不管如何仔细,总还是不能避免错误的出现。明显的例子是:当使用FileSystemObject对象的方法设法访问一个用户指定的文件时,不能确定这个文件是否已移动、删除或者标记成只读型,所有这些操作都可能使程序不能工作。

其他类似的情况可能是,当访问数据库或其他数据存储时,对用户账户而言,有时要求具有某一层权限。在这种情况下,可能因为需要的访问不能实现,使程序不能工作。

可以通过采取预防性措施编写程序,来测试类似的潜在错误。例如,可以使用Tools组件或者FileSystemObject对象的FileExists方法来查看,是否一个文件在访问之前就已存在了;或者使用Permission Checker组件来查看当前用户账号是否有访问需要的文件或资源的权限;也可以通过使用FileSystemObject获得一个文件的属性设置,以便在删除或重写之前查看文件是否是只读的。

如果不考虑可能发生的错误并防止错误发生的话,这些情况和许多类似的情况都可能是潜在的运行时错误源。

6.最终测试

很明显,测试是对错误的最好防范方法。错误能通过应用程序影响到其他操作,如果不及时发现可能引起不可估量的损失。应用各种数值(如用户提交的或者访问一个数据库得到的数据)对网页进行测试。

好的测试技术应该包括一系列值,如期望的值、边界条件值和超出边界的值。用期望传送到网页的值进行测试是应该经常做的工作,同样超出边界的值通常比较容易阻止。例如,可以限制可接受的数值范围为﹣100~100,程序如下:

If(int Value〈﹣100)or(intValue〉100)Then

′not a valid value,so report an error and stop

Response.Write″Value must be between -100 and +100 inclusive.

Response.Flush

Response.End

End If

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈