在VBScript5.0中,微软加入了强大的类功能。在许多情况下VBScript类使用起来都非常顺手。这个新的特征改变了ASP代码的方式,比如说,到目前为止,我们用VB或者VC++编写组件,并且在ASP页面中使用它们。我们中的大部分人不需要考虑使用面向对象的方法,只需要在ASP页面中编写代码。现在是改变的时候了。
为什么使用VBScript类
在ASP开发中,我们可以有众多的选择去做面向对象的编程,比如VB,VC++,Dephi,等等。但是,对于ASP编程人员来说,面向对象的基于VBSCript的开发确实是一个新颖的方法。在VBScript5和更高版本,微软在脚本语言中加入了类的扩展性。之所以要选择VBScript类方式,以下是几个因素:
简单而且功能强大
当你没有时间去创建、编译和开发COM组件时,使用VBScript类就是很好的替代方法,它能以同样的方式完成同样的工作。
非常适用于商业用途
一个典型的Web N层体系结构如下图所示:
代码的简单性以及易维护性,使得VBScript类对象非常适用于商业用途。比如说,如果你用VB编写了一个商业用途的组件对象,每当商业规则发生变化时,你都必须重新编译、生成并且注册这个组件,而且有时,还需要重新启动Web服务器。
对于用VB编写的商业组件,如果转换为VBScript组件,你就可以随意改变商业规则了。下面让我们比较以下VB组件与VBScript类的优点与不足。
VBScript类与COM组件的比较
VBScript类的优点
1、VBScript类代码容易使用和管理。
2、VBScript类对象是多线程的。
3、无论做任何改变,都不需要重新编译、生成和注册组件。
4、从一个服务器移植ASP应用到另一个服务器非常得简单,这只需要从一个服务器拷贝文件到另一个服务器,而不需要在新的服务器上重新生成并且注册组件。
5、VBScript类对象与ASP页面在同一内存空间运行,有利于应用程序的性能。而MTS中的COM组件是运行在MTS内存池中的。
VBScript类的不足
1、VBScript类是解释执行的。
2、与其他COM组件比较,VBScript类的错误捕捉比较困难。比如说,在VB类组件中,你可以判断错误类型:
....
... If lngQty $#@60; 10 then
Err.Raise VBObjectError + 100,"Method: Check", "Quantity is less than 10."
End if
....
....
3、在VBScript类中,变量类型的种类有限。
4、VBScript类有些局限性,比如:不能存取系统注册表、环境变量、Win32 API等等。
5、在VBScript类中不提供一些用户事件。
6、调试VBScript类有些难度。
7、没有方法管理VBScript类对象的不同版本。
8、VBScript类不具备MTS事物处理模式。
eShop的例子
上面讨论了为什么使用VBScript类,以及使用VBScript类的优缺点。下面举个例子来描述使用VBScript类的优点。
不象VB,VBScript使用“Class......End”语句来分离类内容。与VB一样,对于属性与方法,VBScript类提供了private和public的范围关键字。
下面将调用程序“eShop”,进而执行卖书功能。这里是数据库设计:
注意:在上图数据库结构中,ISBN是做为表tbl_MA_Transaction与tbl_LU_Books的联系关键字,CreditCardID是做为表tbl_MA_Transaction与tbl_LU_CreditCard的联系关键字。
||||||程序设计
在eShop的例子中,用户将选择书籍、数量和信用卡的类型,并输入信用卡号码和邮寄地址。这个应用程序执行3层结构。下面用VB创建一个基于商业层次的组件。
下图是eShop应用的图示:
我知道许多开发者都对商业规则与数据检查感到困惑。在以上eShop的例子中,数据检查包括:用户姓名、地址、所在城市、州以及邮政编码是否为空;进一步检查数量字段是否是一个合法的数字值。
那么什么是商业规则呢?商业规则就是控制商业的条例,比如说:
1、不会出售小于2本数量的书(听上去这很怪,是吗?)
2、eShop例子中只卖书给美国用户
3、根据州与邮政编码计算税金。比如:对于CA洲的用户,征收8.5%的税金。
以上就是商业规则。它们根据数量范围、地理位置控制着商业行为。
VB类的解决方法
让我们在VB类中执行商业规则1和3:
Add a private property
This is a write only property
Property Let Value(vData As Variant)
On Error GoTo ErrHand
If IsArray(vData) = False Then
Err.Raise 8000, "Property: Value", "Invalid data. An array is expected!"
GoTo CleanExit
ElseIf UBound(vData) $#@60;= 10 Then
Err.Raise 8000, "Property: Value", "Invalid data. An 10 elements array is expected!"
GoTo CleanExit
Else
mvarISBN = vData(CnIsbn)
...
...
mvarZip = vData(CnZip)
End If
CleanExit:
Exit Property
ErrHand:
Err.Raise Err.Number, "Property: Value, " & Err.Source, Err.Description
Exit Property
End Property
Add the Business rule checking Method
Public Function Check(vData As Variant) As Boolean
On Error GoTo ErrHand
Check = False
Assign the values to the property
Value = vData
mvarSalesTax = 0
Check the business rules
If mvarQty $#@60; 2 Then
Err.Raise 8000, "Method: Check", "Our minimum selling quantity is 2."
GoTo CleanExit
ElseIf UCase(mvarState) = "CA" Then
mvarSalesTax = 8.5
End If
Call the Data layer components to
insert the data into the database.
...
...
...
Check = True
CleanExit:
Exit Function
ErrHand:
Err.Raise Err.Number, "Method: Check, " & Err.Source, Err.Description
Exit Function
End Function
||||||在ASP中调用VB组件对象
下面是调用VB组件的ASP代码:
$#@60;%
Dim objBus
Dim blnRtnValue
Dim ErrNo
On error resume next
Set objBus = CreateObject("TheeShop.BU_eShop")
BlnRtnValue = ObjBus.Check(Array(...))
if err.number $#@60;$#@62; 0 then
ErrNo = err.number
If ErrNo = 8000 then
Do something
elseif ErrNo = 8001 the
Do something
end if
end if
If BlnRtnValue = True then
Response.Write "You order was successful!"
End if
Set objBus = Nothing
%$#@62;
完成了测试后,就需要编译并生成组件,安装在服务器上。有时候,需要重新启动服务器才能让组件生效。
一个较好的解决办法
在动态的商业世界中,你不可能真正地预见商业规则。比如,在一个晴朗日子的早上,你的公司就可能改变一下政策。管理者可能让你修改代码,从而允许最小购书量从2减少到1,或者,政府提高货减少了税率。遇到这种情况,你就必须要修改VB组件,重新编译,重新启动服务器,重新注册新的组件。这将花费很多时间与精力!
在数字化的世界中重新启动服务器是不容易的。随时都会有用户访问你的站点,所以你要找到一个访问者最少的时间去做重新启动的工作。而且,你不能确定还要修改多少次商业规则,所以可能重复地做着上述工作。
但是,使用VBScript类就是一个较好的解决办法。当你用VBScript类开发商业组件时,改变和更新这些规则都是很简单的,这就象编辑ASP页面一样。与VB组件比较,改变商业规则后的组件更新,使用VBScript类,需要更少的时间。
VBScript类代码
下面来看看VBScript类的例子。在VBScript类中,商业规则的执行将改变一些。我们将用一个叫做Check的public方法创建商业组件对象,这个方法接受2个参数:Quantity 和 State。如果商业行为失败,方法返回-9。成功的话,就返回税率百分比。
$#@60;%
Class BU_eShop
****************************************
Declare private class variables.
****************************************
Private mvarSalesTax
****************************************
Define class methods.
****************************************
Function Check(vQty, vState)
On error resume next
Check = -9 Return Failed
mvarSalesTax = 8.5
If Cint(vQty) $#@60; 2 then
Exit Function
Elseif ucase(vState) = "CA" then
Check = mvarSalesTax
Else
Check = 0
End if
End Function
End Class
%$#@62;
注意:将VBScript类保存在一个单独的include文件中,是一个好的编程思路。以上的例子就是保存在Bu_eShop.inc中。
在ASP中调用VBScript对象组件
下面是在ASP调用VBScript商业组件对象的代码:
$#@60;!-- #include file="Bu_eShop.inc" --$#@62;
$#@60;%
Dim objBus
Dim objData
Dim RtnData
Set objBus = New BU_eShop
RtnData = ObjBus.Check(vQty, vState)
If RtnData = -9 then
Response.Write "$#@60;H4$#@62;Sorry!, the business rule failed$#@60;/H4$#@62;$#@60;BR$#@62;"
End if
Then call the Data conponent with the data and Sales Tax information.
...
...
Set objData = Nothing
Set ObjBus = Nothing
%$#@62;
总结
VBScript类的功能非常强大,而且简单易用,它们给ASP应用开发带来了一些新鲜的感觉。而且,VBScript类将复杂的编程模式转变得更简单,大大地提高了代码的可管理性!