版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,net开发标准
目录
1.概述3
2.命名标准3
2.1指导性原那么3
2.1.1使用正确的大小写风格3
2.1.2使用描述性英文名称3
2.1.3使用易读的名称4
2.1.4尽量防止在名称中使用编码4
2.1.5同义词中使用固定的单词4
2.1.6保持词义的前后一致4
2.1.7名词和动词的选用5
2」.8使用计算机专业术语5
2.1.9必要时可使用业务术语5
2.1.10防止误导5
2.1.11名词需要语境说明5
2.1.12不要添加人为的语境6
2.1.13防止名称差异不明显造成混淆6
2.2大写风格6
2.2.1Pascal风格6
2.2.2Camel风格7
2.2.3大写风格7
224大写小结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静态类属性名11
2.5.5参数名11
2.5.6方法命名指南11
257属性命名指南11
2.5.8事件命名指南12
2.6大小写敏感12
3.程序注释标准13
3.1注释编写准那么13
3.2模块注释13
3.3类的注释14
3.4类成员方法的注释15
3.5类成员属性、常量、变量的注释16
3.6程序注释16
4.代码书写标准17
4.1排版标准17
5.类成员使用标准20
5.1属性使用指南20
5.1.1只读和只写的属性22
5.2事件使用指南22
5.3方法使用指南23
5.3.1方法重载指南23
5.4构建函数使用指南24
5.5类的成员变量使用指南24
5.6参数名称指南25
6.类型使用指南26
6.1类使用指南26
6.1.1基类使用指南26
6.2值类型使用指南27
6.2.1构造使用指南27
6.2.2枚举使用指南27
6.3程序代理使用指南28
6.4程序属性(ATTRIBUTE)的使用29
7.异常的产生和处理29
7.1标准异常类型31
7.2异常的包装WRAPPINGEXCEPTIONS32
8.数组使用指南32
8.1数组vs.集合32
8.1.1集合33
8.1.2集合中可索引的属性33
8.1.3数组值属性33
8.2返回空数组33
9.数据库设计开发标准错误!未定义书签。
9.1命名标准错误!未定义书签。
9.2字段设计要求错误!未定义书签。
9.3视图使用原那么错误!未定义书签。
9.4存储过程建立规那么错误!未定义书签。
9.5函数建立规那么错误!未定义书签。
9.6触发器使用要求错误!未定义书签。
1概述
在建立过程中,将涉及到在新的VisualStudio.NET以及.NETFramework平台上的开
发工作。同时,设计人员、开发人员和测试人员较多。为了使应用程序的构造和编码风格标
准化,便于阅读和理解编码,以提高开发效率和产品的标准化,制订一套开发标准和标准势
在必行。此外,好的编码约定可使源代码严谨、可读性强且意义清楚,与其它语言约定相一
致,并且尽可能的直观。希望开发人员严格遵守此套开发标准和标准,并落实到自己的程序
中。
一组通用目的的编码约定应该定义完成上述目的所必需的、能让程序员自由地创立程序
逻辑和功能流程的最小的要求。最小编码约定的目的是使程序易于阅读和理解,从而指导程
序员更好地完成开发任务。
本标准主要针对使用VisualStudio.NET以及.NETFramework开发的基于Web的应用
系统。
2命名标准
2.1指导性原那么
命名是编程的核心。能够对变量和函数/过程进展表意清晰而准确的命名,就能使程序
的可读性大大提高,到达不说自明的效果。真正的名称是深入认真思考一个对象的生态环境
后才能给出的。程序设计人员只有在充分理解并把握整个系统时,才可能给出真正适宜的名
字。如果名称选用恰当,一切就显得很自然,各局部关系清晰,意义可以推导而出,阅读程
序时可以按常识推理,从而减小程序员对已有程序的阅读和理解困难,提高工作效率,使新
程序员能在尽量短的时间内进入角色。
以下章节描述了程序命名的一些指导性原那么。
2.1.1使用正确的大小写风格
为保证良好的程序可读性,对命名的大小写必须按照一致的规定编写,主要包括Pascal
风格和Camel风格两种,下面将会有专门的章节进展详细说明。
2.1.2使用描述性英文名称
为保证程序的可读性,要采用准确描述其意义的名字。英语是国际通用语言,绝大多数
商业类库或函数库代码都是由英语编写的。要与标准接轨,充分利用网上的程序资源,应尽
量使用英语命名。
2.1.3使用易读的名称
如果不可读或不易读,那么不便于讨论和交流。因此我们要尽量使用群众化名称,防止
使用不常用的单词。
2.1.4尽量防止在名称中使用编码
对名称使用编码就需解码才能理解。少数几个前缀字母有助于区分名称类别。但为了追
求风格而过分使用前缀和后缀就会造成生涩难懂的名字。例如SRD2T3。含有编码的名称一
般都没有可读性。当然,任何编码,只要科学,时间久了都能被掌握。但是,掌握编码需要
新成员的额外精力,增加了适应难度,因此应尽量防止。
2.1.5同义词中使用固定的单词
首先,我们应尽量使用英语词汇,因为汉语拼音实际上也是一种名称编码,特别是使用
拼音首字母,即使是懂汉语拼音的人也未必能理解。有了用英语命名的前提,我们还应该注
意:一个抽象概念可能有多个表述同义词,选择一个,始终如一。如对同一动作,在不同类
中选用不同的名称,比方,fetch,retrieve和get,那么,使用你的类从事编程的人就要多费
很多精力去理解它们。也就是说,我们应该通过使用一致的名称,创立统一的编程接口,简
化学习的难度。
2.1.6保持词义的前后一致
多数词都有不止一个意思,但在同一个系统中,应始终保持同一个意思。这和前面的原
那么是相对应的。使用不同的词汇,使人联想不同的接口和/或操作。同样,使用同样的词
汇,使人联想一样的接口和/或操作。如果我学过使用DeviceManager::add(),我就会期望可
以使用ProtocolManager::add().这是根据名称产生的联想,甚至连想到可以使用
*Manager::add()o要保证这种联想能成立,前后词义必须一致。如果自己设■一■个系统,要
尽量做到保持词义的一致。记住,在两个完全不同的范畴内使用一样的名字是很不可取的。
2.1.7名词和动词的选用
类和对象应当使用名词或名词短语命名。方法中强调过程用动词,返回值用名词。作为
一名设计人员,可能不太在意这些命名的琐事。尝试使用你设计的类去编写一段用户程序,
看看有多少别扭或混乱的地方,一定可以反过来有助你改良设计。
2.1.8使用计算机专业术语
尽量使用约定成俗的惯用语、计算机科学术语、算法名称、设计模式名称、数学名词等
软件编程相关名词。这样似乎有点异端,但这总好过让程序员费力找客户弄清楚自己原本清
楚的概念,只是由于名称的不同使他们疑惑。我们是讲编码标准,程序员大多数是计算机专
业的,或对计算机专业已有了深入了解的。很少最终用户会阅读程序,即使有,也是有相当
计算机软件功底的。相反,程序维护人员必须阅读程序,所以应尽可能使用计算机术语。如:
运用工厂模式类的命名应该是“名词+Factory〃。
2.1.9必要时可使用业务术语
如果工作的重点不在程序本身,或问题的描述比问题的解决更重要,可使用业务术语。
在分析阶段,使用业务术语比使用计算机术语更好,因为容易被客户理解和承受。
2.1.10防止误导
防止使用已有其它明确意义的名词。例如,"hp","aix",和"sco”被用作UNIX平台及
其变种的名称,如果再用来作为变量或函数名称就很有问题,会引起误解。即使你在解决的
问题用"hp"是很好的缩写也不应使用“hp”。
2.1.11名词需要语境说明
只有少数情况下,孤立的一个名字有明确含义。多数情况下,名称需要置于一定的语境
中才有意义。比方,在类中,函数中或注释中。换句话说,在面向对象的语言中,在类属性
的名称中包含类名是多余的。例如,不应该使用Book.BookTitle,而应该使用Book.Titleo
Company.address_和Customer.address」同样都是address,但仅在语境中才有意义,以
下的命名是不可取的:Company.companyAddress_,Customer.customerAddress_o
2.1.12不要添加人为的语境
不要在类的前面冠以公司名缩写、工程名称缩写或其他标志性前缀。例如,在做知识管
理系统时,把员工类命名成KmsUser。以上命名法是不可取的,这样势必造成代码重复,影
响代码的重用。如使用同一个类,那么KmsUser在其他系统中就显得不和谐了。
2.1.13防止名称差异不明显造成混淆
这个问题源于编写程序仅仅是为了能编译通过或能解译执行o编译和解译程序不允许在
同一域内用一样的名字指称两个东西。所以,遇到编译问题时,就随便将其中的一个改变一
下。更糟糕的是,原本同一个名称,因拼写错误变成两个名称。这里要说的关键问题是,如
果要区分两样不同的东西,一定要保证名称有实质性的差异。例如,假设将一个类命名成
Product,另一个类命名成ProductInfo或ProductData,就会因差异不明显造成混淆。因为Info
和Data没有具体的意思。同理,不要在00编程中使用Class或Object作为名称的一局部。
CustomerObject和Customer有什么区别?NameString比Name好吗?难道一个Name还
会是浮点数或整数不成?特别要强调的是,对于大小写敏感的编程环境,我们不要使用仅有
大小写区别的名字。例如,Customer,customer不应作为两个名字。
2.2大写风格
以下章节描述了不同方式的大写方式.这些术语将在通篇文档中被经常引用.
2.2.1Pascal风格
这种风格大写每个单词的首字母
BackColor
应在所有由多单词组成的公共描述符中使用这种方式.举例而言,使用TextColor就比
Textcolor或Textcolor更好.
注意不要大写“连接词"(一个单词中包含了几个单词,但这个单词本身有自己的意
思,如Checkbook)每个组合单词的首字母。应该将这个单词作为一个单词来考虑,而非几
个单词的组合。使用词典决定一个组合词是不是应该作为一个单词来使用。
2.2.2Camel风格
这种风格除了第一个单词的首字母,其他单词都应大写首字母,如下所示
backColor
在局部变量参数名或私有类属性名称上使用camel风格。
2.2.3大写风格
只在少于两个字母的缩写中使用大写。三个以上字母的缩写都应该使用PASCAL风格。举
例而言
System.IO
System.Web.UI
System.CodeDom
一个另外的情形是和原有的未管理的标志兼容,而原来常用大写来表示枚举和常量。通常这
些标志符不应该暴露给外部。
2.2.4大写小结
下表描述了不同类型的描述符该怎么使用大小写
类型风格备注
ClassPascal风格
EnumerationvaluePascal风格
EnumerationtypePascal风格
EventPascal风格
ExceptionclassPascal风格用后缀Exception.
Read-onlystaticfieldPascal风格
InterfacePascal风格用前缀I.
MethodPascal风格
NamespacePascal风格
PropertyPascal风格
PublicinstancefieldPascal风格很少使用,更多使用properties.
Protectedinstancefieldcamel风格很少使用,更多使用properties.
Parametercamel风格
2.3单词选择
不要使用常用的命名空间的名字做类名,举例而言不要使用以下任何单词做类名
System
Collections
Forms
UI
不要使用和以下关键字冲突的识别符,举例而言,防止这样使用:
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、请不要使用使用不被广泛认可的缩写。
3、只有绝对需要时再使用广为人知的缩写。可以使用UI来表示UserInterface,用OLAP
来表示OnTineAnalyticalProcessing.
4、当使用缩写时,请使用Pascal风格或camel风格来表示超过两个或以上单词缩写的构成。
如用HtmlButton而非HTMLButton,但不要用System.Io来取代System.10
2.4命名空间
以下模板举例说明了命名空间的命名规那么。
<Company>.<Technology>[.<Feature>][.Design]
因此我们希望看到这样如下命名空间:
Microsoft.Media
Microsoft.Media.Design
PowerSoft.PowerBuilder.Math
1、防止两个PUBLISED的NAMESPACES名称一样的可能。使用公司名称或者一个正式分支的
名称如用Microsoft.Office来表示Microsoft提供的OfficeAutomationClasseso
2、使用一个稳定的被广泛认可的技术名称作为第二层名称
3、不要使用组织的构造层次作为命名空间的层次依据
4、请在DESIGN-TIME命名空间前加上.Design前缀以表示根底命名空间DESIGN-TIME特
性。如System.Windows.Forms.Design包含了用来设计System.Windows.Forms应用
程序的的设计器和相关设计类。
5、使用PASCAL风格,把每个逻辑部件用分隔号分开(如Microsoft.Office.PowerPoint_)
如果你的品牌采用了非传统方式的命名,那么就延续的你的品牌的命名方式,就算他和通常
的命名空间法那么不同。如(NeXT.WebObjects,andee.cummings)
6、在适当的地方使用复数命名。例如采用System.Collections而非System.Collection。
对此例外的是品牌名和缩写。如用System.10而非System.10s。
7、不要让命名空间和类都使用同样的名字。如,当有个类叫Debug时就不要使用Debug
来作为命名空间的名字。
命名空间构造不需和配件名称构造并行。如,当你决定使用给配件取名叫
MyCompany.MyTechnology.dll时,这并不需要你得让配件中包含一个叫
MyCompany.MyTechnology的命名空间。
2.5类和类成员
2.5.1类的命名指南
1、使用名词或名词短语命名类。
2、使用Pascal风格
3、慎重使用缩写命名类。
4、不要使用任何类前缀(如C)
5、不要使用强调符号。
6、偶尔可能会出现已I作为类名开头的情况,而这个类又不是一个接口类。这种情况下只
要第二个字母是小写就可以承受。如IdentityStore.
7、建议使用组合词来命名派生类。在此情况下,你应该考虑使用基类名称作为派生类名称
的结尾。举例而言,在英语中的〃CoffeeCup”是说的一种杯子,而不是一种咖啡。又如
ApplicationException表示一种例外,而BooleanSwicth表示一种
Switch,SerializableAtrribute是一种属性。但对此应该合理的判断,如Button是一种
Control虽然Control并没有出现在名字中。
以下是一些正确的命名的例子
publicclassFileStream{
}
publicclassButton{
}
publicclassString{
}
2.5.2Attribute命名指南
在自定义属性类的后边应该加上Attribute作为后缀。
publicclassObsoleteAttribute:Attribute{
)
2.5.3枚举命名指南
1、使用Pascal风格来命名枚举类型.
2、使用Pascal风格命名枚举值.
3、不要使用简写来命名枚举值.
•不要在枚举前加前缀(如adXXX来命名ADOenums,rtfXXX来命名richtext
enums,等.).
•不要使用在枚举上加后缀
・使用单数来命名枚举,除非它是一个BIT类属性.
•使用复数来命名BIT类属性。
2.5.4静态类属性名
1、使用名词,名词短语或简写来命名静态类属性
2、使用PASCAL风格来命名静态类属性
不要使用匈牙利命名法来命名静态类属性名称
2.5.5参数名
使用有意义的参数名.在所有场合,参数名称和类型应该清楚地描述以决定其反映的意义..
使用camel风格来命名参数
使用名称来表现其作用而非表现其类型.我们期望开发工具能提供有效的方式来提供类型信息.因
此参数名可被更好的用来表现其作用而非类型.偶尔使用基于类型的参数名是完全适当的.
不要使用reserved参数。在下个版本中需要更多的数据那么就使用重载。.
请不要使用匈牙利命名法来在名称前加前缀
TypeGetType(stringtypeName)
stringFormat(stringformat,object[]args)
2.5.6方法命名指南
使用动词或动词短语来命名方法。
使用Pascal风格来命名方法.如
RemoveAll()
GetCharArrayO
Invoke()
2.5.7属性命名指南
使用名词或名词短语来命名属性
使用Pascal来命名属性.
可以考虑把属性命名和其类型一样。当属性名和一个类型名一样时,那么一定要让这个属性
就是这个类型。虽然这听起来有点多余,但这是正确的。以下例子说明了正确的属性命名方
法.
publicenumColor{...}
publicclassControl{
publicColorColor{get{...}set{...}}
)
以下是错误的命名
publicenumColor{...}
publicclassControl{
publicintColor{get{...}set{...}}
)
在错误的例子中,Color枚举的成员不可能被引用到,因为Color.xxx的COLOR将被解
释为Color(Int)属性,系统将会到System.Int32中的实例中去访问成员。.
2.5.8事件命名指南
使用事件EventHandler来命名HANDLER(代理类型)。如
publicdelegatevoidMouseEventHandler(objectsender,MouseEventArgse);
两个参数取名叫sender和e.
sender参数表示触发时间的对象。sender都是object类型,就算是它可以是更明确的类型。
与事件关联的状态被封装到一个事件类的实例中e中.对它应该使用适当明确的事件类型。如
publicdelegatevoidMouseEventHandler(objectsender,MouseEvente);
使用EventArgs后缀来命名事件的参数,如
publicclassMouseEventArgs:EventArgs{
intx;
inty;
publicMouseEventArgs(intx,inty){
this.x=x;
this.y=y;
)
publicintX{get{returnx;}}
publicintY{get{returny;}}
)
使用现在时态和过去时态来命名有“前"、“后"概念的事件。(不要使用BeforeXxxXAfterXxx).
如,一个可以取消的关闭事件可以表示为Closing和Closedevent.
考虑使用动词来命名事件
2.6大小写敏感
不要出现必须要大小写敏感支持的名字.组件应该在无论大小写敏感或不敏感的语言中都能使
用。因为需要大小写敏感的语言不能识别两个一样内容但用大小写区分的名字,所以组件
必须防止这种情况
不要出现两个只用大小写区分的命名空间,如
namespaceee.cummings;
namespaceEe.Cummings;
不要出现两个只用大小写区分的参数如.
voidfoo(stringa,stringA)
不要出现只用大小写区分的同一命名空间的类型
System.WinForms.Pointp;
System.WinForms.POINTpp;
不要出现只用大小写区分的同一类型属性。
intFoo{get,set};
intFOO{get,set}
不要出现两个只用大小写区分的方法
voidfoo();
voidFoo();
3程序注释标准
要使程序易于理解,注释十分重要。在此,提供根本的注释编写标准。
3.1注释编写准那么
•将注释与注释分隔符用一个空格分开。
•不允许给注释加外框。
•边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。
不再有用的注释要删除。
•注释的内容要清楚、明了,含义准确,防止注释二义性。
•防止在注释中使用缩写,特别是非常用缩写。
•注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句
的注释〕相邻位置,不可放在下面,如放于上方那么需与其上面的代码用空行隔开。
变量注释和变量在同一行,所有注释必须对齐,与变量分开至少两个Tab键。程序
段或语句的注释在程序段或语句的上一行。
•注释与所描述内容进展同样的缩排。
•重要变量必须有注释。
•典型算法必须有注释。
•在循环和逻辑分支的地方必须写上注释。
•防止在一行代码或表达式的中间插入注释。
•在代码交付之前,必须删掉临时的或无关的注释。
3.2模块注释
在一个程序模块的开场,应用注释说明模块的名字、功能、开发者和日期和版本变更历史,
如下所示:
//-------------------------------------------------------------------------------
//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类的注释
在定义一个类之前,应用“///〃注释说明类的功能、使用方法和特殊的属性,如下所示:
〃/〈summary〉
IIIThisclasscontainsthebusinessfacadefortheordersystem.
///<remarks>
IIIThebusinessfacadeisusedtoprovideasimplifiedinterfaceintothe
IIIordersubsystems.
///</remarks>
III
///<remarks>
IIIThisclassismarkedasMarshalByRefObjecttosupportremoted
scenarios.
///</remarks>
///</summary>
publicclassOrderSystem:MarshalByRefObject
(
)
须注意的是,我们要遵从VS.NET对注释的约定,使用〈summary〉标记来指定类总体注释的
开场,用〈/summary,标记它的完毕。对类的一些注讲解明可以放在〈remarks〉和</remarks>
对中。以后我们可以从这些注解自动得到对代码的说明文档。如下例所示:
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类成员方法的注释
在定义类成员方法前,应说明该过程/函数的名字、功能、输入/输出和版本变更历史,如下
所示:
〃/〈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="(参数名>">"和"</param>”指明方法的参数的描述信
息;"<retvalue>"和“</retvalue>"对说明了方法返回值的特性。
由这些注解自动得到的说明文档如下所示:
Duwamish7.BusinessFacade.OrderSystem.GetOrderSum
maryFunction
Fillsintheordersummarydataforanorder.Theorderthatisbeingworkedon.UpdatedOrderData
object.Thisisreturnedtosupporttheremotedscenario(OrderDataisaMarshalByValueobject).
PublicOrderDataGetOrderSummary(OrderData)
FTypeNameDescription
OrderDataorderTheorderthatisbeingworkedon.
rReturn
OrderData
Remarks:
Thisisreturnedtosupporttheremotedscenario(OrderDataisaMarshalByValueobject).
3.5类成员属性、常量、变量的注释
在定义类成员属性前,应描述该属性,如:
///<summary>
〃/档案编号
///</summary>
publicStringDonorlD;
对于模块级的常量、变量应该象类成员属性一样写注释。
3.6程序注释
在代码实现时,应对其目的和实现的功能进展说明,其要点是:
(1)采用了特殊的语法需要对语法注释;
(2)为实现局部功能需要注释;
(3)不能通过上下文立即明白其功能需要注释。
如下例所示:
publicOrderDataGetOrderSummary(OrderDataorder)
(
//
//Checkpreconditions
//
ApplicationAssert.CheckCondition(order!=null,"Orderisrequired",
ApplicationAssert.LineNumber);
//
//CalculatesubTotal
//
DecimalsubTotal=0;
4代码书写标准
4.1排版标准
•程序块要采用缩进风格编写,在某些情况下,代码需要有适当的缩进,缩进的
空格数为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
•相对独立的程序块之间、变量说明之后必须加空行。
例如:如下例子不符合标准。
if(isValid)
{
...//programcode
)
Testt=newTest();
应如下书写
if(isValid)
(
...//programcode
)
Testt=newTest();
•较长的语句〔>80字符)要分成多行书写,长表达式要在低优先级操作符处划
分新行,操作符放在新行之首,划分出的新行要进展适当的缩进,使排版整齐,
语句可读。
例如:
inttest=aaaaaaaaaaaaaa
+bbbbbbbbbbbbbbb;
•循环、判断等语句中假设有较长的表达式或语句,那么要进展适应的划分,长
表达式要在低优先级操作符处划分新行,操作符放在新行之首。
例如:
if((test<MAX_TEST_NUMBER)
&&(IsValidMethod(testBool)))
(
...//programcode
)
for(i=0,j=0;(i<MAX_TEST_NUMBER)
&&(j<test.length);i++,j++)
(
...//programcode
)
•假设方法的参数较长,那么要进展适当的划分。
例如:
publicvoidTestMethod(stringa,stringb,stringc,
stringd,stringe);
•不允许把多个短语句写在一行中,即一行只写一条语句。
例如:如下例子不符合标准。
rect.length=0;rect.width=0;
应如下书写
rect.length=0;
rect.width=0;
•if>for>do、while>case>switch>default等语句自占一行,且if、for>do>while
等语句的执行语句局部无论多少都要加括号{}O
例如:如下例子不符合标准。
if(user==NULL)return;
应如下书写:
if(user二NULL)
{
return;
)
•对齐只使用空格键,不使用TAB键。
说明:以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程
序布局不整齐。
•方法的开场、构造的定义及循环、判断等语句中的代码都要采用缩进风格,case
语句下的情况处理语句也要遵从语句缩进要求。
例如:
publicvoidTestMethodQ
(
…〃programcode
)
•程序块的分界符〔如大括号'{'和'}')应各独占一行并且位于同一列,同时与引
用它们的语句左对齐。在函数体的开场、类的定义、构造的定义、枚举的定义
以及if、for、do、while、switch>case语句中的程序都要采用如上的缩进方式。
例如:如下例子不符合标准。
for(...){
...//programcode
)
if(-)
{
...//programcode
)
voidTestMethod()
...//programcode
应如下书写。
for(...)
...//programcode
)
if(-)
{
...//programcode
}
voidTestMethod()
{
...//programcode
)
•在两个以上的关键字、变量、常量进展对等操作时,它们之间的操作符之前、
之后或者前后要加空格。
说明:采用这种松散方式编写代码的目的是使代码更加清晰。
由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留
空格,如果语句已足够清晰那么括号内侧(即左括号后面和右括号前面)不需要加空格,
多重括号间不必加空格,因为括号已经是最清晰的标志了。
在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。
给操作符留空格时不要连续留两个以上空格。
例如:
(1)逗号、分号只在后面加空格。
inta,b,c;
(2)比拟操作符,赋值操作符"=”、"+二”,算术操作符"+“、“%”,逻辑操作符"
位操作符“<<“、“人”等双目操作符的前后加空格。
if(i>=VALUE)
a=b+c;
a+二2;
a二b八2;
(3)"!"、等单目操作符前后不加空格。
flag=iisEmpty;//非操作"!"与内容之间
i++;〃"++”,"」与内容之间
(4)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明
显。
if(a>=b&&c>d)
•一行程序以小于80字符为宜,不要写得过长。
•成员比拟多、代码量较大的类中,为了使代码更容易阅读,应适当使用
#region...#endregion将同类型的代码加以分隔显示或隐藏。
例如:
ttregion属性
...//programcode
ttendregion
ttregion私有方法
...//programcode
ttendregion
5类成员使用标准
5.1属性使用指南
使用Pascal风格来命名属性
publicclassFoo{
publicColorBackColor{}
)
不要使用匈牙利命名法.
建议不要使用一样的类的属性名字和类型名字.
将一个类的属性名定义成与某个类型(Type)的名字一样会在某些编程语言中引起二义性.
最好防止这种二义性除非由非常正当的理由去这么做。
例如:System.Windows.Forms类有一个Icon属性,虽然也有一个Icon类但由于Form.Icon
这个名字比Form.Formlcon或Form.Displaylcon这样的类属性名更容易理解,所以我们仍采
用Icon属性名.但是在System.WinForms.ULControl类中有一个颜色属性.由于已经有了一
个Color类,这个类的颜色属性就被命名为BackgroundColor.这是一个更有意义的命名且
与已经存在的类的名字不冲突.
当对一个类中属性作赋值操作时发生了异常(Exception)时,一定要保证这个属性中还保存着以前
保存的属性值。防止这个属性的内容处于不确定状态.
必须允许类的属性可以以任意的顺序赋值.属性与其他属性间应该是没有状态关系的.
通常情况下只有当程序对一组属性作了赋值之后,这个对象的某个功能才会被激活,或者只
有当这个对象在一些正确的状态下,这个功能才会起作用.而且当对象进入此状态时,这个
功能会被自动激活而无需任何其他的显示(Implicit)调用.
例如一个TextBox有两个相关的属性:DataSource和DataField.DataSource指明了数据表名,
而DataField指明了相应的类属性名.一旦这两个属性被指明后,这个控件就会把数据表中
相应的数据取出赋给这个控件的Text属性.下面的例子演示了我们可以以任意的顺序设置
控件的属性.
TextBoxt=newTextBoxQ;
t.DataSource="Publishers'1;
t.DataField=nAuthorID";
//Thedatabindingfeatureisnowactive.
上面的代码是与下面的程序等效的.
TextBoxt=newTextBoxQ;
t.DataField="AuthorlD";
t.DataSource="Publishers";
//Thedatabindingfeatureisnowactive.
止匕外,程序员可以将一个属性设为null,指明这个属性是未赋值的.
TextBoxt=newTextBoxQ;
t.DataField="AuthorlD";
t.DataSource="Publishers";
//Thedatabindingfeaturenowactive
t.DataSource=null;
//Thedatabindingfeatureisnowinactive
下面的例子演示了如何做到对属性的赋值顺序复关,并检查数据绑定的状态并在适当的时候
自动激活相应的功能.
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只读和只写的属性
当在逻辑上要求用户不能改变类的属性时,需要使用只读属性.
制止使用只写属性.
5.2事件使用指南
使用Pascal风格来命名事件.
不要使用匈牙利命名法.
应该使用"raise"("产生")术语来表示产生事件而不是使用"fire"或"trigger".
当在文档中描述事件时,应该使用"aneventwasraised"而不是"aneventwasfired"或"an
eventwastriggered."
应考虑用动词来命名一个事件.
事件处理程序应返回void值.例如:
publicdelegatevoidMouseEventHandler(objectsender,MouseEventArgse);
因该从System.EventArgs类中派生出事件处理数据类。例如:
publicclassMouseEventArgs:EventArgs{
)
应该假谩在事件处理过程中会发生任何事情(要注意异常处理).
类应该准备事件处理过程会修改任何的事物,而且需要保证在事件被生成时所有的对象都处
于一个合法的状态.应该考虑使用try/finally程序块在事件产生的地方.由于程序员调用了
callback函数在这个对象上执行操作,就不应该在程序控制返回后对程序状态做任何假设.
例如:
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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险AI算力协同优化-第11篇
- 2026年武汉市洪山区住房和城乡建设局人员招聘笔试参考题库及答案详解
- 2026年西藏自治区日喀则市住房和城乡建设局人员招聘考试备考试题及答案详解
- 2026年柳河县域外事业单位人才回引考试参考题库及答案详解
- 2026年新疆维吾尔自治区乌鲁木齐市住房和城乡建设局人员招聘笔试备考题库及答案详解
- 2026年佳木斯市东风区住房和城乡建设局人员招聘笔试备考题库及答案详解
- 2026年池州学院管理助理、教学助理岗位招聘7人考试备考试题及答案详解
- 2026年鞍山市千山区住房和城乡建设局人员招聘笔试备考试题及答案详解
- 保险AI算法可解释性提升策略
- 2026年广西壮族自治区南宁市住房和城乡建设局人员招聘笔试参考题库及答案详解
- 中国移动企业文化知识考核题库
- 2025年福华通达“安康杯”安全知识竞赛(题库)及答案
- (2026年)全国高考数学真题试卷(全国一卷)
- 2026-2030全球与中国肺补片市场投资建议及未来趋势深度评估报告
- 工业机器人三维建模253
- 【7语期中】合肥市五十中学2025-2026学年七年级下学期期中考试语文试题
- 北京海淀区2025-2026学年第二学期期中练习高三语文试题及参考答案
- 2026版CSCO卵巢癌诊疗指南总结
- 2026年机动车检验检考核考前冲刺试卷及参考答案详解【黄金题型】
- 2026年高考俄语试题及答案(全国卷)
- (2026年)急性有机磷农药中毒诊治临床专家共识
评论
0/150
提交评论