




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 條石銷售合同二零二五年
- 與人合作臨時(shí)合同樣本
- 個(gè)人借款銀行合同范例
- 公司與農(nóng)戶土雞合同樣本
- 某污水處理廠附屬管網(wǎng)工程監(jiān)理實(shí)施細(xì)則
- 教學(xué)總監(jiān)崗位職責(zé)
- 2025年汽車覆蓋件模具項(xiàng)目發(fā)展計(jì)劃
- 紅旗品牌策劃方案
- 會(huì)計(jì)聘用合同樣本百度文庫(kù)
- 店鋪門面轉(zhuǎn)讓合同
- 雷鋒叔叔你在哪里教學(xué)反思
- 軟件詳細(xì)設(shè)計(jì)說(shuō)明書(shū)(例)
- 鋼拱橋?qū)m?xiàng)吊裝方案終稿
- 24式太極拳教案(1~4課)
- 哈薩克斯坦鐵路車站代碼
- 產(chǎn)業(yè)經(jīng)濟(jì)學(xué)的課后復(fù)習(xí)答案
- 中國(guó)綠色經(jīng)濟(jì)發(fā)展之路(PPT-37張)課件
- 客房控制系統(tǒng)——RCU系統(tǒng)培訓(xùn)PPT通用通用課件
- 履帶式液壓挖掘機(jī)挖掘機(jī)構(gòu)設(shè)計(jì)
- 川崎病診治指南最新ppt課件
- (會(huì)議紀(jì)要(2011)第29期)河南煤業(yè)化工集團(tuán)有限責(zé)任公司會(huì)議紀(jì)要
評(píng)論
0/150
提交評(píng)論