將ASP代碼移植為VB COM組件


本文是編譯稿件,原文出處:http://www.asptoday.com/articles/20000121.htm

你剛剛把最新的龐大的ASP應用程序釋放到網上。文件正確地上載到服務器上,與應用程序的鏈接也
工作良好。在慶祝勝利之前,你想在應用程序的性能上運行一些stats 以便發現它到底有多好。結果
卻發現,本來在開發環境下工作得很好的應用程序實際上運行速度很慢。

對於那些使用Microsoft 軟件包時間不長的人,DNA代表分佈式InterNet 結構,是另一種非常熱門的
n層應用程序結構的首字母縮寫形式。Microsoft 致力於在Internet上展開的分佈式應用程序的開發。
基於這種思路,未來將流行小型的、無狀態的、組件化的應用程序就不足為奇了。



上面是ASP用於n層環境的典型圖示。web類(IIS應用程序)不是必需的,因為ASP可以直接與表述層
或商業規則層組件對話。因為大多數應用程序都是用ASP單獨寫成的,所以一個情理中的問題就是:

為什麼要將代碼轉入COM組件?

以我之見,ASP只是用於表述層代碼的,所以我選擇將商業規則邏輯或任何形式的數據存取
都裝入COM組件中。一般情況下,我從一開始就將應用程序的代碼分成各個組件,但是通常你並不能選
擇所要處理的結構,所以代碼移植就是個實際問題。在一個n層應用程序中,你必須盡力把非表述代碼
從ASP中盡快移走。

也許目前你並沒有在進行n層編程,那麼移植代碼的適當時機就是運行性能開始削弱時。通常,這是指
你的老闆說「程序今天運行有點慢」到「你被解雇了」之間這段時間。一旦用戶開始抱怨就晚了。

第二個使用移植代碼的方針是當你有足夠的相似代碼(例如所有的數據存取)可以放在一個包含文件
(.inc) 中以保證一個COM組件時。多少個程序就足夠?這個問題提得好!編寫小型的MTS 組件時,我
發現有一個程序就足夠創建一個COM組件了。但是只有一個程序的COM組件是很罕見的,所以對於這個
問題就需要進行判斷。如果你寫的代碼足夠長,就開始進行模式開發了。當你遭遇到ASP的「陰暗面」
之後(aka COM組件)你就會感覺到其力量。

當你編寫可以節省時間的ASP代碼時,如果要移植代碼的話,有許多事情需要做。跟隨以下步驟,你會
發現移植代碼沒有什麼麻煩的。

聲明變量類型

Visual Basic 和VBScript 的最大缺點是它允許開發人員未經聲明就使用變量。如果你覺得這是個好處,
那麼當你要整個晚上來尋找由一個小小的打字錯誤而造成的邏輯錯誤時,就不再這樣想了。如果你使用
了"Option Explicit"(明確選項)而強制明確聲明了的話,IDE 就會對此進行警告。

< %@ Language=VBScript % >
< % Option Explicit % >

當你使用Option Explicit時,要記住它剛好在@ declarations下面。不注意這一點會導致一個小小的
錯誤信息。

Microsoft VBScript compilation error '800a0400'

Expected statement

/test.asp, line 4

Option Explicit

^

現在挑戰來了。VBScript 允許將變量是任何數據類型,只要它是variant。這就是說你只能把變量
聲明為variants。在許多方面這是十分浪費的,但是在ASP可以接受。但是在Visual Basic中,當
可能創建更有效的代碼時,變量就要被定義類型。這個程序很簡單,只需在聲明之後加上"as
[data_type]" ,這時它就不再是一個簡單的variant了。

比如說,現在有一個變量是一個字符串。打開一個ASP頁然後鍵入"Dim strSession as String"。然後
預覽這個頁面,就會得到一個小小的驚喜。

Microsoft VBScript compilation error '800a0401'

Expected end of statement

/icu/temp.asp, line 3

Dim strSession as String

---------------^

所以,如何作到不對ASP代碼造成威脅而準備Visual Basic 的變量?我不能確定對此如何評價。有
一種方式是在變量聲明之後使用註釋標記。要注意這不僅在將代碼移植到VB時有幫助,當有別
的公司提供高薪挖你走的時候,這還有助於別人理解你的代碼。以下是在ASP版本2中用註釋標記
聲明變量的三種途徑:

Private strString 'as String
Dim intInteger 'as Integer
Public bolBoolean 'as Boolean

這種數據類型的定義技巧還適用於你在ASP應用程序中使用的任何函數。(請看下面部分子程序和函數)。

Private Function(strString, intInteger) 'as Boolean

當我敲入我的ASP代碼時,也在其中貫穿了這些註釋。這也許不適合你,也許你在處理一些舊代碼,
在移植代碼之後,你可以使用Visual Basic 的搜索和替換功能來增加數據類型。這樣更有意義,因為
在函數和子程序中不能註釋變量。代碼越是程序話,變量數據類型註釋就越少。

關於Visual Basic數據類型的更多信息,可以參看MSDN 有關數據類型的在線文章。

使用子程序和函數
作 者 : 青蘋果電腦工作室


一個快速回答的問題:為什麼關於ASP的書中,討論使用子程序和函數的代碼的那麼少?

雖然一行一行地寫ASP代碼要更加簡單,但是以程序的形式來編碼卻有許多益處。

首先,非程序化的代碼不容易移植到Visual Basic。也許目前你沒有這個計劃,但是總有一天你會為了
其性能或可擴展性而將一些代碼移植到組件中。

其次是程序是運行得更快。對ASP性能的最大消耗是上下文轉換,每次從ASP代碼區< % % > 移到無格式的
HTML時都會發生。因為你不會在程序內部編碼一個上下文轉換,就不諱感覺到這種消耗。另外,ASP的
緩衝器也顯示當子程序用程序化代碼點擊頁面時會有很大的不同。這裡是使用程序化代碼的ASP應用程序
"Hello World" 的必須部分:

Private Sub Main()
Response.Write "Hello World!"
End Sub

Call Main

為了完整起見,我在程序中包含了一個上下文轉換的小例子。如果你試驗這個代碼,它會運行,但是請
不要在你自己的應用程序內部這樣做。

<

  1. < %@ Language=VBScript % >
  2. < %
  3. Private Sub DoStuff()
  4. % >
  5.         This is < b > HTML Text! < />
  6. < %
  7. End Sub
  8. % >
  9. < HTML >
  10. < HEAD >
  11.         < META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0" >
  12. < /HEAD >
  13. < BODY >
  14.         < P >< % Call DoStuff % >< />
  15. < /BODY >
  16. < /HTML >


程序化的代碼還有一些其它益處。首先你會發現再利用包含在程序中的代碼部分更加容易。其次,要
實現同樣的目的所需要的代碼行更少。第三,你將要開始開發一個大的可再利用代碼庫。開始時它的
形式是.inc 文件,最後你自己的普通COM組件看起來就像Jeff Gordon(著名賽車選手)一樣棒。

移植你的代碼

有幾件事與從VBScript向Visual Basic移植代碼一樣簡單。一般來說,你需要移走代碼並增加數據類型。
有時,也可以在Visual Basic中應用一些更有效的算法,但是必須先保證代碼可以正常工作。

在我們這個應用程序舉例中,將要移植一些簡單的代碼到兩個Visual Basic COM 組件中。將一些HTML
表格格式拖到表述類中,將ADO 對像代碼拖到包裹了ADO 的數據存取類中。通過將這兩個類都放入
ActiveX DLL 工程文件中可以使工程文件稍稍簡單化。在實際工作中,可以為每一層創建單獨的工程
文件,但是這個工程文件要在一個DLL中表明思路。如果你想糾正這種情況,就將數據存取類移到另一個
工程文件中並作為一個DLL編譯。必須在表述要應用它的DLL工程文件中增加對這個新DLL的引用。

在這個樣本工程文件中使用的數據庫是一個Northwind 數據庫,它與Visual Basic包含在一起。在這個
樣本工程文件的ZIP 文件中,我為那些沒有安裝Visual Basic的人做了這個文件的一個表格的版本。樣本
工程文件中還包含一個與ASP代碼一起使用的編譯過的DLL。

ASP頁面
作 者 : 青蘋果電腦工作室

這個例子中的第一站是ASP頁。這個ASP頁用ADO與Northwind 數據庫連接。為了保持良好的編碼習慣,我
使用了Option Explicit 並明確地聲明了所有變量。這個ASP頁的第一個草稿使用了內聯代碼。
 

  1. < % @ LANGUAGE=VBScript % >
  2. < %
  3. 'Example of Inline code
  4. Option Explicit
  5.  
  6. 'Declare variables
  7. Dim oConn
  8. Dim orS
  9. Dim ConnectionString
  10. Dim x
  11.  
  12. ConnectionString = "DSN=Northwind;"
  13.  
  14. Set oConn = Server.CreateObject("ADODB.Connection")
  15. oConn.Open ConnectionString
  16.  
  17. Set orS = Server.CreateObject("ADODB.Recordset")
  18.  
  19. 'Set variables
  20. oRS.ActiveConnection = oConn
  21. oRS.Source = "Select * from Products"
  22. oRS.Open
  23. % >
  24. < html >
  25. < head >
  26.         < meta http-equiv="Content-Type" content="text/html; charset=windows-1252" >
  27.         < title >New Page 1< /title >
  28. < /head >
  29. < body >
  30.         < h1 >Products< /h1 >
  31.         < table cellspacing="2" cellpadding="5" >
  32.                 < tr bgcolor="#FF6666" >
  33.                         < th >Product Name< /th >
  34.                         < th >Quantity Per Unitr< /th >
  35.                         < th >Price< /th >
  36.                 < /tr >
  37. < %
  38.         Do until orS.EOF
  39.                 If x = 1 then
  40.                         x = 0
  41. % >
  42.                         < tr bgcolor="#ffcccc" >
  43.                 < % else % >
  44.                         < tr >
  45. < %
  46.                         x = 1
  47.                 end if
  48. % >
  49.                 < td >< %=oRS("ProductName")% >< /td >
  50.                 < td >< %=oRS("QuantityPerUnit")% >< /td >
  51.                 < td >< %=oRS("UnitPrice")% >< /td >
  52.                 < /tr >
  53. < %
  54.                 orS.MoveNext
  55.         Loop
  56. % >
  57. < /table >
  58. < /body >
  59. < /html >
  60. < %
  61. 'Destroy objects
  62. Set orS = Nothing
  63. Set oConn = Nothing
  64. % >

 






[本日志由 FindSome 于 2014-08-06 05:32 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: asp
相關日誌:

评论: 0 | 引用: 0 | 查看次数: 3595
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 关闭 | [img]标签 关闭