Net開發(fā)規(guī)范資料_第1頁
Net開發(fā)規(guī)范資料_第2頁
Net開發(fā)規(guī)范資料_第3頁
Net開發(fā)規(guī)范資料_第4頁
Net開發(fā)規(guī)范資料_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

,net開發(fā)標(biāo)準(zhǔn)

目錄

1.概述3

2.命名標(biāo)準(zhǔn)3

2.1指導(dǎo)性原那么3

2.1.1使用正確的大小寫風(fēng)格3

2.1.2使用描述性英文名稱3

2.1.3使用易讀的名稱4

2.1.4盡量防止在名稱中使用編碼4

2.1.5同義詞中使用固定的單詞4

2.1.6保持詞義的前后一致4

2.1.7名詞和動(dòng)詞的選用5

2」.8使用計(jì)算機(jī)專業(yè)術(shù)語5

2.1.9必要時(shí)可使用業(yè)務(wù)術(shù)語5

2.1.10防止誤導(dǎo)5

2.1.11名詞需要語境說明5

2.1.12不要添加人為的語境6

2.1.13防止名稱差異不明顯造成混淆6

2.2大寫風(fēng)格6

2.2.1Pascal風(fēng)格6

2.2.2Camel風(fēng)格7

2.2.3大寫風(fēng)格7

224大寫小結(jié)7

2.3單詞選擇7

2.3.1縮寫8

2.4命名空間9

2.5類和類成員10

2.5.1類的命名指南10

2.5.2Attribute命名指南10

2.5.3枚舉命名指南10

2.5.4靜態(tài)類屬性名11

2.5.5參數(shù)名11

2.5.6方法命名指南11

257屬性命名指南11

2.5.8事件命名指南12

2.6大小寫敏感12

3.程序注釋標(biāo)準(zhǔn)13

3.1注釋編寫準(zhǔn)那么13

3.2模塊注釋13

3.3類的注釋14

3.4類成員方法的注釋15

3.5類成員屬性、常量、變量的注釋16

3.6程序注釋16

4.代碼書寫標(biāo)準(zhǔn)17

4.1排版標(biāo)準(zhǔn)17

5.類成員使用標(biāo)準(zhǔn)20

5.1屬性使用指南20

5.1.1只讀和只寫的屬性22

5.2事件使用指南22

5.3方法使用指南23

5.3.1方法重載指南23

5.4構(gòu)建函數(shù)使用指南24

5.5類的成員變量使用指南24

5.6參數(shù)名稱指南25

6.類型使用指南26

6.1類使用指南26

6.1.1基類使用指南26

6.2值類型使用指南27

6.2.1構(gòu)造使用指南27

6.2.2枚舉使用指南27

6.3程序代理使用指南28

6.4程序?qū)傩?ATTRIBUTE)的使用29

7.異常的產(chǎn)生和處理29

7.1標(biāo)準(zhǔn)異常類型31

7.2異常的包裝WRAPPINGEXCEPTIONS32

8.數(shù)組使用指南32

8.1數(shù)組vs.集合32

8.1.1集合33

8.1.2集合中可索引的屬性33

8.1.3數(shù)組值屬性33

8.2返回空數(shù)組33

9.數(shù)據(jù)庫設(shè)計(jì)開發(fā)標(biāo)準(zhǔn)錯(cuò)誤!未定義書簽。

9.1命名標(biāo)準(zhǔn)錯(cuò)誤!未定義書簽。

9.2字段設(shè)計(jì)要求錯(cuò)誤!未定義書簽。

9.3視圖使用原那么錯(cuò)誤!未定義書簽。

9.4存儲(chǔ)過程建立規(guī)那么錯(cuò)誤!未定義書簽。

9.5函數(shù)建立規(guī)那么錯(cuò)誤!未定義書簽。

9.6觸發(fā)器使用要求錯(cuò)誤!未定義書簽。

1概述

在建立過程中,將涉及到在新的VisualStudio.NET以及.NETFramework平臺上的開

發(fā)工作。同時(shí),設(shè)計(jì)人員、開發(fā)人員和測試人員較多。為了使應(yīng)用程序的構(gòu)造和編碼風(fēng)格標(biāo)

準(zhǔn)化,便于閱讀和理解編碼,以提高開發(fā)效率和產(chǎn)品的標(biāo)準(zhǔn)化,制訂一套開發(fā)標(biāo)準(zhǔn)和標(biāo)準(zhǔn)勢

在必行。此外,好的編碼約定可使源代碼嚴(yán)謹(jǐn)、可讀性強(qiáng)且意義清楚,與其它語言約定相一

致,并且盡可能的直觀。希望開發(fā)人員嚴(yán)格遵守此套開發(fā)標(biāo)準(zhǔn)和標(biāo)準(zhǔn),并落實(shí)到自己的程序

中。

一組通用目的的編碼約定應(yīng)該定義完成上述目的所必需的、能讓程序員自由地創(chuàng)立程序

邏輯和功能流程的最小的要求。最小編碼約定的目的是使程序易于閱讀和理解,從而指導(dǎo)程

序員更好地完成開發(fā)任務(wù)。

本標(biāo)準(zhǔn)主要針對使用VisualStudio.NET以及.NETFramework開發(fā)的基于Web的應(yīng)用

系統(tǒng)。

2命名標(biāo)準(zhǔn)

2.1指導(dǎo)性原那么

命名是編程的核心。能夠?qū)ψ兞亢秃瘮?shù)/過程進(jìn)展表意清晰而準(zhǔn)確的命名,就能使程序

的可讀性大大提高,到達(dá)不說自明的效果。真正的名稱是深入認(rèn)真思考一個(gè)對象的生態(tài)環(huán)境

后才能給出的。程序設(shè)計(jì)人員只有在充分理解并把握整個(gè)系統(tǒng)時(shí),才可能給出真正適宜的名

字。如果名稱選用恰當(dāng),一切就顯得很自然,各局部關(guān)系清晰,意義可以推導(dǎo)而出,閱讀程

序時(shí)可以按常識推理,從而減小程序員對已有程序的閱讀和理解困難,提高工作效率,使新

程序員能在盡量短的時(shí)間內(nèi)進(jìn)入角色。

以下章節(jié)描述了程序命名的一些指導(dǎo)性原那么。

2.1.1使用正確的大小寫風(fēng)格

為保證良好的程序可讀性,對命名的大小寫必須按照一致的規(guī)定編寫,主要包括Pascal

風(fēng)格和Camel風(fēng)格兩種,下面將會(huì)有專門的章節(jié)進(jìn)展詳細(xì)說明。

2.1.2使用描述性英文名稱

為保證程序的可讀性,要采用準(zhǔn)確描述其意義的名字。英語是國際通用語言,絕大多數(shù)

商業(yè)類庫或函數(shù)庫代碼都是由英語編寫的。要與標(biāo)準(zhǔn)接軌,充分利用網(wǎng)上的程序資源,應(yīng)盡

量使用英語命名。

2.1.3使用易讀的名稱

如果不可讀或不易讀,那么不便于討論和交流。因此我們要盡量使用群眾化名稱,防止

使用不常用的單詞。

2.1.4盡量防止在名稱中使用編碼

對名稱使用編碼就需解碼才能理解。少數(shù)幾個(gè)前綴字母有助于區(qū)分名稱類別。但為了追

求風(fēng)格而過分使用前綴和后綴就會(huì)造成生澀難懂的名字。例如SRD2T3。含有編碼的名稱一

般都沒有可讀性。當(dāng)然,任何編碼,只要科學(xué),時(shí)間久了都能被掌握。但是,掌握編碼需要

新成員的額外精力,增加了適應(yīng)難度,因此應(yīng)盡量防止。

2.1.5同義詞中使用固定的單詞

首先,我們應(yīng)盡量使用英語詞匯,因?yàn)闈h語拼音實(shí)際上也是一種名稱編碼,特別是使用

拼音首字母,即使是懂漢語拼音的人也未必能理解。有了用英語命名的前提,我們還應(yīng)該注

意:一個(gè)抽象概念可能有多個(gè)表述同義詞,選擇一個(gè),始終如一。如對同一動(dòng)作,在不同類

中選用不同的名稱,比方,fetch,retrieve和get,那么,使用你的類從事編程的人就要多費(fèi)

很多精力去理解它們。也就是說,我們應(yīng)該通過使用一致的名稱,創(chuàng)立統(tǒng)一的編程接口,簡

化學(xué)習(xí)的難度。

2.1.6保持詞義的前后一致

多數(shù)詞都有不止一個(gè)意思,但在同一個(gè)系統(tǒng)中,應(yīng)始終保持同一個(gè)意思。這和前面的原

那么是相對應(yīng)的。使用不同的詞匯,使人聯(lián)想不同的接口和/或操作。同樣,使用同樣的詞

匯,使人聯(lián)想一樣的接口和/或操作。如果我學(xué)過使用DeviceManager::add(),我就會(huì)期望可

以使用ProtocolManager::add().這是根據(jù)名稱產(chǎn)生的聯(lián)想,甚至連想到可以使用

*Manager::add()o要保證這種聯(lián)想能成立,前后詞義必須一致。如果自己設(shè)■一■個(gè)系統(tǒng),要

盡量做到保持詞義的一致。記住,在兩個(gè)完全不同的范疇內(nèi)使用一樣的名字是很不可取的。

2.1.7名詞和動(dòng)詞的選用

類和對象應(yīng)當(dāng)使用名詞或名詞短語命名。方法中強(qiáng)調(diào)過程用動(dòng)詞,返回值用名詞。作為

一名設(shè)計(jì)人員,可能不太在意這些命名的瑣事。嘗試使用你設(shè)計(jì)的類去編寫一段用戶程序,

看看有多少別扭或混亂的地方,一定可以反過來有助你改良設(shè)計(jì)。

2.1.8使用計(jì)算機(jī)專業(yè)術(shù)語

盡量使用約定成俗的慣用語、計(jì)算機(jī)科學(xué)術(shù)語、算法名稱、設(shè)計(jì)模式名稱、數(shù)學(xué)名詞等

軟件編程相關(guān)名詞。這樣似乎有點(diǎn)異端,但這總好過讓程序員費(fèi)力找客戶弄清楚自己原本清

楚的概念,只是由于名稱的不同使他們疑惑。我們是講編碼標(biāo)準(zhǔn),程序員大多數(shù)是計(jì)算機(jī)專

業(yè)的,或?qū)τ?jì)算機(jī)專業(yè)已有了深入了解的。很少最終用戶會(huì)閱讀程序,即使有,也是有相當(dāng)

計(jì)算機(jī)軟件功底的。相反,程序維護(hù)人員必須閱讀程序,所以應(yīng)盡可能使用計(jì)算機(jī)術(shù)語。如:

運(yùn)用工廠模式類的命名應(yīng)該是“名詞+Factory〃。

2.1.9必要時(shí)可使用業(yè)務(wù)術(shù)語

如果工作的重點(diǎn)不在程序本身,或問題的描述比問題的解決更重要,可使用業(yè)務(wù)術(shù)語。

在分析階段,使用業(yè)務(wù)術(shù)語比使用計(jì)算機(jī)術(shù)語更好,因?yàn)槿菀妆豢蛻衾斫夂统惺堋?/p>

2.1.10防止誤導(dǎo)

防止使用已有其它明確意義的名詞。例如,"hp","aix",和"sco”被用作UNIX平臺及

其變種的名稱,如果再用來作為變量或函數(shù)名稱就很有問題,會(huì)引起誤解。即使你在解決的

問題用"hp"是很好的縮寫也不應(yīng)使用“hp”。

2.1.11名詞需要語境說明

只有少數(shù)情況下,孤立的一個(gè)名字有明確含義。多數(shù)情況下,名稱需要置于一定的語境

中才有意義。比方,在類中,函數(shù)中或注釋中。換句話說,在面向?qū)ο蟮恼Z言中,在類屬性

的名稱中包含類名是多余的。例如,不應(yīng)該使用Book.BookTitle,而應(yīng)該使用Book.Titleo

Company.address_和Customer.address」同樣都是address,但僅在語境中才有意義,以

下的命名是不可取的:Company.companyAddress_,Customer.customerAddress_o

2.1.12不要添加人為的語境

不要在類的前面冠以公司名縮寫、工程名稱縮寫或其他標(biāo)志性前綴。例如,在做知識管

理系統(tǒng)時(shí),把員工類命名成KmsUser。以上命名法是不可取的,這樣勢必造成代碼重復(fù),影

響代碼的重用。如使用同一個(gè)類,那么KmsUser在其他系統(tǒng)中就顯得不和諧了。

2.1.13防止名稱差異不明顯造成混淆

這個(gè)問題源于編寫程序僅僅是為了能編譯通過或能解譯執(zhí)行o編譯和解譯程序不允許在

同一域內(nèi)用一樣的名字指稱兩個(gè)東西。所以,遇到編譯問題時(shí),就隨便將其中的一個(gè)改變一

下。更糟糕的是,原本同一個(gè)名稱,因拼寫錯(cuò)誤變成兩個(gè)名稱。這里要說的關(guān)鍵問題是,如

果要區(qū)分兩樣不同的東西,一定要保證名稱有實(shí)質(zhì)性的差異。例如,假設(shè)將一個(gè)類命名成

Product,另一個(gè)類命名成ProductInfo或ProductData,就會(huì)因差異不明顯造成混淆。因?yàn)镮nfo

和Data沒有具體的意思。同理,不要在00編程中使用Class或Object作為名稱的一局部。

CustomerObject和Customer有什么區(qū)別?NameString比Name好嗎?難道一個(gè)Name還

會(huì)是浮點(diǎn)數(shù)或整數(shù)不成?特別要強(qiáng)調(diào)的是,對于大小寫敏感的編程環(huán)境,我們不要使用僅有

大小寫區(qū)別的名字。例如,Customer,customer不應(yīng)作為兩個(gè)名字。

2.2大寫風(fēng)格

以下章節(jié)描述了不同方式的大寫方式.這些術(shù)語將在通篇文檔中被經(jīng)常引用.

2.2.1Pascal風(fēng)格

這種風(fēng)格大寫每個(gè)單詞的首字母

BackColor

應(yīng)在所有由多單詞組成的公共描述符中使用這種方式.舉例而言,使用TextColor就比

Textcolor或Textcolor更好.

注意不要大寫“連接詞"(一個(gè)單詞中包含了幾個(gè)單詞,但這個(gè)單詞本身有自己的意

思,如Checkbook)每個(gè)組合單詞的首字母。應(yīng)該將這個(gè)單詞作為一個(gè)單詞來考慮,而非幾

個(gè)單詞的組合。使用詞典決定一個(gè)組合詞是不是應(yīng)該作為一個(gè)單詞來使用。

2.2.2Camel風(fēng)格

這種風(fēng)格除了第一個(gè)單詞的首字母,其他單詞都應(yīng)大寫首字母,如下所示

backColor

在局部變量參數(shù)名或私有類屬性名稱上使用camel風(fēng)格。

2.2.3大寫風(fēng)格

只在少于兩個(gè)字母的縮寫中使用大寫。三個(gè)以上字母的縮寫都應(yīng)該使用PASCAL風(fēng)格。舉

例而言

System.IO

System.Web.UI

System.CodeDom

一個(gè)另外的情形是和原有的未管理的標(biāo)志兼容,而原來常用大寫來表示枚舉和常量。通常這

些標(biāo)志符不應(yīng)該暴露給外部。

2.2.4大寫小結(jié)

下表描述了不同類型的描述符該怎么使用大小寫

類型風(fēng)格備注

ClassPascal風(fēng)格

EnumerationvaluePascal風(fēng)格

EnumerationtypePascal風(fēng)格

EventPascal風(fēng)格

ExceptionclassPascal風(fēng)格用后綴Exception.

Read-onlystaticfieldPascal風(fēng)格

InterfacePascal風(fēng)格用前綴I.

MethodPascal風(fēng)格

NamespacePascal風(fēng)格

PropertyPascal風(fēng)格

PublicinstancefieldPascal風(fēng)格很少使用,更多使用properties.

Protectedinstancefieldcamel風(fēng)格很少使用,更多使用properties.

Parametercamel風(fēng)格

2.3單詞選擇

不要使用常用的命名空間的名字做類名,舉例而言不要使用以下任何單詞做類名

System

Collections

Forms

UI

不要使用和以下關(guān)鍵字沖突的識別符,舉例而言,防止這樣使用:

AddHandlerAddressOfAliasAndAnsi

AsAssemblyAutoBaseBoolean

ByRefByteByVaiCallCase

CatchCBoolCByteCCharCDate

CDecCDblCharCIntClass

CLngCObjConstCShortCSng

CStrCTypeDateDecimalDeclare

DefaultDelegateDimDoDouble

EachElseElselfEndEnum

EraseErrorEventExitExternalSource

FalseFinalizeFinallyFloat

ForFriendFunctionGetGetType

GotoHandlesIfImplementsImports

InInheritsIntegerInterfaceIs

LetLibLikeLongLoop

MeModModuleMustlnheritMustOverride

MyBaseMyClassNamespaceNewNext

NotNothingNotlnheritableNotOverridableObject

OnOptionOptionalOrOverloads

OverridableOverridesParamArrayPreservePrivate

PropertyProtectedPublicRaiseEventReadonly

ReDimRegionREMRemoveHandlerResume

ReturnSelectSetShadowsShared

ShortSingleStaticStepStop

StringStructureSubSyncLockThen

ThrowToTrueTryTypeOf

UnicodeUntilvolatileWhenWhile

WithWithEventsWriteOnlyXoreval

extendsinstanceofpackagevar

2.3.1縮寫

1、請不要砍掉或抽取識別符的局部來作為名稱使用。如使用GetWindow比GetWin更好.

2、請不要使用使用不被廣泛認(rèn)可的縮寫。

3、只有絕對需要時(shí)再使用廣為人知的縮寫??梢允褂肬I來表示UserInterface,用OLAP

來表示OnTineAnalyticalProcessing.

4、當(dāng)使用縮寫時(shí),請使用Pascal風(fēng)格或camel風(fēng)格來表示超過兩個(gè)或以上單詞縮寫的構(gòu)成。

如用HtmlButton而非HTMLButton,但不要用System.Io來取代System.10

2.4命名空間

以下模板舉例說明了命名空間的命名規(guī)那么。

<Company>.<Technology>[.<Feature>][.Design]

因此我們希望看到這樣如下命名空間:

Microsoft.Media

Microsoft.Media.Design

PowerSoft.PowerBuilder.Math

1、防止兩個(gè)PUBLISED的NAMESPACES名稱一樣的可能。使用公司名稱或者一個(gè)正式分支的

名稱如用Microsoft.Office來表示Microsoft提供的OfficeAutomationClasseso

2、使用一個(gè)穩(wěn)定的被廣泛認(rèn)可的技術(shù)名稱作為第二層名稱

3、不要使用組織的構(gòu)造層次作為命名空間的層次依據(jù)

4、請?jiān)贒ESIGN-TIME命名空間前加上.Design前綴以表示根底命名空間DESIGN-TIME特

性。如System.Windows.Forms.Design包含了用來設(shè)計(jì)System.Windows.Forms應(yīng)用

程序的的設(shè)計(jì)器和相關(guān)設(shè)計(jì)類。

5、使用PASCAL風(fēng)格,把每個(gè)邏輯部件用分隔號分開(如Microsoft.Office.PowerPoint_)

如果你的品牌采用了非傳統(tǒng)方式的命名,那么就延續(xù)的你的品牌的命名方式,就算他和通常

的命名空間法那么不同。如(NeXT.WebObjects,andee.cummings)

6、在適當(dāng)?shù)牡胤绞褂脧?fù)數(shù)命名。例如采用System.Collections而非System.Collection。

對此例外的是品牌名和縮寫。如用System.10而非System.10s。

7、不要讓命名空間和類都使用同樣的名字。如,當(dāng)有個(gè)類叫Debug時(shí)就不要使用Debug

來作為命名空間的名字。

命名空間構(gòu)造不需和配件名稱構(gòu)造并行。如,當(dāng)你決定使用給配件取名叫

MyCompany.MyTechnology.dll時(shí),這并不需要你得讓配件中包含一個(gè)叫

MyCompany.MyTechnology的命名空間。

2.5類和類成員

2.5.1類的命名指南

1、使用名詞或名詞短語命名類。

2、使用Pascal風(fēng)格

3、慎重使用縮寫命名類。

4、不要使用任何類前綴(如C)

5、不要使用強(qiáng)調(diào)符號。

6、偶爾可能會(huì)出現(xiàn)已I作為類名開頭的情況,而這個(gè)類又不是一個(gè)接口類。這種情況下只

要第二個(gè)字母是小寫就可以承受。如IdentityStore.

7、建議使用組合詞來命名派生類。在此情況下,你應(yīng)該考慮使用基類名稱作為派生類名稱

的結(jié)尾。舉例而言,在英語中的〃CoffeeCup”是說的一種杯子,而不是一種咖啡。又如

ApplicationException表示一種例外,而BooleanSwicth表示一種

Switch,SerializableAtrribute是一種屬性。但對此應(yīng)該合理的判斷,如Button是一種

Control雖然Control并沒有出現(xiàn)在名字中。

以下是一些正確的命名的例子

publicclassFileStream{

}

publicclassButton{

}

publicclassString{

}

2.5.2Attribute命名指南

在自定義屬性類的后邊應(yīng)該加上Attribute作為后綴。

publicclassObsoleteAttribute:Attribute{

2.5.3枚舉命名指南

1、使用Pascal風(fēng)格來命名枚舉類型.

2、使用Pascal風(fēng)格命名枚舉值.

3、不要使用簡寫來命名枚舉值.

?不要在枚舉前加前綴(如adXXX來命名ADOenums,rtfXXX來命名richtext

enums,等.).

?不要使用在枚舉上加后綴

?使用單數(shù)來命名枚舉,除非它是一個(gè)BIT類屬性.

?使用復(fù)數(shù)來命名BIT類屬性。

2.5.4靜態(tài)類屬性名

1、使用名詞,名詞短語或簡寫來命名靜態(tài)類屬性

2、使用PASCAL風(fēng)格來命名靜態(tài)類屬性

不要使用匈牙利命名法來命名靜態(tài)類屬性名稱

2.5.5參數(shù)名

使用有意義的參數(shù)名.在所有場合,參數(shù)名稱和類型應(yīng)該清楚地描述以決定其反映的意義..

使用camel風(fēng)格來命名參數(shù)

使用名稱來表現(xiàn)其作用而非表現(xiàn)其類型.我們期望開發(fā)工具能提供有效的方式來提供類型信息.因

此參數(shù)名可被更好的用來表現(xiàn)其作用而非類型.偶爾使用基于類型的參數(shù)名是完全適當(dāng)?shù)?

不要使用reserved參數(shù)。在下個(gè)版本中需要更多的數(shù)據(jù)那么就使用重載。.

請不要使用匈牙利命名法來在名稱前加前綴

TypeGetType(stringtypeName)

stringFormat(stringformat,object[]args)

2.5.6方法命名指南

使用動(dòng)詞或動(dòng)詞短語來命名方法。

使用Pascal風(fēng)格來命名方法.如

RemoveAll()

GetCharArrayO

Invoke()

2.5.7屬性命名指南

使用名詞或名詞短語來命名屬性

使用Pascal來命名屬性.

可以考慮把屬性命名和其類型一樣。當(dāng)屬性名和一個(gè)類型名一樣時(shí),那么一定要讓這個(gè)屬性

就是這個(gè)類型。雖然這聽起來有點(diǎn)多余,但這是正確的。以下例子說明了正確的屬性命名方

法.

publicenumColor{...}

publicclassControl{

publicColorColor{get{...}set{...}}

)

以下是錯(cuò)誤的命名

publicenumColor{...}

publicclassControl{

publicintColor{get{...}set{...}}

)

在錯(cuò)誤的例子中,Color枚舉的成員不可能被引用到,因?yàn)镃olor.xxx的COLOR將被解

釋為Color(Int)屬性,系統(tǒng)將會(huì)到System.Int32中的實(shí)例中去訪問成員。.

2.5.8事件命名指南

使用事件EventHandler來命名HANDLER(代理類型)。如

publicdelegatevoidMouseEventHandler(objectsender,MouseEventArgse);

兩個(gè)參數(shù)取名叫sender和e.

sender參數(shù)表示觸發(fā)時(shí)間的對象。sender都是object類型,就算是它可以是更明確的類型。

與事件關(guān)聯(lián)的狀態(tài)被封裝到一個(gè)事件類的實(shí)例中e中.對它應(yīng)該使用適當(dāng)明確的事件類型。如

publicdelegatevoidMouseEventHandler(objectsender,MouseEvente);

使用EventArgs后綴來命名事件的參數(shù),如

publicclassMouseEventArgs:EventArgs{

intx;

inty;

publicMouseEventArgs(intx,inty){

this.x=x;

this.y=y;

)

publicintX{get{returnx;}}

publicintY{get{returny;}}

)

使用現(xiàn)在時(shí)態(tài)和過去時(shí)態(tài)來命名有“前"、“后"概念的事件。(不要使用BeforeXxxXAfterXxx).

如,一個(gè)可以取消的關(guān)閉事件可以表示為Closing和Closedevent.

考慮使用動(dòng)詞來命名事件

2.6大小寫敏感

不要出現(xiàn)必須要大小寫敏感支持的名字.組件應(yīng)該在無論大小寫敏感或不敏感的語言中都能使

用。因?yàn)樾枰笮懨舾械恼Z言不能識別兩個(gè)一樣內(nèi)容但用大小寫區(qū)分的名字,所以組件

必須防止這種情況

不要出現(xiàn)兩個(gè)只用大小寫區(qū)分的命名空間,如

namespaceee.cummings;

namespaceEe.Cummings;

不要出現(xiàn)兩個(gè)只用大小寫區(qū)分的參數(shù)如.

voidfoo(stringa,stringA)

不要出現(xiàn)只用大小寫區(qū)分的同一命名空間的類型

System.WinForms.Pointp;

System.WinForms.POINTpp;

不要出現(xiàn)只用大小寫區(qū)分的同一類型屬性。

intFoo{get,set};

intFOO{get,set}

不要出現(xiàn)兩個(gè)只用大小寫區(qū)分的方法

voidfoo();

voidFoo();

3程序注釋標(biāo)準(zhǔn)

要使程序易于理解,注釋十分重要。在此,提供根本的注釋編寫標(biāo)準(zhǔn)。

3.1注釋編寫準(zhǔn)那么

?將注釋與注釋分隔符用一個(gè)空格分開。

?不允許給注釋加外框。

?邊寫代碼邊注釋,修改代碼同時(shí)修改相應(yīng)的注釋,以保證注釋與代碼的一致性。

不再有用的注釋要?jiǎng)h除。

?注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。

?防止在注釋中使用縮寫,特別是非常用縮寫。

?注釋應(yīng)與其描述的代碼相近,對代碼的注釋應(yīng)放在其上方或右方(對單條語句

的注釋〕相鄰位置,不可放在下面,如放于上方那么需與其上面的代碼用空行隔開。

變量注釋和變量在同一行,所有注釋必須對齊,與變量分開至少兩個(gè)Tab鍵。程序

段或語句的注釋在程序段或語句的上一行。

?注釋與所描述內(nèi)容進(jìn)展同樣的縮排。

?重要變量必須有注釋。

?典型算法必須有注釋。

?在循環(huán)和邏輯分支的地方必須寫上注釋。

?防止在一行代碼或表達(dá)式的中間插入注釋。

?在代碼交付之前,必須刪掉臨時(shí)的或無關(guān)的注釋。

3.2模塊注釋

在一個(gè)程序模塊的開場,應(yīng)用注釋說明模塊的名字、功能、開發(fā)者和日期和版本變更歷史,

如下所示:

//-------------------------------------------------------------------------------

//Name:ChargeUser

//Function:Chargecreditsfromtheuseraccountandsaveittotheuser「saccount

//Author:AuthorName

//Date:Aug.8,2000

//-------------------------------------------------------------------------------

//ChangeHistory:

//DateWhoChangesMade

//-------------------------------------------------------------------------------

//2000-5-1Author1Initialcreation

//2000-5-15Author!AddbStatusvariabletoidentifyUserysstate

//2000-7-3Author3AddCheckBlackList()tocheckwhetheruser

//isinblacklist

//-------------------------------------------------------------------------------

3.3類的注釋

在定義一個(gè)類之前,應(yīng)用“///〃注釋說明類的功能、使用方法和特殊的屬性,如下所示:

〃/〈summary〉

IIIThisclasscontainsthebusinessfacadefortheordersystem.

///<remarks>

IIIThebusinessfacadeisusedtoprovideasimplifiedinterfaceintothe

IIIordersubsystems.

///</remarks>

III

///<remarks>

IIIThisclassismarkedasMarshalByRefObjecttosupportremoted

scenarios.

///</remarks>

///</summary>

publicclassOrderSystem:MarshalByRefObject

(

)

須注意的是,我們要遵從VS.NET對注釋的約定,使用〈summary〉標(biāo)記來指定類總體注釋的

開場,用〈/summary,標(biāo)記它的完畢。對類的一些注講解明可以放在〈remarks〉和</remarks>

對中。以后我們可以從這些注解自動(dòng)得到對代碼的說明文檔。如下例所示:

Duwamish7.BusinessFacade.OrderSystemClass

Thisclasscontainsthebusinessfacadefortheordersystem.Thebusinessfacadeisusedto

provideasimplifiedinterfaceintotheordersubsystems.Thisclassismarkedas

MarshalByRefObjecttosupportremotedscenarios.

Access:Public

BaseClasses:MarshalByRefObject

MembersDescription

Fillsintheordersummarydataforanorder.

Theorderthatisbeingworkedon.Updated

OrderDataobject.Thisisreturnedtosupport

GetO「de「Summd「y

theremotedscenario(OrderDataisa

MarshalByValueobject).class='System.

ApplicationException'>Theorderisnull.

Addanorderandreturnthetransactionid.The

orderthatisbeingworkedon.Theorderthat

AddOrder

hasjustbeenadded.class='System.

ApplicationException'>Theorderisnull.

Remarks:

Thebusinessfacadeisusedtoprovideasimplifiedinterfaceintotheordersubsystems.

ThisclassismarkedasMarshalByRefObjecttosupportremotedscenarios.

3.4類成員方法的注釋

在定義類成員方法前,應(yīng)說明該過程/函數(shù)的名字、功能、輸入/輸出和版本變更歷史,如下

所示:

〃/〈summary〉

IIIFillsintheordersummarydataforanorder.

///<paramname="ordern>Theorderthatisbeingworkedon.</param>

III<retvalue>UpdatedOrderDataobject.

///<remarks>

IIIThisisreturnedtosupporttheremotedscenario(OrderDataisa

IIIMarshalByValueobject).

///</remarks>

///</retvalue>

///</summary>

//——

//ChangeHistory:

//DateWhoChangesMade

//2000-5-1Author1Initialcreation

//2000-5-15Author2AddbStatusvariabletoidentifyUser「sstate

publicOrderDataGetOrderSummary(OrderDataorder)

(

)

在這里“<paramname="(參數(shù)名>">"和"</param>”指明方法的參數(shù)的描述信

息;"<retvalue>"和“</retvalue>"對說明了方法返回值的特性。

由這些注解自動(dòng)得到的說明文檔如下所示:

Duwamish7.BusinessFacade.OrderSystem.GetOrderSum

maryFunction

Fillsintheordersummarydataforanorder.Theorderthatisbeingworkedon.UpdatedOrderData

object.Thisisreturnedtosupporttheremotedscenario(OrderDataisaMarshalByValueobject).

PublicOrderDataGetOrderSummary(OrderData)

FTypeNameDescription

OrderDataorderTheorderthatisbeingworkedon.

rReturn

OrderData

Remarks:

Thisisreturnedtosupporttheremotedscenario(OrderDataisaMarshalByValueobject).

3.5類成員屬性、常量、變量的注釋

在定義類成員屬性前,應(yīng)描述該屬性,如:

///<summary>

〃/檔案編號

///</summary>

publicStringDonorlD;

對于模塊級的常量、變量應(yīng)該象類成員屬性一樣寫注釋。

3.6程序注釋

在代碼實(shí)現(xiàn)時(shí),應(yīng)對其目的和實(shí)現(xiàn)的功能進(jìn)展說明,其要點(diǎn)是:

(1)采用了特殊的語法需要對語法注釋;

(2)為實(shí)現(xiàn)局部功能需要注釋;

(3)不能通過上下文立即明白其功能需要注釋。

如下例所示:

publicOrderDataGetOrderSummary(OrderDataorder)

(

//

//Checkpreconditions

//

ApplicationAssert.CheckCondition(order!=null,"Orderisrequired",

ApplicationAssert.LineNumber);

//

//CalculatesubTotal

//

DecimalsubTotal=0;

4代碼書寫標(biāo)準(zhǔn)

4.1排版標(biāo)準(zhǔn)

?程序塊要采用縮進(jìn)風(fēng)格編寫,在某些情況下,代碼需要有適當(dāng)?shù)目s進(jìn),縮進(jìn)的

空格數(shù)為4個(gè)。

說明:對于由開發(fā)工具自動(dòng)生成的代碼可以有不一致。

?相對獨(dú)立的程序塊之間、變量說明之后必須加空行。

例如:如下例子不符合標(biāo)準(zhǔn)。

if(isValid)

{

...//programcode

)

Testt=newTest();

應(yīng)如下書寫

if(isValid)

(

...//programcode

)

Testt=newTest();

?較長的語句〔>80字符)要分成多行書寫,長表達(dá)式要在低優(yōu)先級操作符處劃

分新行,操作符放在新行之首,劃分出的新行要進(jìn)展適當(dāng)?shù)目s進(jìn),使排版整齊,

語句可讀。

例如:

inttest=aaaaaaaaaaaaaa

+bbbbbbbbbbbbbbb;

?循環(huán)、判斷等語句中假設(shè)有較長的表達(dá)式或語句,那么要進(jìn)展適應(yīng)的劃分,長

表達(dá)式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。

例如:

if((test<MAX_TEST_NUMBER)

&&(IsValidMethod(testBool)))

(

...//programcode

)

for(i=0,j=0;(i<MAX_TEST_NUMBER)

&&(j<test.length);i++,j++)

(

...//programcode

)

?假設(shè)方法的參數(shù)較長,那么要進(jìn)展適當(dāng)?shù)膭澐帧?/p>

例如:

publicvoidTestMethod(stringa,stringb,stringc,

stringd,stringe);

?不允許把多個(gè)短語句寫在一行中,即一行只寫一條語句。

例如:如下例子不符合標(biāo)準(zhǔn)。

rect.length=0;rect.width=0;

應(yīng)如下書寫

rect.length=0;

rect.width=0;

?if>for>do、while>case>switch>default等語句自占一行,且if、for>do>while

等語句的執(zhí)行語句局部無論多少都要加括號{}O

例如:如下例子不符合標(biāo)準(zhǔn)。

if(user==NULL)return;

應(yīng)如下書寫:

if(user二NULL)

{

return;

)

?對齊只使用空格鍵,不使用TAB鍵。

說明:以免用不同的編輯器閱讀程序時(shí),因TAB鍵所設(shè)置的空格數(shù)目不同而造成程

序布局不整齊。

?方法的開場、構(gòu)造的定義及循環(huán)、判斷等語句中的代碼都要采用縮進(jìn)風(fēng)格,case

語句下的情況處理語句也要遵從語句縮進(jìn)要求。

例如:

publicvoidTestMethodQ

(

…〃programcode

)

?程序塊的分界符〔如大括號'{'和'}')應(yīng)各獨(dú)占一行并且位于同一列,同時(shí)與引

用它們的語句左對齊。在函數(shù)體的開場、類的定義、構(gòu)造的定義、枚舉的定義

以及if、for、do、while、switch>case語句中的程序都要采用如上的縮進(jìn)方式。

例如:如下例子不符合標(biāo)準(zhǔn)。

for(...){

...//programcode

)

if(-)

{

...//programcode

)

voidTestMethod()

...//programcode

應(yīng)如下書寫。

for(...)

...//programcode

)

if(-)

{

...//programcode

}

voidTestMethod()

{

...//programcode

)

?在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)展對等操作時(shí),它們之間的操作符之前、

之后或者前后要加空格。

說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。

由于留空格所產(chǎn)生的清晰性是相對的,所以,在已經(jīng)非常清晰的語句中沒有必要再留

空格,如果語句已足夠清晰那么括號內(nèi)側(cè)(即左括號后面和右括號前面)不需要加空格,

多重括號間不必加空格,因?yàn)槔ㄌ栆呀?jīng)是最清晰的標(biāo)志了。

在長語句中,如果需要加的空格非常多,那么應(yīng)該保持整體清晰,而在局部不加空格。

給操作符留空格時(shí)不要連續(xù)留兩個(gè)以上空格。

例如:

(1)逗號、分號只在后面加空格。

inta,b,c;

(2)比擬操作符,賦值操作符"=”、"+二”,算術(shù)操作符"+“、“%”,邏輯操作符"

位操作符“<<“、“人”等雙目操作符的前后加空格。

if(i>=VALUE)

a=b+c;

a+二2;

a二b八2;

(3)"!"、等單目操作符前后不加空格。

flag=iisEmpty;//非操作"!"與內(nèi)容之間

i++;〃"++”,"」與內(nèi)容之間

(4)if、for、while、switch等與后面的括號間應(yīng)加空格,使if等關(guān)鍵字更為突出、明

顯。

if(a>=b&&c>d)

?一行程序以小于80字符為宜,不要寫得過長。

?成員比擬多、代碼量較大的類中,為了使代碼更容易閱讀,應(yīng)適當(dāng)使用

#region...#endregion將同類型的代碼加以分隔顯示或隱藏。

例如:

ttregion屬性

...//programcode

ttendregion

ttregion私有方法

...//programcode

ttendregion

5類成員使用標(biāo)準(zhǔn)

5.1屬性使用指南

使用Pascal風(fēng)格來命名屬性

publicclassFoo{

publicColorBackColor{}

)

不要使用匈牙利命名法.

建議不要使用一樣的類的屬性名字和類型名字.

將一個(gè)類的屬性名定義成與某個(gè)類型(Type)的名字一樣會(huì)在某些編程語言中引起二義性.

最好防止這種二義性除非由非常正當(dāng)?shù)睦碛扇ミ@么做。

例如:System.Windows.Forms類有一個(gè)Icon屬性,雖然也有一個(gè)Icon類但由于Form.Icon

這個(gè)名字比Form.Formlcon或Form.Displaylcon這樣的類屬性名更容易理解,所以我們?nèi)圆?/p>

用Icon屬性名.但是在System.WinForms.ULControl類中有一個(gè)顏色屬性.由于已經(jīng)有了一

個(gè)Color類,這個(gè)類的顏色屬性就被命名為BackgroundColor.這是一個(gè)更有意義的命名且

與已經(jīng)存在的類的名字不沖突.

當(dāng)對一個(gè)類中屬性作賦值操作時(shí)發(fā)生了異常(Exception)時(shí),一定要保證這個(gè)屬性中還保存著以前

保存的屬性值。防止這個(gè)屬性的內(nèi)容處于不確定狀態(tài).

必須允許類的屬性可以以任意的順序賦值.屬性與其他屬性間應(yīng)該是沒有狀態(tài)關(guān)系的.

通常情況下只有當(dāng)程序?qū)σ唤M屬性作了賦值之后,這個(gè)對象的某個(gè)功能才會(huì)被激活,或者只

有當(dāng)這個(gè)對象在一些正確的狀態(tài)下,這個(gè)功能才會(huì)起作用.而且當(dāng)對象進(jìn)入此狀態(tài)時(shí),這個(gè)

功能會(huì)被自動(dòng)激活而無需任何其他的顯示(Implicit)調(diào)用.

例如一個(gè)TextBox有兩個(gè)相關(guān)的屬性:DataSource和DataField.DataSource指明了數(shù)據(jù)表名,

而DataField指明了相應(yīng)的類屬性名.一旦這兩個(gè)屬性被指明后,這個(gè)控件就會(huì)把數(shù)據(jù)表中

相應(yīng)的數(shù)據(jù)取出賦給這個(gè)控件的Text屬性.下面的例子演示了我們可以以任意的順序設(shè)置

控件的屬性.

TextBoxt=newTextBoxQ;

t.DataSource="Publishers'1;

t.DataField=nAuthorID";

//Thedatabindingfeatureisnowactive.

上面的代碼是與下面的程序等效的.

TextBoxt=newTextBoxQ;

t.DataField="AuthorlD";

t.DataSource="Publishers";

//Thedatabindingfeatureisnowactive.

止匕外,程序員可以將一個(gè)屬性設(shè)為null,指明這個(gè)屬性是未賦值的.

TextBoxt=newTextBoxQ;

t.DataField="AuthorlD";

t.DataSource="Publishers";

//Thedatabindingfeaturenowactive

t.DataSource=null;

//Thedatabindingfeatureisnowinactive

下面的例子演示了如何做到對屬性的賦值順序復(fù)關(guān),并檢查數(shù)據(jù)綁定的狀態(tài)并在適當(dāng)?shù)臅r(shí)候

自動(dòng)激活相應(yīng)的功能.

publicclassTextBox{

stringdataSource;

stringdataField;

booleanactive;

publicstringDataSource{

get(

returndataSource;

)

set{

if(value!=dataSource){

//Updateactivestate.

SetActive(value!=null&&dataField!=null);

dataSource=value;

publicstringDataField{

get(

returndataField;

)

set{

if(value!=dataField){

//Updateactivestate.

SetActive(dataSource!=null&&dataField!=null);

dataField=value;

voidSetActive(booleanvalue){

if(value!=active){

if(value){

Activate();

Text=dataBase.Value(dataField);

}

else{

Deactivate();

Text="";

)

active=value;//setactiveonlyifsuccess

)

)

voidActivate(){

//opendatabase

voidDeactivate(){

//closedatabase

}

)

5.1.1只讀和只寫的屬性

當(dāng)在邏輯上要求用戶不能改變類的屬性時(shí),需要使用只讀屬性.

制止使用只寫屬性.

5.2事件使用指南

使用Pascal風(fēng)格來命名事件.

不要使用匈牙利命名法.

應(yīng)該使用"raise"("產(chǎn)生")術(shù)語來表示產(chǎn)生事件而不是使用"fire"或"trigger".

當(dāng)在文檔中描述事件時(shí),應(yīng)該使用"aneventwasraised"而不是"aneventwasfired"或"an

eventwastriggered."

應(yīng)考慮用動(dòng)詞來命名一個(gè)事件.

事件處理程序應(yīng)返回void值.例如:

publicdelegatevoidMouseEventHandler(objectsender,MouseEventArgse);

因該從System.EventArgs類中派生出事件處理數(shù)據(jù)類。例如:

publicclassMouseEventArgs:EventArgs{

)

應(yīng)該假謾在事件處理過程中會(huì)發(fā)生任何事情(要注意異常處理).

類應(yīng)該準(zhǔn)備事件處理過程會(huì)修改任何的事物,而且需要保證在事件被生成時(shí)所有的對象都處

于一個(gè)合法的狀態(tài).應(yīng)該考慮使用try/finally程序塊在事件產(chǎn)生的地方.由于程序員調(diào)用了

callback函數(shù)在這個(gè)對象上執(zhí)行操作,就不應(yīng)該在程序控制返回后對程序狀態(tài)做任何假設(shè).

例如:

publicclassButton{

ButtonClickHandleronClickHandler;

protectedvoidDoClick(){

PaintDownf);//paintbuttonindepressedstate

try(

OnClick();//calleventhandler

)

finally{

//windowmaybedeletedineventhandler

if(windowHandle!=null){

PaintUpO;//paintbuttoninnormalstate

)

}

)

溫馨提示

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

最新文檔

評論

0/150

提交評論