天天看點

ASP面向對象程式設計探讨及比較

ASP是Microsoft于較早期推出的動态網頁程式設計技術,但其結合ADO對資料庫友善快捷的通路、結合XML、COM/ActiveX等其它技術 實作伺服器多層結構的功能使它在今天還有着頑強的生命力,并且依然有着一定的發展。ASP.Net雖然在架構上完全不同于ASP,但它很多内建對象也是基 于ASP進行擴充的。網上有無數的介紹ASP的文章,卻鮮有介紹ASP面向對象以及與其它語言比較的,這也就是我下決心寫這篇文章的原因。

因為是早期的版本,ASP隻提供了很弱的面向對象的接口。衆所周知,ASP的實作語言分為VBScript和JavaScript/JScript: 在VBScript中有Class關鍵字,可以用來聲明一個自定義類;JavaScript就比較怪,它用一個函數來“聲明”類,然後在該函數裡通過 this.prototype定義屬性,this.func定義方法。這裡将以VBScript為主進行讨論,VBScript的類聲明是這樣的:

Class name

    statements

End Class

這裡statements裡可以聲明公有或私有的成員,包括函數、成員和屬性。關于屬性,不得不贊一下微軟的get和set方法,這個在COM中出現 的理念,直到.Net中一直被沿用下來,個人認為對程式員而言,比Java用getProp()、setProp()兩個方法來實作同樣效果要友善直覺得 多。

相比之下,VBScript中的類與PHP4中的類各有千秋(當然跟最新的PHP5沒法比),VBScript中的類保持了VB的不完全面向對象的 “特性”,它僅僅實作了最基本的構造/析構函數、成員函數、變量、屬性,甚至構造函數不能帶參數。PHP4中則還實作了繼承、函數重載等類的重要性質,也 隻有實作了這些,才能稱之為面向對象,才有可能為實作多态提供基礎。但二者均沒有實作類的靜态(static)成員等功能。盡管可以用其它一些變通達到同 樣的功效,但從面向對象的思想出發,這都是不徹底的(由于PHP非常靈活,PHP4中可以通過成員函數的靜态變量來間接實作類的靜态變量;而“::”—— 可以實作類的靜态函數通路的操作符——在PHP4中沒有嚴格檢查。換句話說,所有的成員函數都可以當成靜态函數通路,隻要你在該函數裡不使用成員變量就不 會出錯。VBScript根本沒有實作static,隻能用Session或Application來實作)。是以在平常的使用中,你可以使用 VBScript的自定義類來封裝一些操作,但不要指望它像C++ / Java / .Net那樣為你的面向對象思想服務。

VBScript同樣發揚了VB中預設的參數或變量是引用的好風格。這樣,盡管Script語言中對類型不敏感,但它還能夠達到C/C++裡指針/引用同樣的功效,完成很多事情。最基本的,比如說用它定義一個清單(List)的節點類ListNode:

<%

Class ListNode

    Public Content

    Public NextNode

    Private Sub Class_Initialize()

        Content="Node"

        Set NextNode=Nothing

    End Sub

End Class

%>

呵呵,就這麼簡單,但不要感到鄙夷,也不要忘記對變量初始值。VB中也差不多,聲明時加上類型就行了。而使用時:

Set nh=new ListNode

Set nh.NextNode=new ListNode

'其它語句……

'周遊清單

Set n=nh

While Not n is Nothing

    Response.Write n.Content+"<br />"

    Set n=n.NextNode

Wend

如果不加其它代碼,上面的運作結果是兩個“node”。VBScript的自定義類和對象也不外如是,隻要你掌握基本的概念,對它有一定了解,就再簡單不過了。再次強調,用Set語句來對對象進行指派,相當于Java裡的指派,都是獲得一個引用。這比PHP4裡預設對象指派是調用拷貝構造函數來建立一 個新的對象好多了(甚至連obj=new Obj;這樣的語句都會建立兩個對象!如果你想獲得引用的話,要在等号後變量前顯示地加上&),而似乎PHP5也不想修改PHP4的這種做法。

ASP中的Session本身是可以儲存對象的,它可以儲存基本變量,數組,自動化對象(Automation Object)等,但在儲存自定義類的對象時會碰到問題。如下面的代碼:

If isempty(Session("node")) Then Set Session("node")=New ListNode

Set n=Session("node")

Response.Write n.Content

還是上面的ListNode這個類,這段代碼意圖在一個使用者會話中隻保留一個ListNode的對象。是以在使用者第一次通路該網頁時,會生成ListNode的一個對象,并儲存在Session(“node”)中;後面通路該網頁時,因為Session(“node”)不為空了,是以不會生成一個新的對象,而是到 Session(“node”)中取出儲存的對象。理論上應該也會輸出100,但是問題來了,ASP一直會報錯:

Microsoft VBScript runtime error '800a01b6'

Object doesn't support this property or method: 'n.Content'