當在一個(gè)機構內部創(chuàng )建Web應用程序時(shí),有些時(shí)候你會(huì )發(fā)現你自己從一個(gè)應用程序中復制和粘貼相同的代碼到其它的應用程序中。如果你能夠固化所有這些過(guò)程到一個(gè)好用的小包(package)中,其后你就可以在整個(gè)域中使用它了,這樣會(huì )方便很多。
同時(shí),如果你有一個(gè)再三使用的過(guò)程,創(chuàng )建一個(gè)類(lèi)包含你的過(guò)程可能會(huì )比較有用。使用類(lèi)組織你的代碼有一些優(yōu)點(diǎn):它使得你的代碼容易閱讀和調試;你可以將你的類(lèi)輕松的移值到一個(gè)Web服務(wù)中;你為其它開(kāi)發(fā)人員提供一個(gè)抽象工具(從而節省了時(shí)間和資金);同時(shí)在一個(gè)項目的開(kāi)發(fā)階段你還保留了靈活性。
當把你的通用過(guò)程組織到一個(gè)類(lèi)的時(shí)候,你創(chuàng )建一級抽象,允許你在幾乎所有代碼中實(shí)現這些過(guò)程。例如,假設在你創(chuàng )建的每個(gè)Web應用程序中,你需要初始化用戶(hù)信息。這個(gè)初始化過(guò)程包括在用戶(hù)登錄到你的應用程序時(shí)根據用戶(hù)憑證所做的一些數據庫服務(wù)器連接。如果你在每個(gè)應用程序中都需要完成這個(gè)任務(wù)的話(huà),那么將你的代碼固化到一個(gè)類(lèi)中相當有意義。下面是方法:
Dim MyToolbox
Set MyToolbox = New CToolbox
Response.Write "UserName: " & MyToolbox.UserName & "<BR>" & vbCrLf
Response.Write "UserPhone: " & MyToolbox.UserPhone & "<BR>" & vbCrLf
Set MyToolbox = Nothing
Class CToolbox
Private m_conn, m_rs
Private m_username, m_userphone
Public Property Get UserName()
UserName = m_username
End Property
Public Property Get UserPhone()
UserPhone = m_userphone
End Property
Private Sub Class_Initialize()
Set m_conn = Server.CreateObject("ADODB.Connection")
m_conn.ConnectionString = "Some connection string"
m_conn.Open
Set m_rs = Server.CreateObject("ADODB.Recordset")
Set m_rs.ActiveConnection = m_conn
m_rs.Open "SELECT * FROM Users WHERE userid = ‘" &
Request.ServerVariables("LOGON_USER") & "‘"
If Not m_rs.EOF Then
m_username = m_rs.Fields("username")
m_userphone = m_rs.Fields("userphone")
End If
End Sub
Private Sub Class_Terminate()
On Error Resume Next
m_rs.Close
Set m_rs = Nothing
m_conn.Close
Set m_conn = Nothing
End Sub
End Class
從例子中你可以看到,UserName和UserPhone屬性在類(lèi)初始化之后就會(huì )有值。你可以將這個(gè)類(lèi)的代碼放到ASP代碼的底部。然后在其余的代碼中其功能就可以在使用,不用實(shí)例化ADO對象,進(jìn)行數據庫調用和之后的清理。而且,如果你使用的是Microsoft Visual InterDev,你在類(lèi)中定義的屬性和方法可以通過(guò)IntelliSense使用。
>IntelliSense只對一級有效,所以如果你創(chuàng )建一個(gè)類(lèi)返回其它ASP類(lèi)的對象的話(huà),可用的方法和屬性就不會(huì )提供給你。
下面的代碼是一個(gè)類(lèi)的骨架:
Class MyClass
Private Sub Class_Initialize()
End Sub
Private Sub Class_Terminate()
End Sub
End Class
使用這個(gè)基本信息,一個(gè)類(lèi)被聲明,并且可以使用它來(lái)創(chuàng )建對象。然后這個(gè)類(lèi)的對象沒(méi)有功能——它們是無(wú)用的東西。類(lèi)的方法從Public Sub或者Public Function聲明構建(Subs沒(méi)有返回值,而Function有返回值)。
有兩個(gè)方法可以暴露屬性:既可以使用在類(lèi)的全局上下文中的Public VarName,也可以使用Public Property Get/Set/Let。如果你需要一個(gè)只讀屬性,只要簡(jiǎn)單地使用一個(gè)Property Get聲明。所有其它聲明為Private的Properties,Subs或者Functions只有在實(shí)例化的對象可用。在類(lèi)的全局上下文中聲明為Private的變量是成員變量。
創(chuàng )建類(lèi)的另外一個(gè)優(yōu)點(diǎn)是你可以輕易的將這個(gè)類(lèi)聲明移值到Web服務(wù)中。因為這是很多開(kāi)發(fā)人員前進(jìn)的方向,你可以通過(guò)使用類(lèi)創(chuàng )建面向對象的代碼先行一步。當你移值這些類(lèi)聲明到一個(gè)Web服務(wù)時(shí),你不需要重寫(xiě)所有的放置了那段代碼的ASP代碼。所要做的唯一的改變就是你的對象的實(shí)例化。
我發(fā)現創(chuàng )建這個(gè)抽象的最大的優(yōu)點(diǎn)是可以使用其它Web開(kāi)發(fā)者的幫助。因為對于很多開(kāi)發(fā)人員來(lái)說(shuō)在每個(gè)不同的實(shí)現中重復創(chuàng )建相同的代碼效率相當低,所以這個(gè)方法為每個(gè)開(kāi)發(fā)人員提供了一個(gè)抽象工具。這就允許每個(gè)開(kāi)發(fā)人員將精力更多地集中在當前工作的功能上面,而不是花費時(shí)間開(kāi)發(fā)已經(jīng)開(kāi)發(fā)過(guò)的代碼上面。
如果你奇怪為什么我不提供一個(gè)COM對象來(lái)處理這個(gè)功能,那是因為它會(huì )把你鎖定到細節設計中。通過(guò)在A(yíng)SP中動(dòng)態(tài)地創(chuàng )建類(lèi),你可以不用重新編譯和發(fā)布就能夠能類(lèi)做出改動(dòng)。在類(lèi)固定之后,再將它移值到COM、Windows腳本組件(WSC)或者一個(gè)Web服務(wù)中。但是在開(kāi)發(fā)階段還是靈活一些好。
聯(lián)系客服