Visual Basic模塊和過程設(shè)計
發(fā)布時間:2008-04-06 閱讀數(shù): 次 來源:網(wǎng)樂原科技
Visual Basic(下簡稱VB)的模塊和過程是指應用程序代碼的框架,而建立這樣的框架我們必須進行慎密的考慮。目前已經(jīng)有許多成熟的方法可以用來創(chuàng)建更好的模塊和過程,開發(fā)工程時,應該使用這些方法。
一、創(chuàng)建具有很強內(nèi)聚力的模塊
過程的重要性往往比模塊的重要性更容易理解,過程是指執(zhí)行一個統(tǒng)一函數(shù)的一段代碼。但是對于許多開發(fā)人員來說,模塊的作用比較難于弄清。模塊常常被錯誤地視為是一個僅僅用于存放過程的容器。有些開發(fā)人員甚至把這種思路作了進一步的發(fā)揮,將他們的所有過程放入單個模塊之中。人們之所以不能正確地認識模塊的功能,原因之一是模塊的實現(xiàn)實際上并不影響程序的執(zhí)行。當一個工程被編譯時,如果所有過程都放在單個模塊中或者放在幾十個模塊中,這沒有任何關(guān)系。雖然模塊的數(shù)量對代碼的執(zhí)行并無太大的影響,但是當創(chuàng)建便于調(diào)試和維護的代碼時,模塊的數(shù)量有時會帶來很大的影響。
模塊應該用來將相關(guān)的過程組織在一起。在大多數(shù)應用程序中,按照某種共性來組織過程是相當容易的。當模塊包含一組緊密關(guān)聯(lián)的過程時,該模塊可以說具有強大的內(nèi)聚力。當模塊包含許多互不相關(guān)的過程時,該模塊便具有較弱的內(nèi)聚力。應該努力創(chuàng)建內(nèi)聚力比較強的模塊。一個非常大的VB工程可能只包含十幾個模塊,但是這些模塊的組織結(jié)構(gòu)應該非常完善。創(chuàng)建模塊時,應該知道"模塊化"這個術(shù)語的含義是什么。模塊的基本目的是創(chuàng)建相當獨立的程序單元。從根本上來講,模塊可以添加給另一個工程,并且可以通過直接調(diào)用它的公用過程來使用它。這種通用模塊并不依賴于全局數(shù)據(jù)或其他模塊中的過程。
二、創(chuàng)建松散連接和高度專用的過程
VB能夠非常容易地創(chuàng)建過程,但是這種簡易性掩蓋了創(chuàng)建完美過程需要高度技巧和科學性的問題。VB對過程所作的限制很少,它并不限制放入過程的語句數(shù)目,也不限制一個過程能夠執(zhí)行多少個任務(wù)。雖然VB并不強制實施這些限制,但是在這些方面我們應該做一些自我控制,這樣才能創(chuàng)建更好的過程。
1、使所有過程都執(zhí)行專門的任務(wù)
首先要記住,每個過程都應該執(zhí)行一項特定的任務(wù),它應該出色地完成這項任務(wù)。應該避免創(chuàng)建執(zhí)行許多不同任務(wù)的過程。這常常需要具有一定的遠見,因為究竟哪些成分構(gòu)成一個任務(wù),這并不總是十分明顯。創(chuàng)建專用過程有許多好處。首先,調(diào)試將變得更加容易。創(chuàng)建專用過程的更重要的好處是可以按計劃或者不按計劃來修改代碼。
2、盡量使過程成為自成一體的獨立過程
除了盡量使過程成為專用過程外(這是合乎道理的),還應該盡量使之成為獨立的過程。當一個過程依賴于對其他過程的調(diào)用時,稱為與其他過程緊密連接的過程。緊密連接的過程會使調(diào)試和修改變得比較困難,因為它牽涉到更多的因素。當創(chuàng)建的過程依賴于較少的其他過程或者不需要調(diào)用其他過程時,那么它就是松散連接的過程。松散連接的過程優(yōu)于緊密連接的過程,但是我們不可能使每個過程都成為獨立的過程。盡管如此,我們應該盡量減少過程之間的連接關(guān)系。
三、模塊和過程設(shè)計的原則
1、為過程和模塊賦予表義性強的名字
為了使代碼更加容易理解,最容易的方法之一是為我們的過程賦予表義性強的名字。函數(shù)名DoIt、GetIt和PrintIt的可讀性很難與CalculateSalesTax、RetrieveUserID和PrintSpreadSheet相比。給過程正確地命名,可使程序工程的調(diào)試和維護工作大大改觀。我們要認真對待過程命名的工作,不要為了減少鍵入操作量而降低過程的可理解度。給過程命名時應該大小寫字母混合使用,定義過程名時不要使用縮寫。這些都是初學者必須要牢記的。下面是一些例子:
不正確:
Private Function InvoicePost()As Boolean
Private Function PrintIt()As Boolean
Public Sub SaveItem()
Public Sub DeleteRecord()
正確:
Private Function PostInvoice()As Boolean
Private Function PrintSpreadsheet()As Boolean
Public Sub SavePicture()
Public Sub DeleteContact()
2、為每個過程賦予明確定義的作用域
作用域是指工程中的變量或過程的可視性。過程可以定義為擁有模塊級作用域、全局作用域或友元作用域。當一個過程用Private關(guān)鍵字來說明時,便擁有模塊級作用域,并且它只能用同一模塊中的過程來調(diào)用。如果用關(guān)鍵字Public來說明一個過程,那么這個過程將擁有全局作用域,并且可以用工程中的任何模塊來調(diào)用。此外,公用類模塊的公用過程可用于外部程序。用Friend關(guān)鍵字說明的(公用類模塊中的)過程將使該過程成為工程中的所有模塊的公用過程,但是它不能使該過程成為外部程序的公用過程。創(chuàng)建過程時,始終都應顯式地定義它的作用域。雖然不使用Public Private或Friend將無法定義一個過程,但是我們應該避免這樣進行操作。
在許多情況下,我們不用Public、Private或Friend說明的過程實際上將作為模塊級(專用)過程來使用。但是,如果不專門說明為專用過程,它們就會無意中創(chuàng)建為公用過程。通過為每個過程賦予一個明確定義的作用域,可以減少代碼閱讀者需要投入的工作量。另外,應該確保我們?yōu)檫^程賦予最有意義的作用域。如果一個過程只被同一模塊中的另一個過程調(diào)用,那么請將它創(chuàng)建成專用過程。如果該過程是從多個模塊中的多個過程中調(diào)用,請將該過程說明為公用過程。每個過程的定義都應該以Public、Private或Friend開頭。如果現(xiàn)有的過程不帶有這些關(guān)鍵字中的一個,那么我們就必須遍歷工程,以便確定每個過程的作用域,并相應地修改其說明。
不正確:
Sub CalculatePOTotals( )
…
End Sub
正確:
Public Sub CalculatePOTotals( )
…
End Sub
3、用參數(shù)在過程之間傳遞數(shù)據(jù)
雖然模塊級變量的問題不像全局變量那么多,但是我們也應該盡量避免使用模塊級變量。一般來說,變量的作用域越小越好。為了減少模塊級變量和全局變量,方法之一是將數(shù)據(jù)作為參數(shù)在不同過程之間傳遞,而不是讓過程共享全局變量或模塊級變量。
例如為每個參數(shù)指定數(shù)據(jù)類型。這個問題應該給予充分的重視。創(chuàng)建帶有參數(shù)的過程時,請務(wù)必將每個參數(shù)明確說明為一個特定的數(shù)據(jù)類型。當我們省略參數(shù)說明中的As部分時,該參數(shù)將作為Variant(變碼)來創(chuàng)建。如果我們想創(chuàng)建Variant參數(shù),請使用As Variant進行顯式創(chuàng)建。
不正確:
Private Sub CreateStockRecord(ItemID, Repair, Quantity)
正確:
Private Sub CreateStockRecord(strItemID As String, blnRepair _
As Boolean, sngQuantity As Single)
4、使用統(tǒng)一和直觀明了的方式來調(diào)用過程
VB提供了許多快捷操作方式,可供在編寫代碼時使用。一般來說,這些快捷方式不影響代碼的運行性能,但是它們往往犧牲了代碼的可讀性,以便在進行軟件開發(fā)時省去一些擊鍵操作。應該盡量使代碼做到直觀明了。有的時候,也就是當調(diào)用過程的時候,可以采用快捷方式,然而我們不應該這樣去做。
我們可以用許多不同的方法來調(diào)用一個過程。當調(diào)用Sub過程時,可以使用單詞Call,也可以省去這個單詞。例如,下面這兩個語句均調(diào)用相同的Sub過程:
CallShowError("clsApplication","ShowRep",Err.Number,Err.Description)
ShowError"clsApplication","ShowRep",Err.Number,Err.Description
雖然可以省略單詞Call,這樣我們就不必鍵入兩個括號來啟動代碼,但是我們應該避免使用這種方法。關(guān)鍵字Call專門用來指明該語句是調(diào)用一個Sub過程,而不是調(diào)用Function過程,因此它使代碼更容易閱讀。
VB允許我們以完全相同的方法來調(diào)用Sub過程和Function過程。請看下面這個函數(shù):
Public Function DisplayContact(lngContactNumber As Long) As Boolean
…
End Function
我們可以使用下面的任何一個語句來調(diào)用該函數(shù):
Call ShowRep(lngRepNumber)
ShowRep lngRepNumber
blnResult=ShowRep(lngRepNumber)
為了使代碼盡可能直觀明了,必須將調(diào)用Sub過程與調(diào)用Function過程區(qū)分開來。調(diào)用Sub過程時,始終都應使用關(guān)鍵字Call;調(diào)用Function過程時,始終都應檢索Function調(diào)用的值,即使我們并不使用這個值,也應這么做。