計(jì)算機(jī)中心編程標(biāo)準(zhǔn)_第1頁(yè)
計(jì)算機(jī)中心編程標(biāo)準(zhǔn)_第2頁(yè)
計(jì)算機(jī)中心編程標(biāo)準(zhǔn)_第3頁(yè)
計(jì)算機(jī)中心編程標(biāo)準(zhǔn)_第4頁(yè)
計(jì)算機(jī)中心編程標(biāo)準(zhǔn)_第5頁(yè)
已閱讀5頁(yè),還剩66頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1章設(shè)計(jì)模塊和過(guò)程

設(shè)計(jì)模塊和過(guò)程時(shí),要達(dá)到下列目的:

.創(chuàng)建更加容易調(diào)試和維護(hù)的過(guò)程

.創(chuàng)建具有強(qiáng)大內(nèi)聚力的模塊

.創(chuàng)建高度專用的過(guò)程

.創(chuàng)建松散連接的過(guò)程

.盡量使過(guò)程具有獨(dú)立性

.提高過(guò)程的扇入性

.降低過(guò)程的扇出性

1.1創(chuàng)建具有很強(qiáng)內(nèi)聚力的模塊

過(guò)程是指執(zhí)行一個(gè)統(tǒng)一函數(shù)的一段代碼。模塊用來(lái)將相關(guān)的過(guò)程組織在一起。在大多數(shù)應(yīng)

用程序中,按照某種共性來(lái)組織過(guò)程是相當(dāng)容易的。當(dāng)模塊包含一組緊密關(guān)聯(lián)的過(guò)程時(shí),該模

塊可以說(shuō)具有強(qiáng)大的內(nèi)聚力。當(dāng)模塊包含許多互不相關(guān)的過(guò)程時(shí),該模塊便具有較弱的內(nèi)聚力。

應(yīng)該努力創(chuàng)建內(nèi)聚力比較強(qiáng)的模塊。

大多數(shù)工程都包含許多并不十分適合與其他過(guò)程組合在一起的過(guò)程。在這種情況下,可以

為這些不合群的過(guò)程創(chuàng)建?個(gè)綜合性收容模塊,但是,隨著工程的擴(kuò)大,應(yīng)該隨時(shí)注意這些模塊

的變化。觀察是否出現(xiàn)了可以給過(guò)程分組的條件,然后就可以考慮為過(guò)程的分組創(chuàng)建新模塊。

通過(guò)創(chuàng)建專用模塊,能增強(qiáng)模塊的內(nèi)聚力。工程中的模塊質(zhì)量與模塊組織的質(zhì)量的重要性不能

等量齊觀。一個(gè)非常大的工程可能只包含十幾個(gè)模塊,但是這些模塊的組織結(jié)構(gòu)應(yīng)該非常完善。

創(chuàng)建模塊時(shí),應(yīng)該知道“模塊化”這個(gè)術(shù)語(yǔ)的含義是什么。

模塊的基本目的是創(chuàng)建相當(dāng)獨(dú)立的程序單元。從根本上來(lái)講,模塊可以添加給另一個(gè)工程,

并且可以通過(guò)宜接調(diào)用它的公用過(guò)程來(lái)使用它。這種通用模塊并不依賴于全局?jǐn)?shù)據(jù)或其他模塊

中的過(guò)程。實(shí)際上,要想創(chuàng)建不包含對(duì)其他模塊中的幾個(gè)過(guò)程調(diào)用的模塊很難的,但這是值得

實(shí)現(xiàn)的目標(biāo)。如果你熟悉編寫(xiě)VisualBasic的類模塊,以便創(chuàng)建可重復(fù)使用的對(duì)象,那么一定

也了解創(chuàng)建模塊的一般原理。如果創(chuàng)建的程序體包含它的所有代碼(本地過(guò)程),也包含它自

己的數(shù)據(jù)(模塊及變量),那么這稱為封裝,這是面向?qū)ο缶幊痰闹饕拍睢H绻軌騽?chuàng)建封

裝完善的模塊,你應(yīng)該認(rèn)真考慮將它們作為類模塊(而不是標(biāo)準(zhǔn)模塊)來(lái)創(chuàng)建、并且將它們作

為對(duì)象來(lái)操作。

1.2創(chuàng)建松散連接和高度專用的過(guò)程

1.2.1使所有過(guò)程都執(zhí)行專門的任務(wù)

首先要記住,每個(gè)過(guò)程都應(yīng)該執(zhí)行一項(xiàng)特定的任務(wù),它應(yīng)該出色地完成這項(xiàng)任務(wù)。應(yīng)該避

免創(chuàng)建執(zhí)行許多不同任務(wù)的過(guò)程。創(chuàng)建專用過(guò)程有許多好處。首先,調(diào)試將變得更加容易。如

果出現(xiàn)了不正確的最新成本,就應(yīng)該知道到哪個(gè)過(guò)程中去查找錯(cuò)誤。如果將所有代碼放入單個(gè)

過(guò)程中,那么就必須費(fèi)勁地通過(guò)另一個(gè)任務(wù)才能到達(dá),當(dāng)創(chuàng)建專用過(guò)程時(shí),不一定能夠在查找

的第一個(gè)過(guò)程中找到錯(cuò)誤,但是可以縮短查找錯(cuò)誤所需的時(shí)間。

創(chuàng)建專用過(guò)程的更重要的好處是可以按計(jì)劃或者不按計(jì)劃來(lái)修改代碼。如何將進(jìn)程分割成

專用過(guò)程,沒(méi)有一成不變的規(guī)則。可以創(chuàng)建有效而可以維護(hù)的過(guò)程,但是你不想跟蹤幾十個(gè)很

小的過(guò)程,因?yàn)樽鳛榇筮^(guò)程的組成部分,可以更好地使用它們。當(dāng)你感到有問(wèn)題時(shí),請(qǐng)讓別人

審查你的代碼,這通常有助于獲得新的看法。在這個(gè)領(lǐng)域中,豐富的經(jīng)驗(yàn)可以提高你的技能。

久而久之,你就會(huì)懂得如何維護(hù)和修改代碼的各個(gè)組成部分。

1.2.2盡量使過(guò)程成為自成一體的獨(dú)立過(guò)程

除了盡量使過(guò)程成為專用過(guò)程外,還應(yīng)該盡量使之成為獨(dú)立的過(guò)程。當(dāng)一個(gè)過(guò)程依賴于對(duì)

其他過(guò)程的調(diào)用時(shí),稱為與其他過(guò)程緊密連接的過(guò)程。緊密連接的過(guò)程會(huì)使調(diào)試和修改變得比

較困難,因?yàn)樗鼱可娴礁嗟囊蛩?。?dāng)創(chuàng)建的過(guò)程依賴于較少的其他過(guò)程或者不需要調(diào)用其他

過(guò)程時(shí),那么它就是松散連接的過(guò)程。松散連接的過(guò)程優(yōu)于緊密連接的過(guò)程,但是你不可能使

每個(gè)過(guò)程都成為獨(dú)立的過(guò)程。盡管如此,你應(yīng)該盡量減少過(guò)程之間的連接關(guān)系。若要使過(guò)程具

備較強(qiáng)的獨(dú)立性,方法之一是盡量減少全局變量和模塊級(jí)變量。使用全局變量和模塊級(jí)變量的

過(guò)程都不是獨(dú)立過(guò)程,因?yàn)樗鼈円蕾囉诓皇芷淙靠刂频臄?shù)據(jù)。

創(chuàng)建過(guò)程時(shí),設(shè)法將每個(gè)過(guò)程視為-個(gè)黑箱,其他例程不應(yīng)該要求了解該過(guò)程的內(nèi)部工作

情況,該過(guò)程也不應(yīng)該要求了解它外面的工程情況。這就是為什么你的過(guò)程應(yīng)該依靠參數(shù)而不

應(yīng)該依靠全局變量的原因。當(dāng)一-個(gè)過(guò)程通過(guò)前門接收參數(shù)口寸,這些參數(shù)就變成該過(guò)程的局部數(shù)

據(jù)(每個(gè)過(guò)程都有一個(gè)進(jìn)入點(diǎn),稱為前門;并且每個(gè)過(guò)程只應(yīng)該包含一個(gè)退出點(diǎn),稱為后門)。

當(dāng)過(guò)程使用全局變量或模塊級(jí)變量時(shí),它可以訪問(wèn)自己范圍之外的數(shù)據(jù)。

創(chuàng)建專用過(guò)程時(shí),請(qǐng)考慮下列指導(dǎo)原則:

☆將復(fù)雜進(jìn)程放入專用過(guò)程。如果應(yīng)用程序使用復(fù)雜的數(shù)學(xué)公式,請(qǐng)考慮將每個(gè)公式放入它自

(2的過(guò)程中。這樣,使用這些公式的其他過(guò)程就不必包含用于該公式的實(shí)際代碼。這樣也可以

更容易發(fā)現(xiàn)與公式相關(guān)的問(wèn)題。

☆將數(shù)據(jù)輸入/輸出(I/O)放入專用過(guò)程。在以后你可能需要改變數(shù)據(jù)輸入/輸出的處理方

法。例如,可能要修改使用文本文件的應(yīng)用程序,使它能夠使用MicrosoftJet之類的數(shù)據(jù)庫(kù)引

擎。如果該應(yīng)用程序的數(shù)據(jù)輸入/輸出代碼在專用過(guò)程中被隔離,就可以更容易進(jìn)行必要的修

改。

☆將專用過(guò)程中可能要修改的代碼區(qū)隔離。如果你知道某個(gè)進(jìn)程經(jīng)常變更,請(qǐng)將這個(gè)多變的代

碼放入專用過(guò)程,以便以后可以更加容易地進(jìn)行修改,并且減少無(wú)意中給其他進(jìn)程帶來(lái)問(wèn)題的

可能性。

☆將業(yè)務(wù)規(guī)則封裝在專用進(jìn)程中。業(yè)務(wù)規(guī)則常常屬于要修改的代碼類別,應(yīng)該與應(yīng)用程序的其

余部分隔開(kāi)。其他過(guò)程不應(yīng)該知道業(yè)務(wù)規(guī)則,只有要調(diào)用的過(guò)程才使用這些規(guī)則。

1.2.3盡量減少扇入和扇出

卜圖所示的扇入和扇出是兩個(gè)技術(shù)術(shù)語(yǔ),分別用于說(shuō)明調(diào)用單個(gè)過(guò)程的過(guò)程數(shù)目和從過(guò)程

內(nèi)部調(diào)用的過(guò)程數(shù)目。當(dāng)某個(gè)過(guò)程被許多其他過(guò)程調(diào)用(并且因此而依賴于許多其他過(guò)程)時(shí),

就說(shuō)明它是個(gè)高度扇入的過(guò)程,這是件好事。高度扇入的過(guò)程通常是封裝很好的過(guò)程,它支持

代碼復(fù)用的思路。如果一個(gè)過(guò)程要調(diào)用許多其他過(guò)程,而它又是個(gè)高度扇出的過(guò)程,那么情況

就不那么好了。高度扇出意味著該過(guò)程要依賴于許多其他過(guò)程才能完成它的工作,換句話說(shuō),

它是個(gè)緊密連接的過(guò)程。這使得程序的調(diào)試比較困難,因?yàn)閷ふ覉?zhí)行路徑更加復(fù)雜。

圖2」扇入過(guò)程和扇出過(guò)程

當(dāng)盡量減少過(guò)程的扇入和扇出時(shí),必須接受某些交互操作。對(duì)于給定工程來(lái)說(shuō),不存在完

美無(wú)缺的解決辦法。如果遵循創(chuàng)建專用過(guò)程的所有指導(dǎo)原則,肯定會(huì)遇到這樣種情況,那就

是有些過(guò)程會(huì)出現(xiàn)高度扇出,因?yàn)樗鼈儗⒃S多不同任務(wù)交給其他專用過(guò)程去執(zhí)行。要使專用過(guò)

程與松散連接、強(qiáng)大的內(nèi)聚力、更高程度的扇入和較低程度的扇出之間取得平衡,這是個(gè)永遠(yuǎn)

無(wú)法完全實(shí)現(xiàn)的目標(biāo)。

1.2.4設(shè)法按字母順序?qū)δK中的過(guò)程進(jìn)行排序

1.3編程原則

1.3.1為過(guò)程和模塊賦予表義性強(qiáng)的名字

為了使代碼更加容易理解,最容易的方法之一是為你的過(guò)程賦予表義性強(qiáng)的名字。給過(guò)程

正確地命名,可使程序工程的調(diào)試和維護(hù)工作大大改觀。請(qǐng)認(rèn)真對(duì)待過(guò)程命名的工作,不要為

了減少鍵入操作量而降低過(guò)程的可理解度。

實(shí)際應(yīng)用舉例

(1)給過(guò)程命名時(shí)應(yīng)該大小寫(xiě)字母混合使用。在變量名中使用下劃線來(lái)代替空格,這也是可以

的。不過(guò),如果使用了下劃線,那么應(yīng)該在其他地方也統(tǒng)一使用下劃線。請(qǐng)注意,不能在變量

名中使用空格。

例如:

PrivateFunctionPostInvoice()AsBoolean

PublicSubSavePicture()

(2)定義過(guò)程名時(shí)不要使用縮寫(xiě)。兩個(gè)人,會(huì)得到兩個(gè)不同的縮寫(xiě)方式。如果你認(rèn)為應(yīng)用程序

中的某些工程應(yīng)該使用縮寫(xiě),那么請(qǐng)將這些情況加上注釋,并確保每個(gè)人在所有時(shí)間內(nèi)都使用

這些縮寫(xiě)。決不要在某些過(guò)程中對(duì)某些單詞進(jìn)行縮寫(xiě),而在別的過(guò)程中卻不使用縮寫(xiě)。

不正確:

PrivateFunctionSaveEmpOAsBoolean

PublicSubDelContact()

PublicSubCalcTaxO

正確:

PrivateFunctionSaveEmployee()AsBoolean

PublicSubDeleteContact()

PublicSubCalculateSalesTax0

1.3.2為每個(gè)過(guò)程賦予單個(gè)退出點(diǎn)

對(duì)事件驅(qū)動(dòng)的應(yīng)用程序中的代碼進(jìn)行調(diào)試是非常麻煩的,因?yàn)檫^(guò)程是從別的過(guò)程中調(diào)用(扇

出)的,代碼的執(zhí)行往往像臺(tái)球桌上的臺(tái)球彈來(lái)彈去。ExitFunction和ExitSub這樣的簡(jiǎn)單語(yǔ)

句可能進(jìn)一步增強(qiáng)這種復(fù)雜性。如果每個(gè)過(guò)程擁有單個(gè)進(jìn)入點(diǎn),這將是很有意義的。你不希望

不同的調(diào)用過(guò)程能夠進(jìn)入不同代碼位置中的某個(gè)過(guò)程,這會(huì)帶來(lái)很大的問(wèn)題。每個(gè)過(guò)程也應(yīng)該

擁有單個(gè)退出點(diǎn),盡管這個(gè)問(wèn)題人們并不十分重視。

確認(rèn)控件總是以相同的方式在同一行代碼上退出一個(gè)過(guò)程時(shí),調(diào)試就會(huì)變得簡(jiǎn)單得多。如

果讓一個(gè)過(guò)程從代碼中的任何位置退出,那么你怎樣能夠確定清除代碼總是在過(guò)程退出之前執(zhí)

行呢?當(dāng)然,也許你能夠記住過(guò)程中確切的運(yùn)行情況,但是,當(dāng)另一個(gè)編程員對(duì)過(guò)程進(jìn)行編輯

時(shí),增加了一個(gè)SelectCase子句,并且使用ExitSub語(yǔ)句來(lái)退出該過(guò)程,那將會(huì)出現(xiàn)什么問(wèn)題

呢?應(yīng)該執(zhí)行以便清除該過(guò)程的任何代碼并沒(méi)有使用,因此很容易出現(xiàn)錯(cuò)誤。解決這個(gè)問(wèn)題的

辦法是在每個(gè)過(guò)程中創(chuàng)建一個(gè)PR()C_EXIT標(biāo)注。在這個(gè)標(biāo)注下面,放入所有必要的清除代碼和一

個(gè)相應(yīng)的Exit語(yǔ)句(ExitSub、ExitFunction和ExitProperty)。每當(dāng)你需要退出該過(guò)程時(shí),

只需加上一個(gè)GoToPROC_EXIT語(yǔ)句,而不必直接調(diào)用Exit命令。

創(chuàng)建單個(gè)退出點(diǎn),句使過(guò)程更像是黑箱。代碼的執(zhí)行從一個(gè)門進(jìn)來(lái),代碼的退出則從另一

個(gè)門出去,因此產(chǎn)生的錯(cuò)誤比較少,調(diào)試也不太難。創(chuàng)建單個(gè)退出點(diǎn)的操作是非常復(fù)雜的,但

是它的好處是極大的。得到的好處大于你付出的努力,這種情況并不是總能碰到,因此務(wù)必充

分利用它。當(dāng)你將清除代碼添加給過(guò)程時(shí),決不要固步自封。如果正確的退出進(jìn)程取決于某些

變量的狀態(tài),請(qǐng)檢查這些變量的值,并對(duì)清除代碼作出相應(yīng)的應(yīng)答。

1.3.3為每個(gè)過(guò)程賦予明確定義的作用域

作用域是指工程中的變量或過(guò)程的可視性。過(guò)程可以定義為擁有模塊級(jí)作用域、全局作用

域或友元作用域。當(dāng)一個(gè)過(guò)程用Private關(guān)鍵字來(lái)說(shuō)明時(shí),便擁有模塊級(jí)作用域,并且它只能用

同一模塊中的過(guò)程來(lái)調(diào)用。如果用關(guān)鍵字Public來(lái)說(shuō)明一個(gè)過(guò)程,那么這個(gè)過(guò)程將擁有全局作

用域,并且可以用工程中的任何模塊來(lái)調(diào)用。此外,公用類模塊的公用過(guò)程可用于外部程序。

用Friend關(guān)鍵字說(shuō)明的(公用類模塊中的)過(guò)程將使該過(guò)程成為工程中的所有模塊的公用過(guò)程,

但是它不能使該過(guò)程成為外部程序的公用過(guò)程。創(chuàng)建過(guò)程時(shí),始終都應(yīng)顯式地定義它的作用域。

雖然不使用PublicPrivate或Friend將無(wú)法定義一個(gè)過(guò)程,但是你應(yīng)該避免這樣進(jìn)行操作。請(qǐng)

觀察下面這個(gè)標(biāo)準(zhǔn)模塊中的過(guò)程定義。這是個(gè)模塊的專用過(guò)程,還是工程中所有模塊的公用過(guò)

程呢?

SubDisplayConfirmationMessage()

EndSub

上面這個(gè)過(guò)程實(shí)際上是個(gè)公用過(guò)程,因?yàn)閂isualBasic使用Public作為默認(rèn)作用域。如果你真

的想創(chuàng)建一個(gè)公用過(guò)程,請(qǐng)向代碼閱讀者說(shuō)明這一點(diǎn),方法是像下面這樣用關(guān)鍵字Public顯式

地說(shuō)明該過(guò)程:

PublicSubDisplayConfirmationMessage0

EndSub

許多情況下,不用Public、Private或Friend說(shuō)明的過(guò)程實(shí)際上將作為模塊級(jí)(專用)過(guò)程來(lái)使

用。但是,如果不專門說(shuō)明為專用過(guò)程,它們就會(huì)無(wú)意中創(chuàng)建為公用過(guò)程。通過(guò)為每個(gè)過(guò)程賦

予一個(gè)明確定義的作用域,可以減少代碼閱讀者需要投入的工作量。另外,應(yīng)該確保你為過(guò)程

賦予最有意義的作用域。如果一個(gè)過(guò)程只被同一模塊中的另一個(gè)過(guò)程調(diào)用,那么請(qǐng)將它創(chuàng)建成

專用過(guò)程。如果該過(guò)程是從多個(gè)模塊中的多個(gè)過(guò)程中調(diào)用,請(qǐng)將該過(guò)程說(shuō)明為公用過(guò)程。

1.3.4用參數(shù)在過(guò)程之間傳遞數(shù)據(jù)

雖然模塊級(jí)變量的問(wèn)題不像全局變量那么多,但是你也應(yīng)該盡量避免使用模塊級(jí)變量。一

般來(lái)說(shuō),變量的作用域越小越好。為了減少模塊級(jí)變量和全局變量,方法之一是將數(shù)據(jù)作為參

數(shù)在不同過(guò)程之間傳遞,而不是讓過(guò)程共享全局變量或模塊級(jí)變量。

(1)為每個(gè)參數(shù)指定數(shù)據(jù)類型。這個(gè)問(wèn)題應(yīng)該給予充分的重視。創(chuàng)建帶有參數(shù)的過(guò)程時(shí),請(qǐng)務(wù)

必將每個(gè)參數(shù)明確說(shuō)明為一個(gè)特定的數(shù)據(jù)類型。當(dāng)你省略參數(shù)說(shuō)明中的As<type>部分時(shí),該參

數(shù)將作為Variant(變碼)來(lái)創(chuàng)建,如果你想創(chuàng)建Variant參數(shù),請(qǐng)使用AsVariant進(jìn)行顯式創(chuàng)建。

(2)根據(jù)情況傳遞數(shù)據(jù)ByVai或ByRef。除非另有說(shuō)明,否則VisualBasic均按引用將數(shù)據(jù)傳遞

給過(guò)程的參數(shù)。當(dāng)變量按引用(ByRef)傳遞給過(guò)程的參數(shù)時(shí),該過(guò)程就會(huì)收到個(gè)原始變量的指

針。對(duì)參數(shù)進(jìn)行的后續(xù)修改均是對(duì)原始變量的修改。另外,當(dāng)變量按值(ByVai)傳遞給參數(shù)時(shí),

該過(guò)程就會(huì)收到變量的一個(gè)拷貝(字符串變量是這條規(guī)則的例外)。對(duì)參數(shù)所做的任何修改只

是對(duì)拷貝的修改,而原始變量將保持不變。可以使用的一個(gè)標(biāo)準(zhǔn)是在每個(gè)參數(shù)前面冠以ByRef

或ByVai。這樣,你就可以明確說(shuō)明使用哪個(gè)進(jìn)程,并且代碼會(huì)變得更加直觀明了。但是,給每

個(gè)參數(shù)冠以ByRef或ByVai所需要的規(guī)則是非常重要的。另一個(gè)更加容易的解決辦法是只有在該

參數(shù)用于更改原始變量(也叫做變?cè)┑闹禃r(shí)才給參數(shù)冠以ByRef。在這種情況下,這個(gè)實(shí)際應(yīng)

用將是“當(dāng)參數(shù)用于更改它的變?cè)闹禃r(shí),將參數(shù)明確說(shuō)明為ByRef"。這時(shí),可以將一個(gè)注釋

添加給過(guò)程注釋標(biāo)題的Accepts部分,說(shuō)明該參數(shù)將用作一個(gè)輸出參數(shù),也就是用于修改它的變

元的值。這種方法可使你做到兩全其美。

1.3.5使用統(tǒng)一和直觀明了的方式來(lái)調(diào)用過(guò)程

VisualBasic提供了許多快捷操作方式,可供在編寫(xiě)代碼時(shí)使用。一般來(lái)說(shuō),這些快捷方

式不影響代碼的運(yùn)行性能,但是它們往往犧牲了代碼的可讀性,以便在進(jìn)行軟件開(kāi)發(fā)時(shí)省去一

些擊鍵操作。應(yīng)該盡量使代碼做到直觀明了。有的時(shí)候,也就是當(dāng)調(diào)用過(guò)程的時(shí)候,可以采用

快捷方式,然而你不應(yīng)該這樣去做。你可以用許多不同的方法來(lái)調(diào)用一個(gè)過(guò)程。當(dāng)調(diào)用Sub過(guò)程

時(shí),可以使用單詞Call,也可以省去這個(gè)單詞。雖然可以省略單詞Call,這樣你就不必鍵入兩

個(gè)括號(hào)來(lái)啟動(dòng)代碼,但是你應(yīng)該避免使用這種方法。關(guān)鍵字Call專門用來(lái)指明該語(yǔ)句是調(diào)用一

個(gè)Sub過(guò)程,而不是調(diào)用Function過(guò)程,因此它使代碼更容易閱讀。VisualBasic允許你以完全

相同的方法來(lái)調(diào)用Sub過(guò)程和Function過(guò)程。請(qǐng)看下面這個(gè)函數(shù):

PublicFunctionDisplayContact(IngContactNumberAsLong)AsBoolean

EndFunction

你可以使用下面的任何一個(gè)語(yǔ)句來(lái)調(diào)用該函數(shù):

CallShowRep(IngRepNumber)

ShowRepIngRepNumber

blnResult=ShowRep(IngRepNumber)

為了使代碼盡可能直觀明了,必須將調(diào)用Sub過(guò)程與調(diào)用Function過(guò)程區(qū)分開(kāi)來(lái)。調(diào)用Sub

過(guò)程時(shí),始終都應(yīng)使用關(guān)鍵字Call;調(diào)用Function過(guò)程時(shí),始終都應(yīng)檢索Function調(diào)用的值,

即使你并不使用這個(gè)值,也應(yīng)這么做。上例中的第一個(gè)語(yǔ)句是個(gè)誤導(dǎo),它看上去是個(gè)Sub過(guò)程調(diào)

用,而不是Function過(guò)程調(diào)用。雖然第二個(gè)語(yǔ)句比第一個(gè)語(yǔ)句好一些,但是它并沒(méi)有檢索函數(shù)

的結(jié)果。它不像第三個(gè)語(yǔ)句那樣容易閱讀,它確實(shí)檢索函數(shù)的結(jié)果。如果你準(zhǔn)備使用函數(shù)調(diào)用

的結(jié)果,應(yīng)該將一個(gè)注釋放在Function調(diào)用的前面,說(shuō)明該函數(shù)返回什么以及為什么你不需要

它。

實(shí)際應(yīng)用舉例

(1)調(diào)用Sub過(guò)程時(shí)始終都要使用Call關(guān)鍵字。調(diào)用Sub過(guò)程時(shí),通過(guò)使用Call關(guān)鍵字,更容易

將Sub調(diào)用與Function調(diào)用區(qū)分開(kāi)來(lái)。

(2)當(dāng)你將變量設(shè)置為一個(gè)函數(shù)的結(jié)果時(shí),請(qǐng)給調(diào)用的Function加上括號(hào),即使它不帶任何變

元,也應(yīng)該加上。當(dāng)調(diào)用Function過(guò)程時(shí),如果該過(guò)程不接受任何變?cè)?,就不一定使用括?hào)。但

是,如果你加上括號(hào),代碼將變得更加直觀明了。加匕括號(hào)后,將更容易說(shuō)明該符號(hào)是個(gè)函數(shù)

名,而不是變量名。

不正確:

strDefaultWareHouse=GetDefaultWarehouse

正確:

strDefaultWareHouse=GetDefaultWarehouse0

(3)始終都應(yīng)該檢索函數(shù)的返回值,即使你并不使用它,也應(yīng)該檢索。雖然VisualBasic允許

在調(diào)用Function過(guò)程時(shí)不檢索函數(shù)的返回值,但是你始終都應(yīng)該檢索返回值,這可以提高代碼

的可讀性,并且非常有助于調(diào)試進(jìn)程。許多函數(shù)返回一個(gè)結(jié)果代碼,指明函數(shù)運(yùn)行是否成功。

雖然你不需要立即使用結(jié)果代碼,但以后它會(huì)變得非常有用。

第2章命名約定

隨著VisualBasic變得日益復(fù)雜,新對(duì)象和新的數(shù)據(jù)類型不斷涌現(xiàn)。程序代碼常常要引用

控件和變量,在復(fù)雜的過(guò)程中,很難完全理解代碼中出現(xiàn)的所有元素。如何確定某個(gè)語(yǔ)句是引

用一個(gè)變量還是控件呢?如果沒(méi)有某種約定將變量與控件區(qū)分開(kāi)來(lái),代碼就很難閱讀。例如,

你能說(shuō)清下面這個(gè)語(yǔ)句的確切含義嗎?

TotalDue=LineItemTotal-Discount+TotalTax

如果沒(méi)有辦法將不同數(shù)據(jù)類型的變量與各種不同對(duì)象區(qū)分開(kāi)來(lái),你就無(wú)法知道該語(yǔ)句是干什么

的。TotalDue究竟是個(gè)變量還是個(gè)文本框呢?抑或它是個(gè)標(biāo)準(zhǔn)控件呢?同樣的問(wèn)題也適用于其

他項(xiàng)目。如果LineltemTotal是個(gè)變量,那么它是什么類型的變量呢?是貨幣、單精度數(shù)值,還

是變碼呢?若要使代碼更加直觀明了(這始終是個(gè)重要的目的),并且減少編程出錯(cuò)的機(jī)會(huì),

就需要一個(gè)簡(jiǎn)便的方法,將變量與控件區(qū)分開(kāi)來(lái)。你需要使它能夠非常容易地確定變量的數(shù)據(jù)

類型和控件的準(zhǔn)確類型。

2.1匈牙利標(biāo)記法

軟件開(kāi)發(fā)人員從最早的數(shù)據(jù)類型后綴改為使用單字符前綴(例如DimlwidthAsLong和Dim

iHeightAsInteger)0前綴的作用更有意義,因?yàn)樗鼈兺ǔ1确?hào)更直觀,而且可以使用的

前綴數(shù)目更多。但單字符前綴只有26個(gè)字符可以使用(但比可以使用的符號(hào)數(shù)目要多),而不

同類型的變量和對(duì)象很多,其中許多變量和對(duì)象都共用相同的首字母。更好的命名約定最終代

替了單字符前綴。這種命名約定稱為匈牙利標(biāo)記法,它使用3字符

2.2編程中使用的約定

前綴來(lái)表示數(shù)據(jù)類型和控件類型,這種命名約定之所以稱為匈牙利標(biāo)記法,部分原因是它

的發(fā)明人查爾斯?西蒙尼祖籍是匈牙利,部分原因是這些前綴常常使變量名看上去像個(gè)外文字。

隨著前綴所表示的信息的增加,前綴的長(zhǎng)度也會(huì)變長(zhǎng),比如作用域或變量是個(gè)數(shù)組時(shí),就會(huì)出

現(xiàn)這種情況。雖然標(biāo)準(zhǔn)前綴通常為3個(gè)字符,隨著修飾符的增加,使用較長(zhǎng)前綴的命名約定也稱

為匈牙利標(biāo)記法,匈牙利標(biāo)記法是個(gè)總的概念,而不是特定的實(shí)現(xiàn)方法。在匈牙利標(biāo)記法中,

一個(gè)獨(dú)一無(wú)二的3字符前綴被賦予每個(gè)數(shù)據(jù)類型和每個(gè)控件類型。3個(gè)字符可以實(shí)現(xiàn)充分的多變

性,并使前綴合乎邏輯和直觀。觀察下面的Dim語(yǔ)句,你會(huì)看到前綴是如何直觀地與賦予變量的

數(shù)據(jù)類型相匹配的:

DimstrNameAsString

DimintAgeAsInteger

DimIngMilesAsLong

DimcurSalaryAsCurrency

2.2.1表示變量數(shù)據(jù)類型的前綴

下表列出了一些前綴,可以用來(lái)表示變量的數(shù)據(jù)類型。

數(shù)據(jù)類型前綴舉例

Boolean(布爾值)blnblnLoggedln

Currency(貨幣)curcurSalary

Conlrol(控件)ctrctrLastControl

Double(雙精度實(shí)數(shù))dbldblMiles

ErrObject(錯(cuò)誤對(duì)象?errerrLastErnor

Single(單精度實(shí)數(shù)>sngsngYears

HandIe(句柄)hwndhwndPicture

Lon以長(zhǎng)整型數(shù))IngIngOnHand

Object(對(duì)如objobjUserTable

Integen整型數(shù))intintAge

String(字符串)strstrName

Use-definedtype(用戶定義的類型)udtudtEniployee

Variant(includingDates)(變碼包括日期))vntvntDateHired

Array(數(shù)組)aastrEmployees

前綴obj應(yīng)該保留到某個(gè)前綴不適用時(shí)使用。該前綴最常用于引用其他應(yīng)用程序的

Automation(自動(dòng)化)庫(kù)。例如,當(dāng)自動(dòng)運(yùn)行MicrosoftWord時(shí),你可以創(chuàng)建Word的Application

對(duì)象的一個(gè)實(shí)例。由于沒(méi)有為Word對(duì)象專門指定前綴,因此obj正好適用,如下面的語(yǔ)句所示:

DimobjWordAs.WordApplication

用戶定義的數(shù)據(jù)類型(UDT)是自定義的數(shù)據(jù)結(jié)構(gòu)。在許多情況下,由于你具備創(chuàng)建對(duì)象的能力,

因此就不必使用UDT,但是在某些情況下你仍然必須使用UDT。用戶定義的數(shù)據(jù)類型是由多個(gè)變

量構(gòu)成的,而這些變量常常屬于不同的類型。當(dāng)用戶定義UDT時(shí),它應(yīng)該加上前綴type-但是,

構(gòu)成UDT的每個(gè)變量都應(yīng)該包含它的類型前綴,或者根本不加任何前綴。雖然通常給變量加上前

綴是個(gè)好主意,但是有些軟件開(kāi)發(fā)人員認(rèn)為,這樣做會(huì)使人感到使用UDT不屬于面向?qū)ο蟮牟僮鳌?/p>

如果使用MicrosoftWindowsAPI(應(yīng)用程序編程界面),那么你會(huì)發(fā)現(xiàn)WindowsAPI的類型并

不將前綴用于成員變量。與使用標(biāo)準(zhǔn)時(shí)的各種情況樣,無(wú)論你使用何種方法,都應(yīng)該始終如

一地使用這種方法。下面的代碼顯示了創(chuàng)建自定義的UDT時(shí)可以使用的兩種方法:

PrivateTypetype_Printer

DriverNameAsString

DeviceNameAsString

PortAsString

CopiesAsInteger

OrientatioAsLong

EndType

PrivateTypetype_Printer

strDriverNameAsString

strDeviceNameAsString

strPortAsString

intCopiesAsInteger

IngOrientationAsLong

EndType

當(dāng)你創(chuàng)建一個(gè)變量,用于放置用戶定義的數(shù)據(jù)類型時(shí),請(qǐng)使用UDT前綴。但是UDT并不能告訴你

變量中存放的某個(gè)UDT的任何情況,由于不同程序的情況千差萬(wàn)別,因此不可能為它們賺予特定

的前綴。下面這個(gè)語(yǔ)句是前面創(chuàng)建的數(shù)據(jù)類型的示例說(shuō)明:

DimudtPrinterAstype_Printer

給變量加上前綴a,說(shuō)明它是個(gè)數(shù)組,這與給其他類型的變量加上前綴是不一樣的。你可以使用

a來(lái)表示該變量是個(gè)數(shù)組,不過(guò),這時(shí)你可以在a的后面跟著加上該數(shù)據(jù)類型的前綴,例如:

DimasngGrades(9)AsSingle

2.2.2表示變量的作用域的前綴

除了給變量加上前綴來(lái)表示它的數(shù)據(jù)類型外,你也可以并且應(yīng)該使用前綴來(lái)表示變量的作

用域。這個(gè)作用域指示字符置于數(shù)據(jù)類型前綴的前面,并且用一個(gè)下劃線將它們隔開(kāi)。如下表

所示。例如,若要表示模塊及字符串變量,可以使用下面這樣的語(yǔ)句:

Dimm_strNameAsString

前綴描述舉例

g全局變量^_strSavePath

m模塊或肉體的局部變量DataClianged

st靜態(tài)變量st_blnlnllere

(無(wú)前綴)過(guò)程的非靜態(tài)局部變量intIndex

2.2.3其他前綴

前綴并不只是用于變量。所有標(biāo)準(zhǔn)對(duì)象(包括窗體和控件)都有一個(gè)3字符前綴,如下系列

表所示。如果你還不了解這些前綴,應(yīng)該學(xué)會(huì)使用這些前綴,并且始終一貫地使用。將標(biāo)準(zhǔn)的3

字符前綴正確地應(yīng)用于所有的變量和對(duì)象,會(huì)使你的代碼更加直觀明了,容易維護(hù)。

用于標(biāo)準(zhǔn)控件的前綴

控件前綴舉例控件前綴舉例

復(fù)選框chkchkPrint找條lin1inVertical

組合框cbocboTitle列表框1stIstResuItCodes

命令按鈕cmdcmdCancdMDI子窗體nidimdiContact

數(shù)據(jù)datdatBiblio菜單munmunFileOpen

目錄列表框dirdirSourceOLE容器oleolePhoto

驅(qū)動(dòng)器列表框drvdrvTar^et選項(xiàng)按鈕optSpanish

文件列表程filfilSource面板pnISettings

圖文框frafraLanguage圖片框picDiskSpace

窗體frmfrmMain剪修圖clpToolbar

組按鈕gpbgpbCliannel形狀shpCircle

水平滾動(dòng)條hsbiTshVolume文本框txtAddress

圖象imgimgkon計(jì)時(shí)^tmrAlann

標(biāo)注IblIblHelpMessage垂直滾動(dòng)條vsbRate

用于數(shù)據(jù)庫(kù)對(duì)象的前綴

對(duì)象前綴舉例

數(shù)據(jù)庫(kù)dbdbCustomers

域(對(duì)象或?qū)ο蠹希ゝidIldLaslName

索引(對(duì)象或?qū)ο蠹希﹊dxidxAge

查詢定義qryqrySalesByRegion

記錄集rstrstSalesByRegion

報(bào)表rplrptAnnualSales

表格定義tbltblCustomer

第3章使用常量和枚舉值

使用常量和枚值的目的是:

?減少數(shù)字換位和鍵入錯(cuò)誤帶來(lái)的代碼錯(cuò)誤

?將來(lái)可以更容易更改各個(gè)值

?使代碼更加容易閱讀

?確保向前兼容

對(duì)過(guò)程中的數(shù)字進(jìn)行硬編碼時(shí),許多東西都可能出錯(cuò)。硬編碼的數(shù)字通常稱為“幻數(shù)”,

因?yàn)樗鼈兺幱谝环N神秘的氣氛之中。而且這種數(shù)字的含義非常模糊,因?yàn)檫@些數(shù)字本身并

不指明它代表的是什么。本章將要說(shuō)明幻數(shù)的不足之處,并用常量和枚舉值來(lái)替代它們。

3.1使用常量

常量很像變量,你可以為它創(chuàng)建一個(gè)名字,并為它賦予一個(gè)值。但是,與變量不同的是,

常量是在設(shè)計(jì)代碼時(shí)被賦予它的值的,這個(gè)值不能在運(yùn)行時(shí)更改。你始終都應(yīng)該用常量代替幻

數(shù),其原因?qū)⒃诒竟?jié)中介紹。注意對(duì)過(guò)程中的字符串進(jìn)行硬編碼時(shí),其作用與使用幻數(shù)相似。

消除幻數(shù)的所有原因也適用于消除硬編碼的字符串。如果你在設(shè)計(jì)代碼時(shí)知道它的值,那么請(qǐng)

使用常量,而不要對(duì)文本或數(shù)字進(jìn)行硬編碼。

3.1.1幻數(shù)很容易在數(shù)據(jù)輸入時(shí)出錯(cuò)

幻數(shù)存在的主要問(wèn)題之一是你很容易在鍵入數(shù)字時(shí)出錯(cuò),從而顛倒了數(shù)字的位置。例如,

當(dāng)你鍵入數(shù)字10876時(shí),很容易錯(cuò)誤地鍵入10867或18076。與處理變量和保留字的方法不同,

VisualBasic的編譯器并不在乎顛倒了位置的數(shù)字和不正確的數(shù)字,它能使用你提供給它的任

何幻數(shù)。有時(shí)簡(jiǎn)單的錯(cuò)誤造成的問(wèn)題不會(huì)立即表現(xiàn)出來(lái),而當(dāng)問(wèn)題表現(xiàn)出來(lái)時(shí),它們會(huì)以隨機(jī)

的計(jì)算錯(cuò)誤的形式出現(xiàn),這些錯(cuò)誤很難準(zhǔn)確定位。用常量來(lái)取代幻數(shù)時(shí),VisualBasic將在編

譯時(shí)檢查常量的有效性。如果常量不存在,VisualBasic便將這一情況通知你,并且拒絕進(jìn)行

編譯。這可以消除錯(cuò)誤鍵入的數(shù)字帶來(lái)的問(wèn)題,只要常量擁有正確的值,使用該常量的所有代

碼也將使用該正確值。注意如果你在模塊的Declarations部分中沒(méi)有加上OptionExplicit語(yǔ)

句,同時(shí)你的常量名又出現(xiàn)了鍵入錯(cuò)誤,那么VisualBasic就會(huì)用不正確的常量名來(lái)說(shuō)明一個(gè)

變量,從而導(dǎo)致結(jié)果不準(zhǔn)確,這是你必須顯式說(shuō)明變量的又一個(gè)原因。

3.1.2幻數(shù)很難更新

幻數(shù)的另一個(gè)重大缺點(diǎn)是它們很難不斷更新。假如你開(kāi)發(fā)了一個(gè)財(cái)務(wù)應(yīng)用程序,當(dāng)前的抵

押貸款利率是7.25%。另外假設(shè)這個(gè)值是在根據(jù)利率進(jìn)行計(jì)算的許多過(guò)程中硬編碼的值。當(dāng)利

率變化時(shí),你該怎么辦?(利率是經(jīng)常變化的。)可以進(jìn)行全局搜索并用新利率取代舊利率,

但是這會(huì)使你的代碼出錯(cuò)。在應(yīng)用程序中使用的另一個(gè)貸款利率的值可能也是7.25。如果執(zhí)行

全局搜索,并取代了7.25%,你就也改變了這個(gè)貸款利率。如果用人工更改代碼中的每個(gè)值,

可能出現(xiàn)數(shù)字換位的錯(cuò)誤,也可能鍵入新值時(shí)出錯(cuò)。進(jìn)行有選擇的搜索和取代,并且對(duì)每個(gè)更

改進(jìn)行確認(rèn),這又太費(fèi)時(shí)間。如果改用常量,你只要將值更改一次(在常量的說(shuō)明中進(jìn)行更改),

使用抵押貸款利率的每行代碼將立即改用更新后的利率。

3.1.3常量使代碼更容易閱讀

使用常量后,得到的一個(gè)額外好處是可使創(chuàng)建的代碼更容易閱讀。一般來(lái)說(shuō),幻數(shù)很不直

觀。也許你對(duì)幻數(shù)非常了解,但是其他人則根本看不明白。通過(guò)合理地給常量命名,使用這些

常量的代碼就變得比較直觀明了,更加容易閱讀。請(qǐng)看下面兩個(gè)代碼語(yǔ)句,究竟哪一個(gè)語(yǔ)句對(duì)

你更有意義呢?

幻數(shù):

curlnterestAmount=(curLoanAmount*.06)/12

用名常量:

curlnterestAmount=_

(curLoanAmount*c_snglnterestRate)/c_intMonthsInTerm

關(guān)于常量,最后要說(shuō)明后一點(diǎn)是,非常適合為‘日量賦予較寬的作用域,這與使用變量時(shí)的情況

不同。在使用變量時(shí),最好應(yīng)該縮小作用域。而在一,個(gè)應(yīng)用程序中你決不應(yīng)該兩次創(chuàng)建相同的

常量。如果你發(fā)現(xiàn)自己復(fù)制了一個(gè)常量,請(qǐng)將原始的常量說(shuō)明轉(zhuǎn)至較寬的作用域,直到該常量

可供引用它的所有過(guò)程使用為止。

3.2使用枚舉值

枚舉值與常量相似,因?yàn)樗鼈兌际潜毁x予值的有名實(shí)體。但是,枚舉值的行為特性類似模

塊中的公用常量組。它們被當(dāng)作數(shù)據(jù)類型來(lái)處理,可以用它們創(chuàng)建具有相應(yīng)的變量和屬性值的

常量。也許你已經(jīng)在使用VisualBasic中的枚舉值了。例如,當(dāng)你使用MsgBox語(yǔ)句時(shí),

VisualBasic的AutoListMembers(自動(dòng)列出成員)特性為Buttons參數(shù)顯示一個(gè)卜拉列表(通

常稱為“代碼幫助程序下拉列表”)(見(jiàn)下圖)。

MsgBox語(yǔ)句的開(kāi)發(fā)人員為了提供枚舉值中的Buttons參數(shù)的值而投入的時(shí)間使作為程序員

的你得到了應(yīng)有的回報(bào)。你永遠(yuǎn)不必記住參數(shù)的數(shù)值,錯(cuò)誤地設(shè)定值的可能性也大大減少了。

雖然你仍然可以為參數(shù)設(shè)定數(shù)值,而不是設(shè)定枚舉成員的名字,但是你決不應(yīng)該這樣去做。當(dāng)

可以使用相關(guān)的成員名時(shí),仍然使用幻數(shù),這是一種愚蠢的做法。

3.2.1創(chuàng)建自定義的枚舉值

創(chuàng)建枚舉值的情況與創(chuàng)建用戶定義的數(shù)據(jù)類型是非常相似的。在模塊的Declarations部分

中,你可以鍵入單詞Public或Private,再鍵入Enum,然后鍵入你的自定義枚舉名。下面是個(gè)示

例枚舉:

PublicEnumotBorderStyle

otNone=0

otRaised_Light=1

otRaised_Heavy=2

otSunken_Light=3

otSunken_Heavy=4

EndEnum

這個(gè)枚舉創(chuàng)建了一個(gè)帶有5個(gè)值的枚舉類型。雖然在編寫(xiě)代碼時(shí)總是要引用枚舉成員的名字,但

這個(gè)名字只代表它的數(shù)值,很像常量一樣。枚舉值的所有成員都是長(zhǎng)整型數(shù),你不得使用其他

數(shù)據(jù)類型。

3.2.2使用自定義枚舉值

一旦你創(chuàng)建了一個(gè)枚舉后,就可以將它用作該枚舉作用域中的任何變量、Function過(guò)程或

Property過(guò)程的數(shù)據(jù)類型。例如,若要?jiǎng)?chuàng)建使用上面所示的枚舉類型的BorderStyle屬性,你可

以說(shuō)明下面這樣的一個(gè)過(guò)程:

PublicPropertyLetBorderStyle(IngNweBorderStyleAsotBorderStyle)

EndProperty

這個(gè)屬性過(guò)程接受一個(gè)輸入?yún)?shù)lngNew_BorderStyle的值。lngNew_BorderStyle是個(gè)長(zhǎng)整型數(shù),

因?yàn)樗徽f(shuō)明為一個(gè)枚舉類型,并且枚率的所有成員都是長(zhǎng)整型數(shù)。在代碼中引用這個(gè)屬性時(shí),

VisualBasic就顯示代碼幫助程序下拉列表,里面是所有枚舉成員,如下圖所示。

你還可以將枚舉類型用作函數(shù)過(guò)程或?qū)傩赃^(guò)程返回的數(shù)據(jù)類型。例如,若要?jiǎng)?chuàng)建對(duì)應(yīng)于前面介

紹的PropertyLet過(guò)程的PropertyGet過(guò)程,你可以使用下面這個(gè)代碼:

PublicPropertyGetBorderStyle()AsotBorderStyle

EndProperty

請(qǐng)注意,簡(jiǎn)單地將參數(shù)說(shuō)明為枚舉類型,并不能保證傳遞給參數(shù)的值成為已定義的枚舉成員之

一。實(shí)際上這是枚舉類型最常見(jiàn)的錯(cuò)誤概念之一。當(dāng)你定義一個(gè)枚舉后,就定義了一個(gè)有名值

列表,但是這些值并不是該枚舉類型的參數(shù)將要接受的唯一值。如前所述,定義為枚舉類型的

參數(shù)實(shí)際上是長(zhǎng)整型數(shù)。因此,它們能夠接受符合長(zhǎng)整型數(shù)的任何值,而并不確認(rèn)傳遞給參數(shù)

的數(shù)字對(duì)應(yīng)于枚舉值的一個(gè)成員。由于這個(gè)原因,你始終都應(yīng)該檢驗(yàn)傳遞給說(shuō)明為枚舉類型的

參數(shù)的數(shù)據(jù),就像在3.3.8節(jié)中介紹的那樣。

3.3編程原則

3.3.1給所有常量加上前綴c_和作用域指示符

在過(guò)去,表示常量所用向一種約定是常量名全部使用大寫(xiě)字母。例如,創(chuàng)建一個(gè)常量以便

將列索引存放在表格中時(shí),你可以使用下面這個(gè)語(yǔ)句:

ConstCOLUMN_INDEX=7

全部使用大寫(xiě)字母卷任何元素鍵入代碼,現(xiàn)在已被視為過(guò)時(shí)的做法,是人們不希望的?;旌鲜?/p>

用大寫(xiě)和小寫(xiě)字母的文本比較容易閱讀。但是,由于變量名和過(guò)程名也混合使用大寫(xiě)和小寫(xiě)字

母,因此,如果某個(gè)輸入項(xiàng)是常量,應(yīng)該加以指明。較好的辦法是給常量名加上前綴c_。例如,

上面所示的常量可以說(shuō)明為下面的形式:

Constc_Column_Index=7

這個(gè)常量名就比較容易閱讀,并且可以立即說(shuō)出你看到的是常量而不是變量。第二個(gè)下劃線可

有可無(wú)。有些開(kāi)發(fā)人員(包括我自己)傾向于不這樣使用下劃線。只要你采用始終一貫的方法,

就是可行的。如果不使用第二個(gè)下劃線,那么同樣的常量說(shuō)明將類似下面這行代碼中的樣子(請(qǐng)

記住,常量前綴始終都應(yīng)帶有下劃線)。

Constc_ColumnIndex=7

注意用于GoTo的標(biāo)注是混合使用大小寫(xiě)字母的少數(shù)例外之一。應(yīng)該盡量少用的這種標(biāo)注均全部

以大寫(xiě)字母的形式出現(xiàn),常量不同于變量的另一個(gè)標(biāo)識(shí)特征是不使用數(shù)據(jù)類型前綴。例如,如

果將列指示符存放在變量中,你可以用下面這個(gè)語(yǔ)句來(lái)說(shuō)明該變量:

DimintColumnlndexAsInteger

注意有些外部數(shù)據(jù)庫(kù)仍然使用大寫(xiě)字母常量。例如,如果用API瀏覽器查找和拷貝與API相關(guān)的

常量,你常常可以看到它們是使用大寫(xiě)字母的常量。在這種情況下,請(qǐng)使這些常量保持原狀,

以便達(dá)成應(yīng)用程序之間的一致性。許多編程員并不知道可以創(chuàng)建特定數(shù)據(jù)類型的常量。例如,

下面這個(gè)語(yǔ)句是完全合法的:

Constc_InterestRateAsSingle-7.5

可以為常量如定一個(gè)數(shù)據(jù)類型,但是這增加了代碼的復(fù)雜性,我不知道這樣做是否有很好的道

理。如果你一定要這樣去做,應(yīng)該使用第2章所說(shuō)的變量命名前綴。例如,按照本文介紹的編程

原則,上面這個(gè)語(yǔ)句是不正確的,因?yàn)樗÷粤藬?shù)據(jù)類型前綴。正確的句法如下所示:

Constc_sngInterestRateAsSingle=7.5

雖然常量的前綴不同于變量的前綴,但是仍然應(yīng)該使用相同的方案來(lái)指明用于變量的常量作用

域。如果是本地說(shuō)明(過(guò)程中)的常量,則不必使用作用域指示符。如果是在模塊的Declarations

部分中說(shuō)明為Private(專用)的常量,就應(yīng)該使用前綴m。如果是全局常量(在標(biāo)準(zhǔn)模塊中說(shuō)

明為Public常量),就應(yīng)該使用前綴g。下面是使用不同等級(jí)的作用域的同一個(gè)常量的說(shuō)明語(yǔ)句:

Procedure:Constc_InterestRate=7.5

Module(private):PrivateConstmc_InterestRate=7.5

Global:PublicConstgc_InterestRate=7.5

注意如果不用Public關(guān)鍵字需常量進(jìn)行顯式說(shuō)明,那么該常量將默認(rèn)說(shuō)明為Private常量。與過(guò)

程和變量一樣,常量應(yīng)該總是具有明確定義的作用域。如果你想創(chuàng)建專用常量,請(qǐng)用Private

關(guān)鍵字顯式說(shuō)明該常量。除了用c_來(lái)表示常量外,通過(guò)始終一貫地規(guī)定常量的作用域,你的代

碼將會(huì)更容易閱讀和調(diào)試。如果不清楚常量是在何處說(shuō)明的,你只需將光標(biāo)置于常量名中的任

何一個(gè)位置,并按下Shift+F2鍵。這時(shí)VisualBasic就會(huì)立即顯示該常量的說(shuō)明。

實(shí)際應(yīng)用舉例

(1)混合使用大小寫(xiě)字母來(lái)說(shuō)明常量,并給每個(gè)常量加上前綴c_。請(qǐng)記住,全部使用大寫(xiě)字母

來(lái)標(biāo)識(shí)常量的做法已經(jīng)過(guò)時(shí)了。

(2)使用作用域指示符前綴來(lái)表示常量的作用域。了解常量的作用域?qū)τ诖a的調(diào)試是非常重

要的。在任何類型的模塊中的Declarations部分中說(shuō)明的所有常量都需要一個(gè)g或m指示符。

3.3.2無(wú)論什么作用域,均用常量取代幻數(shù)

希望本章的第一部分已經(jīng)使你了解到無(wú)論什么作用域都用常量來(lái)取代硬編碼數(shù)字(幻數(shù))

的重要性。也許人們非常希望在過(guò)程中使用幻數(shù),因?yàn)樵趩蝹€(gè)位置中創(chuàng)建只使用一次的常量,

這種做法似乎有些傻。當(dāng)然,保留一個(gè)值是太容易了。當(dāng)數(shù)字只存在一次的時(shí)候,你不必進(jìn)行

搜索和替代操作。但是可讀性仍是個(gè)問(wèn)題?;脭?shù)稱之為“幻”是有原因的。當(dāng)另外某個(gè)人觀察

代碼時(shí),你怎么能夠知道這個(gè)數(shù)字對(duì)他完全有用呢?無(wú)論什么作用域,你都應(yīng)該用常量來(lái)取代

幻數(shù)??傊?,現(xiàn)在你應(yīng)該“使用常量取代幻數(shù),無(wú)論是什么作用域。”

3.3.3只要可能,均應(yīng)使用枚舉

當(dāng)過(guò)程或參數(shù)被說(shuō)明為枚舉類型時(shí),常用的做法(這是你的責(zé)任)是引用枚舉成員名而不

是引用它們的值。使用枚舉時(shí),代碼將比較容易閱讀,并且不太容易包含錯(cuò)誤。如果某人在后

來(lái)改變了對(duì)應(yīng)于枚舉成員名的值,因而破壞了向后兼容性,你的代碼也不太可能運(yùn)行失敗。例

如,你使用一個(gè)ActiveX組件,它的屬性之一是BorderStyle。編程員指定O-Flat和1-3D作為它

的值,并且將它們作為枚舉的成員,如下所示:

PublicEnumBorderStyle

psFlat=0

ps3D=1

EndEnum

你使用字面值而不是枚舉的成員名,并且將它更新為一個(gè)新組件。程序員給組件添加了一個(gè)新

BorderStyle值,稱為Chiseled。但是沒(méi)有考慮向后兼容性的問(wèn)題,并且他將枚舉結(jié)構(gòu)改為下面

的形式:

PublicEnumBorderStyle

psFlat=0

psChiseled=1

ps3D=2

EndEnum

可以看到,如果對(duì)1進(jìn)行硬編碼,以便指定一個(gè)3D邊框,那么當(dāng)你對(duì)組件升級(jí)后,就會(huì)得到意料

不到的結(jié)果。顯然,組件編程員不應(yīng)該這樣來(lái)破壞向后兼容性,但是這種情況確實(shí)發(fā)生了。如

果使用枚舉成員的名字而不是它的值,你的代碼就不會(huì)受這種忽略兼容性問(wèn)題的影響。究竟是

否使用枚舉值,這甚至不應(yīng)成為一個(gè)問(wèn)題。如果一個(gè)函數(shù)支持枚舉值,那么請(qǐng)使用這些值。在

軟件組件的新版本中,常常在以前不使用枚舉值的地方使用了枚舉。當(dāng)可以使用枚舉值和常量

時(shí),務(wù)必相應(yīng)地修改你的代碼,以便使用它們。

3.3.4引用控件數(shù)組的元素時(shí)請(qǐng)使用常量

有一個(gè)領(lǐng)域,常量確實(shí)大有用武之地,但卻常常不能得到充分的使用,這個(gè)領(lǐng)域就是對(duì)控

件數(shù)組的索引進(jìn)行引用。當(dāng)你創(chuàng)建一個(gè)控件數(shù)組時(shí),結(jié)果你會(huì)得到許多帶有相同名字的控件。

若要引用某個(gè)特定控件,就要使用它的公用名字和它專用的索引號(hào)。對(duì)索引號(hào)進(jìn)行硬編碼時(shí).,

會(huì)創(chuàng)建一個(gè)幻數(shù),它具備前面講過(guò)的所有缺陷。對(duì)索引的引用號(hào)進(jìn)行硬編碼帶來(lái)的問(wèn)題是,如

果你引用了錯(cuò)誤的索引號(hào),你的代碼將很難調(diào)試。由于控件數(shù)組中的控件總是屬于同一類型,

因此,你可以整天在索引中切換,而不太可能生成出錯(cuò)消息,因?yàn)槟銓?duì)某個(gè)控件執(zhí)行的所有操

作也可以對(duì)另一個(gè)控件執(zhí)行。

使用控件數(shù)組時(shí),若要消除出錯(cuò)的可能性,應(yīng)該創(chuàng)建與每個(gè)索引相關(guān)的常量。例如,你有3

個(gè)文本框,分別用于放置家庭電話號(hào)碼、辦公電話號(hào)碼和移動(dòng)電話號(hào)碼。使用個(gè)控件數(shù)組,

因?yàn)槟阌幸恍?biāo)準(zhǔn)代碼,運(yùn)行Validate(驗(yàn)證)事件,以便確保每個(gè)號(hào)碼確實(shí)是有效電話號(hào)碼。

如果對(duì)索引進(jìn)行硬編碼,就必須記住哪個(gè)索引用哪個(gè)類型的電話號(hào)碼。如果你很忙,很容易將

這些電話號(hào)碼搞混。但是,如果你給每個(gè)索引賦予一個(gè)常量,并且總是按常量來(lái)引用該控件,

而從不直接按它的索引來(lái)引用它,那么這將更容易確保號(hào)碼的準(zhǔn)確。

控件數(shù)組可使某些開(kāi)發(fā)條件變得比較容易,并使應(yīng)用程序成為資源不密集的程序。不過(guò),

你為控件數(shù)組創(chuàng)建的元素越多,代碼中就更加可能引用不正確的元素。常量的使用有助于減少

發(fā)生這種情況的可能性。通常,模塊及作用域最適合引用控件數(shù)組元素的常量,但在某些情況

下局部作用域也是適用的。下面這些常量被賦予了前綴txt,表示它們引用文本框控件數(shù)組的索

引。

不正確:

txtPhone(0).Text

txtPhone(1).Text

txtPhone(2).Text

正確:

ConstctxtHomePhone=0

Constc_txtWorkPhone=1

Constc_txtFax=2

txtPhone(c_txtHomePhone).Text

txtPhone(c_txtWorkPhone).Text

txtPhone(ctxtFax).Text

3.3.5將應(yīng)用程序前綴或公司特定的前綴用于枚舉成員

正如將命名約定用于變量是非常重要的那樣,將命名約定用于枚舉成員也同樣重要。不必

用前綴來(lái)表示枚舉成員的類型,因?yàn)樗谐蓡T總是屬于長(zhǎng)整型數(shù)。但是應(yīng)該使用專門的前綴來(lái)

表示它的值來(lái)自應(yīng)用程序或組件。應(yīng)該用一個(gè)指示符作為枚舉成員的前綴,因?yàn)楫?dāng)VisualBasic

遇到一個(gè)枚舉成員名時(shí).,如果其他被引用的類型庫(kù)中包含相同的名字,它就會(huì)搞混。例如,Visual

Basic的所有系統(tǒng)常量都有個(gè)前綴vb。遇到vbFixedSinglc這樣一個(gè)常量時(shí),馬上就知道該常量

屬于VisualBasic的類型庫(kù)。雖然VisualBasic使用2個(gè)字符的前綴,但你應(yīng)該使用3個(gè)或4個(gè)字

符的前綴,不過(guò)不要超過(guò)4個(gè)字符。如果使用2個(gè)字符的前綴,會(huì)發(fā)現(xiàn)很難提供別的應(yīng)用程序或

供應(yīng)商不用的指示符。例如,我的公司名叫TigerpawSoftware。當(dāng)我們說(shuō)明枚舉成員時(shí),使用

的前綴是tps,如下面的枚舉說(shuō)明所示。

PublicEnumtpsPrintDestination

tpsScreen=0

tpsPrinter=1

EndEnum

注意正如我在前面的例子中所做的那樣,也可以給枚舉的名字(以及枚舉成員的名字)加上前

綴。沒(méi)有一個(gè)應(yīng)用程序是孤立的。即使最簡(jiǎn)單的程序也要使用許多外部數(shù)據(jù)庫(kù)。為了證明這一

點(diǎn)、,只需創(chuàng)建一個(gè)新的StandardEXE文件,然后從Project菜單中選擇Reference(引用),以

便查看被引用的所有ActiveX組件。隨著集成式組件的復(fù)雜性的增加,必須更清楚地了解組件之

間發(fā)生沖突的潛在可.能性。為此,要為枚舉成員賦予不可能造成這種沖突的名字。

不正確:

PublicEnumBackTrackltem

Account=0

ServiceOrder=1

Quote=2

Contact=3

PriceBookitem=4

PurchaseOrder=5

EndEnum

正確:

PublicEnumBackTrackltem

tpsAccount=0

tpsServiceOrder=1

tpsQuote=2

tpsContact=3

tpsPriceBookItern=4

tpsPurchaseOrder=5

tpsTask=6

EndEnum

也正確:

PublicEnumtpsBackTrackltem

tpsAccount=0

tpsServiceOrder=1

tpsQuote=2

tpsContact=3

tpsPriceBookltem=4

tpsPurchaseOrder=5

tpsTask=6

EndEnum

3.3.6當(dāng)枚舉值不能使用時(shí),使用常量

為模塊創(chuàng)建自定義枚舉值是非常應(yīng)該鼓勵(lì)的一種編程做法,但是VisualBasic在將它們用

于它自己的所有對(duì)象時(shí)卻沒(méi)有太大的進(jìn)展。例如,設(shè)置窗體的WindowsState屬性時(shí),有3個(gè)值可

使用:0-Normal(正常),1-Minimized(最小化),2-maximized(最大化)。觀察Properties

窗口,就會(huì)了解這個(gè)情況。每個(gè)值(0、1和2)都有一個(gè)與值相關(guān)的名字。這些名字很像枚舉

的各個(gè)成員,至少在Properties窗口中是這樣。

雖然VisualBasic應(yīng)該將真實(shí)的枚舉值用于這些屬性,但是大多數(shù)情況下卻并非如此。

VisualBasic并不擁有它的大多數(shù)對(duì)象使用的已經(jīng)定義的枚舉值,不過(guò)它支持各個(gè)值使用的系

統(tǒng)常量。系統(tǒng)常量是一些全局常量,它們是VisualBasic類型庫(kù)的組成部分。不必對(duì)它們進(jìn)行

定義,或者引用一個(gè)類型庫(kù),以便使用它們,因?yàn)樗鼈冸S時(shí)可供使用。但是,由于系統(tǒng)常量并

不出現(xiàn)在代碼幫助程序的下拉列表中,就像枚舉中一樣,因此許多編程人員不知道這些常量的

存在。每當(dāng)必須鍵入一個(gè)數(shù)值,作為VisualBasic函數(shù)的參數(shù),或者作為標(biāo)準(zhǔn)VisualBasic對(duì)

象屬性的值時(shí),很可能存在相關(guān)的系統(tǒng)常量。若要確定某個(gè)屬性是否存在系統(tǒng)常量,請(qǐng)鍵入屬

性名(如WindowsState),將光標(biāo)置于屬性文本中的任何位置,再按F1鍵。為屬性顯示的幫助

信息通常包括可供使用的所有常量的列表,注意許多參數(shù),如MsgBox語(yǔ)句的Buttons參數(shù),都有

相關(guān)的系統(tǒng)常量。若要使用系統(tǒng)常量,只需輸入該常量,就像引用個(gè)已定義的常量一樣。例

如,若要將窗體變成最大化,可以使用下面這個(gè)語(yǔ)句:

Me.WindowState=vbMaximized

若要了解鍵入的系統(tǒng)常量是否正確,方法之一是全部用小寫(xiě)字母鍵入該常量。如果該常量有效,

VisualBasic就會(huì)將它轉(zhuǎn)換成正確的大小寫(xiě)字母。如果該常量仍然保持全部為小寫(xiě)字母,就表

示鍵入的名字不正確,必須進(jìn)行糾正。與枚舉值不同的是,系統(tǒng)常量可用于代碼中的任何地方,

不只是用于定義為枚舉類型的變量。因此,必須小心不要使用不正確的常量。因?yàn)閂isualBasic

無(wú)法發(fā)現(xiàn)這種類型的錯(cuò)誤。只要能消除幻數(shù),進(jìn)行的任何操作都是好的。如果枚舉可以用于一

個(gè)過(guò)程,請(qǐng)使用枚舉。如果不能使用,請(qǐng)查看一下是否定義了系統(tǒng)常量。如果沒(méi)有定義,則可

考慮創(chuàng)建自己的常量,取代幻數(shù)。

不正確:

WithMe

.BorderStyle=1

.WindowState=0

.ScaleMode=3

.DrawMode=13

EndWith

正確:

WithMe

.BorderStyle=vbFixedSingle

.WindowState=vbNormal

.ScaleMode=vbPixels

.DrawMode=vbCopyPen

EndWith

3.3.7當(dāng)參數(shù)接受有限數(shù)量的值時(shí),請(qǐng)使用枚舉

盡管編程員真的相信枚舉的作用,有時(shí)也會(huì)錯(cuò)過(guò)使用枚舉的機(jī)會(huì)。編寫(xiě)代碼時(shí),并不總是

想到要?jiǎng)?chuàng)建枚舉,因?yàn)樵谀承┣闆r下使用枚舉給人一種殺雞用牛刀的感覺(jué)。一般來(lái)說(shuō),每當(dāng)一

個(gè)過(guò)程接受有限數(shù)量的一組值時(shí),請(qǐng)使用枚舉。例如,如果有一個(gè)過(guò)程,里面的參數(shù)只能使用

兩個(gè)值中的一個(gè),那么這個(gè)參數(shù)就非常適合使用枚舉。

為兩個(gè)值創(chuàng)建一個(gè)枚舉似乎是多余的,但實(shí)際上并非如此。你仍然會(huì)得到避免幻數(shù)的好處,

比如減少數(shù)據(jù)輸入量,提高可理解度。另外,如果決定將來(lái)增加枚舉的成員,那么枚舉能使你

更容易進(jìn)行這項(xiàng)操作。無(wú)論枚舉成員的值是字符串還是數(shù)字,都沒(méi)有關(guān)系,兩種情況下你都能

得到好處。

不正確:

PublicSubShowAVIFile(1ngTypeAsLong)

正確:

PublicEnumtpsAVIFile

tpsFileCopy=0

tpsFileDelete=1

tpsFileDeleteToRecycle=2

tpsFileNuke=3

tpsFindComputer=4

tpsFindFile=5

tpsFileMove=6

tpsSearch=7

EndEnum

PublicSubShowAVIFile(IngTypeAstpsAVIFile)

3.3.8驗(yàn)證作為枚舉類型傳遞的值

對(duì)于傳遞給說(shuō)明為枚舉類型的參數(shù)的值,必須進(jìn)行驗(yàn)證,以確保它是可以接受的值。當(dāng)一

個(gè)參數(shù)被說(shuō)明為枚舉類型時(shí),它實(shí)際上是個(gè)長(zhǎng)整型數(shù),帶有一個(gè)美觀的代碼幫助程序下拉列表。

雖然其他編程人員應(yīng)該使用有名枚舉成員,但是他們可以隨意將任何有效的長(zhǎng)整型數(shù)傳遞給該

參數(shù)。不過(guò),VisualBasic沒(méi)有能力自動(dòng)要求參數(shù)是枚舉的有效成員。

有兩種方法可以用來(lái)驗(yàn)證數(shù)據(jù):

☆如果這些值位于一個(gè)范圍(比如1?10)內(nèi),請(qǐng)使用If...EndIf結(jié)構(gòu)來(lái)驗(yàn)證數(shù)據(jù)。

☆如果這些值組成了??個(gè)離散的組,它不屬于一個(gè)范圍之中,那么請(qǐng)使用SelectCase結(jié)構(gòu)。

一般來(lái)說(shuō),除非驗(yàn)證的值是在一個(gè)相應(yīng)的范圍之中,否則,就應(yīng)該使用SelectCase結(jié)構(gòu),而不

是"...EndIf結(jié)構(gòu)。如果需要在以后將更多的值添加給枚舉,那么SelectCase結(jié)構(gòu)能使你具

有更大的靈活性。注意使用SelectCase結(jié)構(gòu)時(shí),始終要加上一個(gè)Else子句,以便處理傳遞給過(guò)

程的有效值。

實(shí)際應(yīng)用舉例

進(jìn)行假設(shè)是代碼中出錯(cuò)的主要原因之-oVisualBasic無(wú)法保證傳遞給枚舉類型的值對(duì)應(yīng)

于枚舉中的指定成員。決不要假設(shè)你擁有很好的數(shù)據(jù)。

(1)始終應(yīng)該通過(guò)與有名成員而不是與幻數(shù)進(jìn)行比較來(lái)驗(yàn)證數(shù)據(jù)。不要使用幻數(shù)進(jìn)行數(shù)據(jù)驗(yàn)證,

就像在代碼的其他位置也不使用幻數(shù)一樣。

(2)使用SelectCase來(lái)驗(yàn)證一個(gè)值是一組離散值的一個(gè)有效成員。不要忘記加上CaseElse子

句,以便處理無(wú)效數(shù)據(jù)。

第4章變量

正確地說(shuō)明變量并且使用始終一致的變量命名規(guī)則的目的如下:

?使每個(gè)變量的作用一目了然

?使每個(gè)變量的數(shù)據(jù)類型和作用域一目了然

?使代碼中的各個(gè)進(jìn)程更容易理解

?使代碼的調(diào)試更加容易

?使變量的存儲(chǔ)和處理更加有效

程序的運(yùn)行常常涉及到對(duì)變量進(jìn)行操作。大多數(shù)過(guò)程至少包含一個(gè)變量,而有些過(guò)程則包

含幾十個(gè)變量。由于變量的使用是如此廣泛,因此它們常常被視為是理所當(dāng)然的東西。在第2

章中,我講過(guò)使用匈牙利前綴來(lái)表示變量的數(shù)據(jù)類型。雖然使用這些前綴應(yīng)該是強(qiáng)制性的,但

是這僅僅是正確處理變量的開(kāi)始。定義完善的變量具有明確規(guī)定的數(shù)據(jù)類型和作用域。此外,

若要正確使用變量,必須使用表義性強(qiáng)的變量名來(lái)說(shuō)明這些變量,并且必須為它們賦予焦點(diǎn)。

4.1編程原則

4.1.1定義有焦點(diǎn)的變量

創(chuàng)建和使后上量時(shí),應(yīng)該設(shè)法使每個(gè)變量服務(wù)于一個(gè)定義明確的目的。人們希望變量能夠

服務(wù)于雙重目的,但是它帶來(lái)的節(jié)省少量?jī)?nèi)存的好處往往被代碼的復(fù)雜性所抵消。用于多個(gè)目

的的變量稱為無(wú)焦點(diǎn)的變量。如果需要對(duì)變量執(zhí)行不相關(guān)的操作或計(jì)算,最好使用兩個(gè)有焦點(diǎn)

的變量,而不使用單個(gè)無(wú)焦點(diǎn)變量。閱讀和調(diào)試包含無(wú)焦點(diǎn)變量的代碼是非常困難的,這種代

碼本身更可能包含一些錯(cuò)誤。

4.1.2為變量賦予表義性強(qiáng)的名字

為變量選擇什么樣的名字,這是非常重要的。即使你的代碼永遠(yuǎn)不被其他人查看,也應(yīng)該

將它編寫(xiě)成可供幾十個(gè)其他編程人員查看的樣子。注意如果你創(chuàng)建的變量有著嚴(yán)格定義的目的,

那么為這樣的變量命名就比較容易命名。

為變量賦予合乎邏輯的名字,這是最容易辦的事情,這樣就會(huì)使你的代碼更容易理解。類

似x、y和j這樣的變量,在現(xiàn)代軟件開(kāi)發(fā)中兒乎沒(méi)有立足之地。它們也許非常適用于循環(huán)計(jì)數(shù)器

(雖然更好的變量名幾乎總是可以得到的),但是它們決不應(yīng)該用于存放重要的數(shù)據(jù)。

實(shí)際應(yīng)用舉例

避免給變量命名為Temp。有一個(gè)變量名是應(yīng)該避免使用的,這就是Temp。可以很容易創(chuàng)建

rstTemp、intTemp和strTemp之類的變量,但是所有局部變量的性質(zhì)都是臨時(shí)性的,因此給局部

變量命名為Temp變量是多此一舉。一般來(lái)說(shuō),當(dāng)編程人員說(shuō)“臨時(shí)變量”時(shí),他指的是“暫時(shí)

性變量”,你兒乎隨時(shí)能找到Temp的替代詞語(yǔ)。例如,使用Instr()函數(shù)來(lái)確定一個(gè)字符串中

某個(gè)串的位置時(shí),就可以使用下面這樣的語(yǔ)句:

intTemp=InStr(strBeginTime,"A")

另一種比較好的方法是給變量賦予下面這樣的表義性名字:

intCharacterLocation=InStr(strBeginTimo,"A")

4.1.3在變量名中混合使用大小寫(xiě)字母

全部使用大寫(xiě)字母的名字比大小寫(xiě)字母混用的名字更難閱讀。過(guò)去,有些編程語(yǔ)言要求變

量名一律使用大寫(xiě)字母。VisualBasic沒(méi)有這個(gè)規(guī)定,因此所有變量名均可大小寫(xiě)字母混用。

全部使用小寫(xiě)字母與全部使用大寫(xiě)字母一樣不可取。例如,EmployeeAge比EMPLOYEEAGE或

EMPLOYEEAGE要好得多。如果愿意,你可以使用下劃線來(lái)代替空格(例如Employee_Age)。但是

如果使用下劃線來(lái)代替空格,那么整個(gè)代碼中都應(yīng)該統(tǒng)一這樣做。

不正確:

DimstrFIRSTNAMEAsString

DimstrlastnameAsString

正確:

DimstrFirstNameAsString

DimstrLastNameAsString

也正確:

DimstrFirst_NameAsString

DimstrLast_NameAsString

4.1.4只對(duì)常用變量名和長(zhǎng)變量名進(jìn)行縮寫(xiě)

雖然?般情況下應(yīng)該避免對(duì)變量名進(jìn)行縮寫(xiě),但是有時(shí)對(duì)變量名的單詞或詞語(yǔ)進(jìn)行壓縮是

必要的。你創(chuàng)建的最長(zhǎng)變量名不要超過(guò)32個(gè)字符。在有些顯示屏上更長(zhǎng)的變量名很難閱讀。需

要對(duì)變量名進(jìn)行縮寫(xiě)時(shí),?定要注意整個(gè)代碼中縮寫(xiě)規(guī)則的?致性。例如,如果在代碼的某些

區(qū)域中使用Cnt,而在另一些區(qū)域中又使用Count,就會(huì)給代碼增加不必要的復(fù)雜性。有一種情

況,你可能想對(duì)變量名進(jìn)行縮寫(xiě),這就是當(dāng)你使用一組相關(guān)的變量,比如下面這些與員工相關(guān)

的變量時(shí),就可以使用縮寫(xiě):

DimstrEmployeeNameAsString

DimstrEmployeeAddresslAsString

DimstrEmployeeAddress2AsString

DimstrEmployeeCityAsString

DimstrEmployeeStateAsString

DimstrEmployeeZipcodeAsString

這里的縮寫(xiě)變得更加引人注目。如果對(duì)變量進(jìn)行縮寫(xiě),應(yīng)該做到前后統(tǒng)一。例如,不要使用

EmpAddres

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論