VB程式的結構比較自由,通常做法就是新建一個工程,然後建幾個FORM畫面並在其中放上代碼就OK,但是當一個工程的結構略顯複雜的時候就會造成整個程式結構上的沉重感,修改及添加功能時會造成力不從心的感覺,如果能夠維持一個比較簡潔的架構,程式就會在可讀性及靈活性上得到極大的提高,下面就如何定義並維持這樣的架構做一個簡單地講解。
1. 利用不同類型的工程文件來實現分割:
???做過VB的都應該知道,常用的工程文件有FORM,MODULES,CLASS以及USERCONTROLS這四種,應該如何去使用呢?
???(1) Forms(窗體)
??????Form是最常見的文件,利用它可以用來設計功能畫面。因此在劃分上應該將全部與實際功能相關的CODE都放在這裏。
???(2) Modules(模組)
??????這個是純粹的代碼塊文件,由於它本身的PUBLIC特性,因此應該是放置公用函式。這裏所說的“公用函式”並不是說裏面放的都是一些PUBLIC的FUN/SUB,而是說從功能上來講是與整個Project相關的處理,比如說DB連線,讀寫配置檔,寫LOG等。而且裏面的FUN/SUB應該是PRIVTE與PUBLIC相互的一個結合(Private應該是對多個Public的一個實現上的抽象)。
???(3) Class(類)
??????Class因為可以被單獨的NEW,因此它承擔的角色應該是對一個單獨流程的抽象,例如將讀寫EXCEL/發MAIL設計成一個類。
???(4) UserControls(用戶控件)
??????這個東東我的理解是Class的擴充,當需要利用到現成控件進行擴充以及事件響應時就用它好了。
2.? 工程內部分工:
???(1) 要養成從Module.Main來做工程入口/出口的習慣,避免直接將某個Form設為啟動窗體和任意地方的End。
??????用Module.Main做工程入口可以在固定的地方實現入口時的參數初始化及一及設定,避免出現設Form為啟動窗體後在添加對等功能塊時難於修改及初始化的問題。例如需求1先是將Form1設為啟動畫面,而後續需求要求設Form2為啟動畫面或是要將整個EXE做成無須顯示畫面直接運行等。
??????在Module放置整個工程的出口(指結束時的處理Sub),能夠保證工程中引用的釋放。
???(2) 將全部的外部引用及定義都放在Module中。
??????例如VB程式中經常會用到WindowsAPI,那麼這些API的定義應該是放到Module之中(UserControls中用到除外)
3.? 單獨模塊(指單一Form/Module/Class)內結構:
???(1) 一定要使用Option Explicit來實施強制定義檢查,完全避免未定義就使用變量這種情況的發生。
???(2) Public的節制使用,能夠定義為Private的方法就一定不要使用Public,避免出現引用混亂及閱讀困難。
?????????
4.? 方法內結構:
???(1) 異常處理


?1?Public?Function?ReadTemplate(ByVal?strTemplatePath?As?String,?ByRef?strTemplateContent?As?String)?As?Boolean
?2?On?Error?GoTo?ErrHandle
?3?????Dim?lngFileHandle?As?Integer
?4?????Dim?strLine?As?String,?strContent?As?String
?5?????lngFileHandle?=?-1
?6?????'檢查模板文件是否存在
?7?????If?Dir(strTemplatePath)?=?""?Then
?8?????????Err.Raise?32001,?"ReadTemplate",?"模板文件不存在"
?9?????End?If
10?????'載入模板文件內容
11?????strContent?=?""
12?????lngFileHandle?=?FreeFile()
13?????Open?strTemplatePath?For?Input?As?#lngFileHandle
14?????Do?While?Not?EOF(lngFileHandle)
15?????????Line?Input?#lngFileHandle,?strLine
16?????????strContent?=?strContent?&?strLine?&?vbCrLf
17?????Loop
18?????strTemplateContent?=?strContent
19?????ReadTemplate?=?True
20?ExitHandle:
21?????If?lngFileHandle?<>?-1?Then?Close?#lngFileHandle
22?????Exit?Function
23?ErrHandle:
24?????ReadTemplate?=?False
25?????WriteErrLog?gStrAppLogPath,?TheMdlName,?Err.Source,?"加載模板["?&?strTemplatePath?&?"]失敗",?Err.Number,?Err.Description
26?????GoTo?ExitHandle
27?End?Function
???(2) 不要忽視FUN的返回
??????VB中Function/Sub都可以一樣直接使用(例如 Call Sub1/Function1...),在這樣隨意使用Function的同時,其返回值必定會被丟棄,極容易造成程式處理的邏輯分支被忽略。
???(3)?Sub/Function中參數要顯式聲明ByVal /?ByRef?及參數形態
??????對於簡單類型的參數來講,顯式聲明ByVal /?ByRef 是表明該參數是否可以被修改,而聲明參數形態則可以從一定程度上避免VB自動轉型時的錯誤。