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

方法內(nèi)結(jié)構(gòu)示例
?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?????'載入模板文件內(nèi)容
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 ???可以看到上面的結(jié)構(gòu)包含了異常處理,在VB程式中最容易出現(xiàn)的問題就是異常的處理,由於VB並不會象JAVA/NET那樣要求強(qiáng)制處理異常,因此常常都會忽略掉程式中的異常處理問題,造成一旦出錯就會整個OVER的嚴(yán)重後果。
???(2) 不要忽視FUN的返回
??????VB中Function/Sub都可以一樣直接使用(例如 Call Sub1/Function1...),在這樣隨意使用Function的同時,其返回值必定會被丟棄,極容易造成程式處理的邏輯分支被忽略。
???(3)?Sub/Function中參數(shù)要顯式聲明ByVal /?ByRef?及參數(shù)形態(tài)
??????對於簡單類型的參數(shù)來講,顯式聲明ByVal /?ByRef 是表明該參數(shù)是否可以被修改,而聲明參數(shù)形態(tài)則可以從一定程度上避免VB自動轉(zhuǎn)型時的錯誤。