明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

組件對象開發(fā)Web應(yīng)用的案例區(qū)分

[摘要](轉(zhuǎn)載計(jì)算機(jī)世界) 夏長虹 童亮 陳文博 一. 應(yīng)用實(shí)例的分析與開發(fā) ---- 我們以學(xué)籍管理系統(tǒng)為背景,基于Windows DNA的思想,開發(fā)了一套應(yīng)用系統(tǒng)。在該系統(tǒng)中,有關(guān)教務(wù)學(xué)籍的事務(wù)邏輯都是由定制COM組件來處理的,動態(tài)Web頁面通過ASP腳本調(diào)用這些組件。系...
(轉(zhuǎn)載計(jì)算機(jī)世界)
夏長虹 童亮 陳文博
一. 應(yīng)用實(shí)例的分析與開發(fā)

---- 我們以學(xué)籍管理系統(tǒng)為背景,基于Windows DNA的思想,開發(fā)了一套應(yīng)用系統(tǒng)。在該系統(tǒng)中,有關(guān)教務(wù)學(xué)籍的事務(wù)邏輯都是由定制COM組件來處理的,動態(tài)Web頁面通過ASP腳本調(diào)用這些組件。系統(tǒng)在開發(fā)速度和軟件質(zhì)量等方面都優(yōu)于不用COM組件而僅用ASP腳本的方案。為說明問題,我們通過一個定制組件和ASP腳本的主要代碼簡單介紹局部功能的實(shí)現(xiàn)過程。

---- 在displayscore.asp頁面中接受、辨別用戶的查詢請求,做出不同的查詢處理。當(dāng)客戶的身份為教師或教務(wù)時,可以查詢所有學(xué)生的成績;當(dāng)客戶的身份為學(xué)生時,只能查詢該生本人的成績。

---- 定制COM組件Score.dll進(jìn)行查詢處理。首先設(shè)計(jì)該組件的接口,為組件設(shè)置四個屬性: Subj(課程)、Term(課程所屬學(xué)期)、Class(查詢的班級)和Stu_No(查詢學(xué)生的學(xué)號);定義兩個方法:RequeryScores和RequeryAllScores,分別對教師、教務(wù)部門和學(xué)生的請求做出相應(yīng)的處理,并將查詢結(jié)果集返回給用戶。

---- 以下是實(shí)現(xiàn)該組件Score.dll的部分關(guān)鍵代碼。從中我們可以看到組件的接口是如何實(shí)現(xiàn)的:

Option Explicit
Private m_StuNo As Variant
Private m_Subj As String
Private m_Term As String
Private m_Class As String
  ' 設(shè)置屬性為可寫入的
Public Property Let StuNo(ByVal vNewValue As Variant)
m_StuNo = vNewValue
End Property
Public Property Let Subj(ByVal vNewValue As Variant)
m_Subj = vNewValue
End Property
......            
' 學(xué)生查詢成績請求處理
Public Function RequeryScores() As Object
Dim objContext As MTxAS.ObjectContext
Set objContext = GetObjectContext()
             ' 建立事務(wù)性組件
Dim ObjConn As ADODB.Connection
            ' 利用ADO訪問數(shù)據(jù)庫
Dim ObjRecordset As ADODB.Recordset
Set ObjConn = New ADODB.Connection
ObjConn.Open "xia", "sa", ""
Set ObjRecordset = New ADODB.Recordset
Dim query As String
' 根據(jù)查詢要求(查詢所有課程、查詢特定學(xué)期的所有課程、
  查詢指定課程、查詢特定學(xué)期的某一課程)進(jìn)行不同的查詢操作
If (m_Subj = "all" And m_Term <> "all") Then
  query="select   Client_Name,Client.Client_No,Courses.subject,
         stu_score.score,stu_score.term,sub_type"
  query = query & " from client,stu_score,courses"
  query=query&"where client.client_no=stu_score.client_no
  and stu_score.subject=courses.subject
  and courses.term=stu_score.term
  and courses.term='" & m_Term & "'
  and Client.Client_no='" & m_StuNo & "'"
End If
......
ObjRecordset.Open query, ObjConn
         ' 進(jìn)行數(shù)據(jù)庫查詢
ObjContext.SetComplte
             ' 若事務(wù)成功完成,則提交該事務(wù)
RequeryScoresExit:
Set RequeryScores = ObjRecordset
          ' 返回查詢結(jié)果集
Exit Function
RequeryScoresErr:
Set RequeryScores=Nothing
           ' 事務(wù)失敗處理
End Function
' 教師、教務(wù)查詢成績請求處理
Public Function RequeryAllScores() As Object
......
End Function
---- 在ASP頁面displayscore.asp中引用組件,ASP代碼如下(其中加粗的部分便是對該組件的調(diào)用):
< %@ LANGUAGE="VBSCRIPT" % >
< HTML >
< HEAD >
< META NAME="GENERATOR" Content="Microsoft
Visual InterDev 1.0" >
< META HTTP-EQUIV="Content-Type"
content="text/html; charset=gb_2312-80" >
< TITLE >Show To Teacher< /TITLE >
< /HEAD >
< BODY background="images/bk.GIF" >
< %
  dim objResult
  set objResult=Server.CreateObject("Display.Score")
  dim Term,Subject
  Term=Cstr(Request.Form("Term"))
  Subject=Cstr(Request.Form("Subject"))
  objResult.term=Request.Form("term")
  objResult.Subj=RequestForm("Subject")
  objresult.class=Request.Form("Class")
  dim Scores
  set Scores=objResult.RequeryAllScores
  % >
' 以下代碼為顯示處理的結(jié)果
< div align="center" >< center >
......
< table border="0" cellpadding="0"
cellspacing="1" width="100" >< tr >
< %For I = 0 To Scores.Fields.Count - 1% >
< td bgcolor="#004080" >
< strong >< font color="#FFFFFF" > < small >&nbsp;&nbsp;
< %=scores(I).Name% >< /font > < /strong >&nbsp;< /td >
< %NEXT
  Do While (Not Scores.EOF)% >
   < /tr >< tr >
     < % For I = 0 To Scores.Fields.Count - 1% >
        < td bgcolor="#ACE8F9" >< p align="center" >
        &nbsp;&nbsp;< %= Scores(I).Value% >< /td >
        < %Next
        Scores.MoveNext% >< /tr >
  < %Loop% >
< %Scores.close
       ' 關(guān)閉數(shù)據(jù)庫連接
set Scores=Nothing
set objResult=Nothing % >
      ' 釋放對象
< /table >< /center >< /div >
< /BODY >
< /HTML >
---- 可以想象,如果僅使用ASP腳本進(jìn)行業(yè)務(wù)處理就會使ASP頁面中代碼十分臃腫、晦澀。而使用組件的方案也較單純的ASP腳本執(zhí)行速度速度快。并且可以將整個查詢處理作為一個事務(wù),保證數(shù)據(jù)庫信息的安全、完整。將該組件在MTS中注冊,又可避免多用戶訪問該主頁時可能造成的網(wǎng)絡(luò)擁塞。實(shí)際應(yīng)用中,學(xué)生和教師的使用權(quán)限是不同的。在學(xué)生查詢成績的頁面中,可重用該組件,只是調(diào)用其不同的接口而已。僅使用ASP腳本進(jìn)行業(yè)務(wù)處理,則需重新編寫與displayscore.asp類似的、同樣煩瑣的代碼。在開發(fā)過程中,不同的開發(fā)人員可各盡所能,同時進(jìn)行組件和ASP頁面的設(shè)計(jì),縮短了軟件開發(fā)周期。
---- 以下兩圖顯示的是教師(教務(wù))查詢成績和顯示查詢結(jié)果的頁面:

二. 開發(fā)過程中輔助工具的使用

---- 傳統(tǒng)的軟件工程進(jìn)行的需求分析、數(shù)據(jù)庫設(shè)計(jì)等都是人們“純手工”完成的,缺乏嚴(yán)謹(jǐn)性和規(guī)范性。而在以組件為中心的系統(tǒng)分析和軟件開發(fā)過程中,應(yīng)力爭使用有效的計(jì)算機(jī)輔助工具,以適應(yīng)快速建模和組件方法新形勢的需要,提高分析的質(zhì)量及精度。

---- 有很多輔助工具可以利用。由于以組件為中心的系統(tǒng)分析過程仍保留著傳統(tǒng)軟件工程方法的脈絡(luò)痕跡,北大青鳥的CASE工具對傳統(tǒng)的軟件工程方法比較有效,我們采用了這一工具。在數(shù)據(jù)庫建模方面,我們選用了SYBASE 公司的S-Designer,可將數(shù)據(jù)庫概念模型自動轉(zhuǎn)化為物理模型。

---- 1. 利用青鳥CASE工具編寫需求分析文檔

---- 長久以來,人們已習(xí)慣于“純手工”地進(jìn)行需求分析。開發(fā)人員對現(xiàn)有系統(tǒng)和用戶要求進(jìn)行調(diào)查后,需要設(shè)計(jì)系統(tǒng)的數(shù)據(jù)流圖(DFD圖),編寫小說明,設(shè)計(jì)系統(tǒng)的結(jié)構(gòu)圖(SC圖)。但這種分析方法是不嚴(yán)謹(jǐn)?shù),由于種種原因,可能會發(fā)生加工、數(shù)據(jù)流、文件的語法定義錯誤;數(shù)據(jù)流圖上下各層不一致;數(shù)據(jù)流圖分解后的數(shù)據(jù)不平衡,或文件等重名及文檔不完備等各種問題,影響了我們對用戶需求的分析和理解,防礙了今后的工作。尤其是對組件的分析失當(dāng),后果不堪設(shè)想。

---- 青鳥CASE工具提供的即是一套支持軟件工程中采用傳統(tǒng)的結(jié)構(gòu)化方法進(jìn)行需求分析、軟件設(shè)計(jì)的工具。由工具生成的每個文件即一個項(xiàng)目,每個項(xiàng)目均包括數(shù)據(jù)流圖和模塊結(jié)構(gòu)圖兩部分:

數(shù)據(jù)流圖部分輔助系統(tǒng)分析員完成對軟件系統(tǒng)的需求分析、建立目標(biāo)系統(tǒng)的需求模型、生成一份正確、完整的關(guān)于目標(biāo)系統(tǒng)的說明文檔;同時,提供對需求文檔的查詢、列表、分片、影響范圍等分析功能,輔助軟件設(shè)計(jì)人員對需求分析的結(jié)果文檔進(jìn)行深入、細(xì)致的分析和理解,以利于軟件設(shè)計(jì)工作。

模塊結(jié)構(gòu)圖部分輔助程序設(shè)計(jì)人員在需求分析階段完成后對軟件系統(tǒng)進(jìn)行設(shè)計(jì),支持模塊的逐層細(xì)化,建立系統(tǒng)的軟件體系結(jié)構(gòu),最后得到一份正確、完整的軟件設(shè)計(jì)文檔。同時,提供對設(shè)計(jì)文檔進(jìn)行查詢、列表、分片、影響范圍等分析功能,完成對設(shè)計(jì)的結(jié)果文檔進(jìn)行深入、細(xì)致的分析理解,以利于軟件開發(fā)及維護(hù)工作。在SC圖中組件的規(guī)劃方案已見端倪,繼續(xù)細(xì)化將得出每個組件的概要設(shè)計(jì)方案。
---- 在教務(wù)系統(tǒng)的實(shí)例中,利用青鳥CASE工具生成的DFD圖和SC圖如下圖所示:
---- 系統(tǒng)1層DFD圖 系統(tǒng)0層SC圖

---- 2. 利用S-Designer進(jìn)行數(shù)據(jù)庫設(shè)計(jì)

---- 當(dāng)完成系統(tǒng)的詳細(xì)設(shè)計(jì)后,接下來便是數(shù)據(jù)庫設(shè)計(jì)。數(shù)據(jù)庫設(shè)計(jì)在整個軟件工程中占有舉足輕重的地位。數(shù)據(jù)庫設(shè)計(jì)不合理,數(shù)據(jù)得不到合理、有效的存儲,數(shù)據(jù)存在潛在的不一致性、不完整性或有大量冗余,都會降低系統(tǒng)性能,甚至使系統(tǒng)崩潰。

---- 手工的數(shù)據(jù)庫設(shè)計(jì)完全依賴于設(shè)計(jì)者的設(shè)計(jì)水平。設(shè)計(jì)者首先必須根據(jù)實(shí)際需要建立若干個邏輯上存在的數(shù)據(jù)庫表,并使其滿足第三范式;而后根據(jù)它們之間的聯(lián)系建立特定數(shù)據(jù)庫表將其聯(lián)系起來。這是一件相當(dāng)煩瑣的事。數(shù)據(jù)庫設(shè)計(jì)者既要進(jìn)行數(shù)據(jù)庫的邏輯設(shè)計(jì),又要將邏輯模型轉(zhuǎn)成物理模型,而且設(shè)計(jì)出的數(shù)據(jù)庫不一定能滿足第三范式。合理的庫表結(jié)構(gòu)決定了訪庫組件接口的設(shè)計(jì)質(zhì)量,所以原先數(shù)據(jù)庫設(shè)計(jì)方式不適用于以組件對象為中心的軟工設(shè)計(jì)。

---- 在教務(wù)系統(tǒng)的實(shí)例中,S-Designer使數(shù)據(jù)庫設(shè)計(jì)變得輕松、簡單起來。設(shè)計(jì)者只須根據(jù)現(xiàn)實(shí)需要,設(shè)計(jì)出數(shù)據(jù)庫的E-R圖,S-Designer會將邏輯模型轉(zhuǎn)化為物理模型,為數(shù)據(jù)庫表間的聯(lián)系建立新表,指明表的主碼、外碼,并自動對數(shù)據(jù)庫表進(jìn)行一致性、冗余性、完整性檢查,使數(shù)據(jù)庫表滿足第三范式。

---- 例:可首先設(shè)計(jì)出數(shù)據(jù)庫表課程(Courses)和學(xué)生(Client)的邏輯模型:

---- 接下來,為表Courses和Client間建立聯(lián)系。由S-Designer自動生成的物理模型,如下圖所示,它們?yōu)樵L庫組件的接口設(shè)計(jì)提供了準(zhǔn)確的依據(jù)。

---- 可以相信,隨著軟件工程學(xué)的進(jìn)一步成熟,將出現(xiàn)更多的計(jì)算機(jī)輔助工具,幫助軟件開發(fā)人員構(gòu)建出更完善的應(yīng)用系統(tǒng)。許多輔助軟件工具可以完成相似的工作,到底選用何種輔助工具取決于這些工具的性能以及使用者的習(xí)慣。

---- 以組件對象為中心的動態(tài)Web方法和DNA思想并不高深莫測,開發(fā)技術(shù)也愈加規(guī)范化。應(yīng)當(dāng)說,這套方法更適合客觀信息結(jié)構(gòu)的現(xiàn)實(shí),也更接近于人們的思維方式,其技術(shù)有如行云流水般自然,很適合在中小型企業(yè)環(huán)境中推廣和普及。