|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
缺点:正版成本价格贵(盗版就不说了)、不够安全,大多数服务器用windows系统,没有linux安全毛病
下面已看到了可以呈现的一些分歧范例的毛病,而且有了一些查找毛病的感到。上面将思索怎样制止把毛病引进程序中,只管不克不及包管所编写的程序没有毛病,可是这里归纳综合的很多手艺有助于削减毛病数量。
优秀的编程习气
在编程中制止呈现毛病是和优秀的编程习气相干的,这里有很多事情我们要做,以削减把毛病带进网页的大概性。大概有些人因接纳某个手艺而走向极度,乃至必定水平上在某个特别成绩上因墨客气实足而引进了更多的毛病。固然编程职员也不成能接纳了这里列出的一切手艺。
要思索的次要内容是:
·代码的格局化和缩进编排。
·变量显式标明。
·变量转换为符合的数据范例。
·利用成心义的变量定名商定。
·封装剧本。
·注重潜伏的毛病情形。
1.代码的格局化和缩进编排
很多VBScript编程员懒于格局化编排其誊写的程序。只管这其实不拦阻程序运转,但这使得查找那边发生了毛病变得坚苦。比方,在后面我们看到的程序中,丧失了一个EndIf,因为嵌套布局的缩进,毛病在那里是相称分明的:
objCounters.RemovestrCounterName
Response.Write"Removedcounter"&strCounterName
<---missingEndIfshouldbehere
EndIf
EndIf
%>
假如程序看起来像上面所示的那样,寻觅毛病将不是一件易事:
<%ifLen(Request.Form("cmdSet"))then
strCounterName=Request.Form("lstSet")
strNewValue=Request.Form("txtSet")
ifisnumeric(strnewvalue)then
intNewValue=cint(strNewValue)
objCounters.SetstrCounterName,intNewValue
Response.write"Setcounter"&strCounterName&"to"&strNewValue
else
Response.writestrNewValue&"isnotavalidnumber"
IfLen(Request.Form("cmdRemove"))then
StrCounterName=Request.Form("lstRemove")
objCounters.RemovestrCounterName
Response.write"Removedcounter"&strCounterName
endif
EndIF
%>
2.显式标明变量
VBScript撑持OptionExplicit语句。在一个剧本页面的开首拔出OptionExplicit语句时,能够制止利用没有效Dim命令(或用于静态数组的ReDim)界说的变量。仿佛不必要这么做,由于剧本言语同意经由过程给一个变量赋值来创立一个必要的变量。但是用OptionExplicit举行界说有助于制止毛病,出格是那些难以发明的引发剧本发生不准确了局的逻辑毛病。
比方,编写以下程序:
<%
getvalueforcalculation
strSalesTotal=Request.Form("SalesTotal")
curSalesTotal=CCur(strSalesTotal)
sngCommissionPercent=2.5
calculatecommissionpayment
sngCommission=curSalesTotal*(sngComissionPercent/100)
%>
运转这段程序不会发生毛病(固然,除非用户给发卖算计值赋了不法的值)。但是这段程序老是会发生0的了局,由于在程序的最初一行中sngCommissionPercent变量名拼写错了。剧本注释器将发生一个新的变量名(叫作sngComissionPercent),因为没有赋值,在数学盘算时前往值总为0。
为了避免这类毛病,仅需在程序开首增添OptionExplicit语句。
<%
OptionExplicit
DimstrSalesTotal
DimcurSalesTotal
DimsngCommissionPercent
getvalueforcalculation
strSalesTotal=Request.Form("SalesTotal")
curSalesTotal=CCur(strSalesTotal)
sngCommissionPercent=2.5
calculatecommissionpayment
sngCommission=curSalesTotal*(sngComissionPercent/100)
%>
这时候,当剧本引擎试图注释程序时将辨认出一个语法毛病,而且可以指出此变量没有声明,如-15所示:
在JScript中援用一个没有声明的变量将前往一个“Undefined”信息,而且在试图利用变量之前,可以检测到这类情形。
3.变量转换为符合的数据范例
转头看看后面的程序,大概发明用CCur函数把用户供应的数据转换成了泉币型数据范例。在VBScript中,有一系列相似如许的数据变形变更函数,在第3章中有具体的形貌。
blnBoolean=Cbool(varVariant)convertstoaVariantofsubtypeBoolean
bytByte=Cbyte(varVariant)convertstoaVariantofsubtypeByte
curCurrency=CCur(varVariant)convertstoaVariantofsubtypeCurrency
datDate=CDate(varVariant)convertstoaVariantofsubtypeDate
dblDouble=CDbl(varVariant)convertstoaVariantofsubtypeDouble
intInteger=CInt(varVariant)convertstoaVariantofsubtypeInteger
lngLong=CLng(varVariant)convertstoaVariantofsubtypeLong
sngSingle=CSng(varVariant)convertstoaVariantofsubtypeSingle
strString=CStr(varVariant)convertstoaVariantofsubtypeString
假如不克不及完成变更,也就是说变量内容对新数据范例来讲是有效的,便会呈现一个运转期毛病。但是,假如对数值范例举行变更,我们但愿这个数值是无效的,而且能在程序中利用。因而可以检测一个平衡的值关于避免毛病的呈现是一件“幸事”。
假如想把输出空格作0看待,而且把任何其他有效的输出作为用户毛病看待,后面程序变成:
strSalesTotal=Request.Form("SalesTotal")
IfLen(strSalesTotal)=0Then
novalueentered,soassumezero
curSalesTotal=0
ElseIfNotIsNumeric(strSalesTotal)Then
notavalidnumber,soreportanerrorandstop
Response.Write"Thevalueyouenteredisnotavalidnumber."
Response.Flush
Resonse.End
Else
OKtoconverthestringvalueanduseit
curSalesTotal=CCur(strSalesTotal)
EndIf
在JScript中,一切的变量都是工具,而且有typeOf()办法。可使用typeOf()来断定存在变量中的数据是甚么范例,见第3章中的具体叙述。
也能够对“null”(VBScript中为Null)举行测试包管在程序利用各类变量之前它们已赋了值。一个惯例是从数据库中取得数据时,数据库中的字段内容常常是Null,暗示没无数据。
4.变量定名和编码商定
浏览过本章和后面几章后,读者能够看出我们对变量名利用三个字母的前缀,用以指明它所代表的数据范例。只管在这两种剧本言语顶用ASP供应的一切变量都是Variant(或JScript中的等价物)范例的,但用变量名来辨别出存储在个中的数据的范例还是十分有效的,有助于避免编写程序时堕落。
有很多分歧的变量命商定,常常利用的见表7-2:
表7-2变量范例及前缀
变量范例
前缀
布尔型(Boolean)
bln
字节型(Byte)
byt
日期/工夫型(Date/Time)
dat或dtm
汇合型(Collection)
col
双精度型(Double)
dbl
整型(Integer)
int
长整型(Long)
lng
工具型(Object)
obj
单精度型(Single)
sng
字符型(string)
str
关于一个包括函数和子程序的网页,指出某个变量是不是已声明或存在于任何函数和子程序以外长短常有效的。若已声明,则该变量对网页来讲是全局变量。对全局变量加上“g”前缀,以是一全局字符串变量大概被定名为gstrMystring;相似的,以“a”为前缀的变量是数组或数组元素。
程序正文
很多编程职员感到到对程序增添正文不但增添了不用要的开辟工夫,并且也减缓了网页的运转速率,由于剧本注释器每次必需先读全部程序,然后再跳过这些正文。只管这类概念有必定的事理,可是一个月后再回过火来想读懂没有正文的程序,长短常坚苦的。
最少应当对经常使用函数和子程序举行正文以便你和其别人能从头利用这些程序。出格是,利用新的Server.Execute办法加倍简单(具体情形参阅第4章)。上面是微软供应的一个例程的正文格局。
*****************************************************
Purpose:whattheroutineisdesignedtoachieve
Inputs:alistofalltheparameterstotheroutine
parameter1:description,data-type,etc.
parameter2:description,data-type,etc.
Returns:whatdatatypeisreturned,andwhatitcontains
Comments:othercommentsabouttheroutine,updatehistory,etc.
*****************************************************
5.封装剧本言语以便代码重用
方才看到了怎样正文子程序和函数以便易于从头利用。面向工具编程的道理是创建在程序代码重用的基本上的,而且SSI的#include和新的Server.Execute办法使挪用存储在程序库中的函数更简单。
比方,假如有一系列函数用于盘算税收和商品的对付用度。可把包括这段程序的页面拔出其他页面中:
<!--#inculdeVIRTUAL="/library/code/online_sales/tax_and_delivery.inc"-->
包括文件必需含有剧本定界符,大概用<SCRIPTRUNAT="SERVER">...</SCRIPT>大概用<%...%>,每个子程序和函数应当接纳其请求的数值做参数,而且用函数值或更新的参数前往了局。不克不及利用全局变量,何况分歧网页之间的全局变量也是不成用的。但在主网页中的程序能平安地挪用所需的函数和子程序。
别的可以使用Server.Execute(大概Server.Transfer)把实行转到另外一个网页。假如有一段ASP代码用来为客户创立在线推销一览表,这类办法长短常有效的。它包括HTML用来创立题目、表格,用代码举行盘算并用Request汇合的内容填写响应值(记着不克不及利用Server.Execute或Server.Transfer把剧本变量传到另外一个网页)。别的,运转的网页可以撑持函数、类界说(在VBScript中),大概其他计划为可从头利用的内容。
6.注重潜伏的毛病情形
编程时不论怎样细心,好比在利用和对变量范例转换之前对变量值举行测试,但总仍是有一些情形不克不及制止毛病的呈现。分明的例子是:当利用FileSystemObject工具的办法想法会见一个用户指定的文件时,不克不及断定这个文件是不是已挪动、删除大概标志成只读型,一切这些操纵都大概使程序不克不及事情。
其他相似的情形多是,当会见数据库或其他数据存储时,对用户帐户而言,偶然请求某一层权限。在这类情形下,大概由于必要的会见不克不及完成,使程序不克不及事情。
能够经由过程接纳防备性措施编写程序,来测试相似的潜伏毛病。比方,可使用Tools组件大概FileSystemObject工具的FileExists办法来检察,是不是一个文件在会见之前就已存在了;大概利用PermissionChecker组件来检察以后用户帐号是不是有会见必要的文件或资本的权限;也能够经由过程利用FileSystemObject取得一个文件的属性设置,以便在删除或重写之前检察文件是不是是只读的。
假如不思索大概产生的毛病并避免毛病产生的话,这些情形和很多相似的情形都多是潜伏的运转期毛病源。
7.最初的测试
很分明,测试是对毛病的最好提防办法。毛病能经由过程使用程序影响到其他操纵,假如不实时发明能引发不成估计的丧失。用各类数值(如用户提交的,大概会见一个数据库失掉的数据)对网页举行测试。同时,更主要的是,假如接纳我们不但愿的值会产生甚么。程序能制止这些情形发生其他毛病大概制止侵扰正在测试的子程序吗?
好的测试手艺应当包含一系列值,准期看的值、界限前提值和超越界限的值。用希冀传送到网页的值举行测试是应当常常做的事情,一样超越界限的值一般对照简单制止。比方,能够限定可承受的数值局限为-100~+100,程序以下:
If(intValue<-100)or(intValue>100)Then
notavalidvalue,soreportanerrorandstop
Response.Write"ValuemustbebetweenC100and+100inclusive."
Response.Flush
Response.End
EndIf
但是要记着检察界限前提,下面的程序能处置-100和+100吗?想把数据限定在-100~+100中吗?取0时会产生甚么?下面的程序会显现“DivideByZero”毛病而终极中断实行吗?
由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; |
|