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